[DevOps] DevOps - Github Action 실습

// 시나리오 //

1) 개발자가 playbook.yml(deploy.yml) 및 html 코드를 github에 push

2) 작성된 Github Action Flow가 동작
	
3) EC2가 Github Action Flow를 통해 Ansible을 활용하여 Nginx가 설치 및 실행되고, push된 html 코드가 적용

 

 

1) 개발자가 playbook.yml 및 html 코드를 github에 push

playbook.yml 작성

- hosts: ["EC2 IP 주소"]
  tasks:
    - name: Update APT package cache
      apt:
        update_cache: yes
      become: yes
    - name: Install Nginx
      apt:
        name: nginx
        state: present
      become: yes
    - name: Start Nginx service
      systemd:
        name: nginx
        state: started
        enabled: yes

 

test.html 파일 작성

<!DOCTYPE html>
<html>
  <head>
    <title>TEST</title>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  </head>
  <body>
    TEST 1111111111
  </body>
</html>

 

2) 작성된 Github Action Flow가 동작

위와 같은 시나리오를 구현하기 위해 EC2 및 Github Repository를 생성해야한다.

 

1. 깃허브 레포지토리 생성

 

2. AWS EC2 생성 , Ansible 설치 및 인바운드 규칙 편집 (80, 443 포트)

3. EC2 생성시 발급받은 ppk -> pem으로 변환

➡ ppk 파일은 Putty에서 사용할 목적으로 생성한 파일이지만, 깃허브 액션은 리눅스 환경에서 실행되므로, pem 형식의 키를 사용하여 SSH 연결을 설정해주어야 한다.

  1) Puttygen 프로그램 실행

 

    2) Load -> ppk 파일 입력

    3) Conversions 클릭 ➡ Export OpenSSH key 클릭 후 키 저장

4. 사용할 환경변수 등록

  1) 깃허브 레포지토리에서 Settings 클릭

  2) Secrets and variables - Actions 클릭

 

  3) New repository secret 클릭 - 사용할 변수명과 값 입력

    ➡ 4개의 환경변수를 생성
      1) REMOTE_HOST : EC2 IP 주소
      2) REMOTE_PORT : 22(SSH 프로토콜의 포트번호)
      3) REMOTE_USER : ubuntu
      4) SSH_KEY : 발급받은 .pem 키 파일
                  -----BEGIN RSA PRIVATE KEY----- 
                    -----END RSA PRIVATE KEY----- 도 포함시켜야함

 

 

이후 1번 과정에서 push한 html 파일을 EC2에서 Github에 작성한 Github Action Flow를 통해 다운로드받고, 설치된 nginx에 적용해주는 작업이 필요하다. 이를 위한 코드는 다음과 같다.

 

5. Github Action Flow를 활용해 코드 작성

name: devops test
on:
  push:
    branches: [main]   // Push를 감지할 브랜치 지정

jobs:
  deploy:
    name: Deploy to EC2
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository   // Push 한 내용을 Pull 해오기 위한 작업
        uses: actions/checkout@v3 // 위와 같은 명령어를 통해 레포지토리에 있는 파일을 사용 할 수 있게 된다.

      - name: Run Ansible playbook  // EC2에 ansible을 설치하여 playbook을 실행하기 위한 작업
        uses: dawidd6/action-ansible-playbook@v2.8.0
        with:
          playbook: deploy.yml // 1번에서 push한 playbook // 위에서 Checkout 명령어를 통해 Push 한 파일을 바로 사용 할 수 있게 된것임
          directory: ./
          key: ${{secrets.SSH_KEY}}
          inventory: |
            [all]
            [EC2 Ip address] ansible_ssh_user=ubuntu   // EC2 IP 주소

      - name: get code from github    // Push 한 내용으로 nginx 페이지를 교체하기 위한 작업
        uses: appleboy/ssh-action@v0.1.9
        with:
          host: ${{ secrets.REMOTE_HOST }}
          username: ${{ secrets.REMOTE_USER }}
          key: ${{ secrets.SSH_KEY }}
          port: ${{ secrets.REMOTE_PORT }}
          script: |
            sudo rm -rf ./Ansible    // 깃허브 레포지토리명
            sudo git clone https://github.com/[계정명]/[레포지토리명]
            sudo mv -f ./Ansible/*.html /var/www/html

 

3) EC2가 Github Action Flow를 통해 Ansible을 활용하여 Nginx가 설치 및 실행되고, push된 html 코드가 적용

 

위에서 작성한 시나리오를 통해  다음과 같이 실행되는 것을 확인 할 수 있다.

 

 

 

 

추가적으로 push한 html 파일을 확인하고 싶다면 [EC2 Ip address]/[push한 html파일] 로 접속하여 아래와 같이 확인 가능하다.