Devops - 1 ( Ansible, Github Action )

HD.YΒ·2024λ…„ 2μ›” 19일
0

ν•œν™”μ‹œμŠ€ν…œ BEYOND SW

λͺ©λ‘ 보기
55/58
post-thumbnail

Ansible (μ•€μ„œλΈ”) μ΄λž€β“

μ•€μ„œλΈ”(Ansible)은 λ¦¬λˆ…μŠ€μ™€ μœ λ‹‰μŠ€ 기반 μ‹œμŠ€ν…œμ˜ μ„€μ • 및 배포 μž‘μ—…μ„ μžλ™ν™”ν•˜κΈ° μœ„ν•œ IT μžλ™ν™” 도ꡬ 쀑 ν•˜λ‚˜μ΄λ‹€. μ•€μ„œλΈ”μ€ μ—μ΄μ „νŠΈ(agent)κ°€ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©°, YAML ν˜•μ‹μœΌλ‘œ μž‘μ„±λœ Playbook을 μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ 배포 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

λ˜ν•œ λ©±λ“±μ„± ( Idempotency, μ—¬λŸ¬ 번 μ μš©ν•΄λ„ κ²°κ³Όκ°€ λ™μΌν•˜λ©°, μˆ˜μ •λœ 뢀뢄이 μžˆλ‹€λ©΄ κ·Έ λΆ€λΆ„λ§Œ μƒˆλ‘­κ²Œ 반영됨 )의 νŠΉμ§•μ΄ 있으며, 데이터 전솑을 μœ„ν•΄ OpenSSHλ₯Ό μ΄μš©ν•œλ‹€.


➑ μ—μ΄μ „νŠΈλž€β“

λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨ λ˜λŠ” μ‹œμŠ€ν…œκ³Ό ν†΅μ‹ ν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ 정보λ₯Ό μˆ˜μ§‘ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄μ΄λ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­μ„ 보내고, μ„œλ²„λŠ” κ·Έ μš”μ²­μ— 따라 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ”λ° μ—μ΄μ „νŠΈλŠ” μ΄λŸ¬ν•œ μš”μ²­μ„ λ°›μ•„μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§ν•œλ‹€.

ν•˜μ§€λ§Œ, μ•€μ„œλΈ”μ€ SSHλ₯Ό 톡해 원격 μ‹œμŠ€ν…œμ— μ—°κ²° 및 κ΄€λ¦¬ν•˜λ―€λ‘œ, μ—μ΄μ „νŠΈλ₯Ό μ„€μΉ˜ν•˜κ±°λ‚˜ ꡬ성할 ν•„μš”κ°€ μ—†λ‹€.


Ansible의 κΈ°λ³Έ κ°œλ… 및 μš©μ–΄ 🧐

  • μ œμ–΄ λ…Έλ“œ(Control node) βœ…
    ➑ μ•€μ„œλΈ”μ„ μ‹€ν–‰ν•˜λŠ” λ…Έλ“œμ΄λ‹€. μ œμ–΄ λ…Έλ“œμ—μ„œ λͺ…λ Ήμ–΄λ‘œ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œλ“€μ„ κ΄€λ¦¬ν•œλ‹€.

  • λ§€λ‹ˆμ§€λ“œ λ…Έλ“œ(Managed node) βœ…
    ➑ μ•€μ„œλΈ”λ‘œ κ΄€λ¦¬ν•˜λŠ” μ„œλ²„ λ…Έλ“œμ΄λ‹€. λ§€λ‹ˆμ§€λ“œ λ…Έλ“œλŠ” ν˜ΈμŠ€νŠΈλΌκ³ λ„ ν•œλ‹€.
    Β γ€€λ§€λ‹ˆμ§€λ“œ λ…Έλ“œμ—λŠ” μ•€μ„œλΈ”μ΄ μ„€μΉ˜ λ˜μ§€ μ•ŠλŠ”λ‹€.

  • 인벀토리(Inventory) βœ…
    ➑ 호슀트 νŒŒμΌμ΄λΌκ³ λ„ ν•˜λ©°, λ§€λ‹ˆμ§€λ“œ λ…Έλ“œ λͺ©λ‘μ„ 인벀토리라고 ν•œλ‹€.
    ➑ μ•€μ„œλΈ”μ— μ˜ν•΄ μ œμ–΄λ  λŒ€μƒμ„ μ •μ˜ν•œλ‹€. 각 λ§€λ‹ˆμ§€λ“œ λ…Έλ“œμ— λŒ€ν•œ IP μ£Όμ†Œ,
    Β γ€€ν˜ΈμŠ€νŠΈ 정보, λ³€μˆ˜μ™€ 같은 정보λ₯Ό 지정할 수 μžˆλ‹€.

    ➑ 인벀토리 yaml 파일의 μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€. πŸ’»

    all:
     hosts:                // 그룹을 κ΅¬μ„±ν•˜κΈ° μœ„ν•œ λͺ¨λ“  μ„œλ²„μ˜ IP 지정
       77.77.77.200:   
       77.77.77.201:
       77.77.77.202:
     children:
       webservers:         // 이름 짓기 λ‚˜λ¦„ ( κ·Έλ£Ή 이름 )
         hosts:            // μ›Ήμ„œλ²„κ°€ 2개라면 μ•„λž˜μ²˜λŸΌ 2개 적을 수 있음. μ—¬λŸ¬κ°œ κ°€λŠ₯
           77.77.77.200:
           77.77.77.201:
       dbservers:          // 이름 짓기 λ‚˜λ¦„ ( κ·Έλ£Ή 이름 )
         hosts:
           77.77.77.202:
    

  • ν”Œλ ˆμ΄λΆ(Playbook) βœ…

    ➑ ν”Œλ ˆμ΄λΆμ€ 인벀토리 νŒŒμΌμ—μ„œ μ •μ˜ν•œ λŒ€μƒλ“€μ΄ 무엇을 μˆ˜ν–‰ν•  것인지 μ •μ˜ν•˜λŠ”
    γ€€μ—­ν• μ„ν•˜λ©°, yaml 파일 ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•œλ‹€.

    ➑ μ•€μ„œλΈ”μ„ μ‚¬μš©ν•˜λ €λ©΄ 이 ν”Œλ ˆμ΄λΆμ„ 잘 닀룰쀄 μ•Œμ•„μ•Όν•˜λ©°, λ‹¨λ…μœΌλ‘œ μ‚¬μš©λ˜λŠ” 것이
    γ€€μ•„λ‹Œ 인벀토리와 ν”Œλ ˆμ΄λΆμ˜ μ‘°ν•©μœΌλ‘œ 같이 μ‚¬μš©ν•œλ‹€.

    ➑ μ™ λ§Œν•œ λͺ…령어에 λŒ€ν•œ ν”Œλ ˆμ΄λΆμ€ ν™ˆνŽ˜μ΄μ§€μ—μ„œ μ°Ύμ•„λ³Ό 수 있으며, λ§Œμ•½ μ—†λ‹€λ©΄
    γ€€shell 을 μ‚¬μš©ν•˜μ—¬ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€.

    ➑ ν”Œλ ˆμ΄λΆ yaml 파일의 μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

- hosts: ["77.77.77.200"]
  tasks:
    - name: define hostname   // μ μ ˆν•œ 이름 μž„μ˜ 지정
      shell: |                // ν”Œλ ˆμ΄λΆ λͺ…λ Ήμ–΄κ°€ 없을 λ•Œ λͺ…λ Ήμ–΄λ₯Ό 직접 μΉ λ•Œ μ‚¬μš©
        hostnamectl set-hostname worker03
      become: yes             // κ΄€λ¦¬μž κΆŒν•œμœΌλ‘œ μ‹€ν–‰ 의미
    - name: stop firewalld    // ν”Œλ ˆμ΄λΆ λͺ…λ Ήμ–΄ μ‚¬μš©
      service:
        name: firewalld
        state: stopped

  • νƒœμŠ€ν¬(Task) βœ…
    ➑ μ•€μ„œλΈ”μ˜ μž‘μ—… λ‹¨μœ„. μ• λ“œν›…(ad-hoc)λͺ…령을 μ‚¬μš©ν•˜μ—¬ 단일 μž‘μ—…μ„ ν•œ 번
    Β γ€€μ‹€ν–‰ν•  수 μžˆλ‹€.

  • λͺ¨λ“ˆ(Module) βœ…
    ➑ μ•€μ„œλΈ”μ΄ μ‹€ν–‰ν•˜λŠ” μ½”λ“œ λ‹¨μœ„. ν”Œλ ˆμ΄λΆμ—μ„œ Taskκ°€ μ–΄λ–»κ²Œ μˆ˜ν–‰λ μ§€λ₯Ό μ •ν•œλ‹€.


🦁 Ansible 을 μ‚¬μš©ν•˜κΈ° μœ„ν•œ κΈ°λ³Έ μ„€μ •

  • μ•€μ„œλΈ”μ€ SSH둜 μ œμ–΄λ…Έλ“œμ™€ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œκ°€ μ—°κ²°λœλ‹€.

  • λ”°λΌμ„œ, μ•€μ„œλΈ”μ„ μ‚¬μš©ν•˜κΈ° 전에 각 μ„œλ²„μ— authorized_keys λ₯Ό μΆ”κ°€ν•΄μ€€λ‹€.

  • λ‚˜λŠ” CentOS 8 가상머신 2λŒ€λ₯Ό 쀀비해놨닀. ( IP μ„€μ • μ™„λ£Œ )
    ➑ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œ : nginx / μ œμ–΄ λ…Έλ“œ : ansible


1. μ œμ–΄ λ…Έλ“œμ—μ„œ SSH둜 μ ‘μ†ν•œλ‹€ : ssh root@[ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œ IP μ£Όμ†Œ ]

➑ 접속에 μ„±κ³΅ν•˜λ©΄ μ œμ–΄λ…Έλ“œμ—μ„œ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œλ‘œ 바뀐것을 μœ„μ²˜λŸΌ λ³Ό 수 μžˆλ‹€.


2. μ œμ–΄λ…Έλ“œμ—μ„œ ν‚€λ₯Ό μƒμ„±ν•œλ‹€.

  • μƒμ„±ν•˜κΈ° μ „, λ§€λ‹ˆμ§€λ“œ λ…Έλ“œμ—μ„œ ν‚€λ₯Ό 확인해보면 μ—†λ‹€κ³  μ•„λž˜μ²˜λŸΌ 좜λ ₯되고 μžˆλ‹€.

  • μ œμ–΄λ…Έλ“œμ—μ„œ ν‚€ 생성 : ssh-keygen
    ➑ 질문이 2개 정도 λ‚˜μ˜€λŠ”λ°, κ·Έλƒ₯ 아무것도 μž…λ ₯ν•˜μ§€ μ•Šκ³  Enterλ₯Ό λˆ„λ₯΄λ©΄ λœλ‹€.


3. μ œμ–΄λ…Έλ“œμ—μ„œ μƒμ„±ν•œ ν‚€λ₯Ό λ³΅μ‚¬ν•œλ‹€. : ssh-copy-id root@[ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œ IP μ£Όμ†Œ ]

➑ λ§€λ‹ˆμ§€λ“œ λ…Έλ“œμ—μ„œ .ssh νŒŒμΌμ„ 확인해보면 authorized_keys κ°€ 생겼을 것이닀.


🐼 Ansible μ„€μΉ˜ν•˜κΈ° ( μ œμ–΄ λ…Έλ“œ )

  • dnf -y install centos-release-ansible-29

  • sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-SIG-ansible-29.repo

  • dnf --enablerepo=centos-ansible-29 -y install ansible


  • ν…ŒμŠ€νŠΈ 해보기

1. μ œμ–΄λ…Έλ“œμ—μ„œ 인벀토리 ( server.yml ) 생성

all:
  hosts: 
    77.77.77.200:   
    77.77.77.201:
  children:
    webservers:
      hosts:
        77.77.77.200:
        77.77.77.201:
        

2. 인벀토리 ν…ŒμŠ€νŠΈ : ansible webservers -i server.yml -m ping

Β γ€€βž‘ webservers : 인벀토리에 μž‘μ„±ν•œ κ·Έλ£Ήλͺ…

Β γ€€βž‘ server.yml : 인벀토리λͺ…

Β γ€€βž‘ -m : λͺ¨λ“ˆ μ‹€ν–‰

Β γ€€βž‘ ping : ν•‘ λ³΄λ‚΄λ³΄λŠ” λͺ…λ Ήμ–΄


3. μ œμ–΄ λ…Έλ“œμ—μ„œ ν”Œλ ˆμ΄λΆ μž‘μ„± ( nginx μ„€μΉ˜ ) : vi nginx-playbook.yml

- hosts: ["77.77.77.200"]
  tasks:
    - name: install nginx
      yum:
        name: httpd
        state: latest

4. ν”Œλ ˆμ΄λΆ μ‹€ν–‰ : ansible-playbook -i server.yml ./nginx-playbook.yml


🐷 GitHub Action μ‹€μŠ΅ν•˜κΈ°

  • μ‹€μŠ΅λ‚΄μš© : VS Codeμ—μ„œ 컀밋 및 푸쉬 μ‹œ μžλ™μœΌλ‘œ EC2에 nginx μ„œλ²„ μ„€μΉ˜(λ―Έμ„€μΉ˜ μ‹œ)
         및 html 파일 적용

1. κΉƒν—ˆλΈŒ λ ˆν¬μ§€ν† λ¦¬ 생성

2. AWS EC2 생성 및 μΈλ°”μš΄λ“œ κ·œμΉ™ νŽΈμ§‘ ( 80번 및 443번 포트 )

3. EC2 생성 μ‹œ λ°œκΈ‰λ°›μ€ .ppk ν‚€ νŒŒμΌμ„ .pem 파일둜 λ³€ν™˜
γ€€βž‘ 이유 : .ppk νŒŒμΌμ€ Puttyμ—μ„œ μ‚¬μš©ν•  λͺ©μ μœΌλ‘œ μƒμ„±ν•œ νŒŒμΌμ΄μ§€λ§Œ, κΉƒν—ˆλΈŒ μ•‘μ…˜μ€
Β γ€€γ€€γ€€γ€€γ€€λ¦¬λˆ…μŠ€ ν™˜κ²½μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ, .pem ν˜•μ‹μ˜ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ SSH 연결을 μ„€μ •ν•œλ‹€.

Β γ€€1) Puttygen ν”„λ‘œκ·Έλž¨ μ‹€ν–‰

Β γ€€2) Load 클릭 ν›„ λ°œκΈ‰λ°›μ€ .ppk 파일 μž…λ ₯

Β γ€€3) Conversions 클릭 ➑ Export OpenSSH key 클릭 ν›„ ν‚€ μ €μž₯


2. μ‚¬μš©ν•  ν™˜κ²½λ³€μˆ˜ 등둝

Β γ€€1) κΉƒν—ˆλΈŒ λ ˆν¬μ§€ν† λ¦¬μ—μ„œ Settings 클릭

Β γ€€2) μ™Όμͺ½ λ©”λ‰΄νƒ­μ—μ„œ Secrets and variables - Actions 클릭


Β γ€€3) New repository secret 클릭 - μ‚¬μš©ν•  λ³€μˆ˜λͺ…κ³Ό κ°’ μž…λ ₯
Β Β γ€€γ€€βž‘ μ‚¬μš©ν•  λ³€μˆ˜λ§ŒνΌ 계속 μƒμ„±ν•˜λ©΄ λœλ‹€.

Β Β γ€€γ€€βž‘ λ‚˜λŠ” μœ„ 사진과 같이 οΌ”κ°œμ˜ ν™˜κ²½λ³€μˆ˜λ₯Ό μƒμ„±ν–ˆλ‹€.
Β Β Β γ€€γ€€γ€€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----- 도 ν¬ν•¨μ‹œμΌœμ•Ό λœλ‹€.


3. VS Code μ—΄κ³ , μƒμ„±ν•œ κΉƒν—ˆλΈŒ λ ˆν¬μ§€ν† λ¦¬λ‘œ 원격 μ €μž₯μ†Œ μ„€μ •

4. 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>

5. .github/workflows 디렉토리 생성

6. nginx μ„€μΉ˜ 및 싀행을 μœ„ν•œ ν”Œλ ˆμ΄λΆ μž‘μ„± ( deploy.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

7. EC2에 μ ‘μ†ν•˜μ—¬ nginx의 νŽ˜μ΄μ§€λ₯Ό λ³€κ²½ν•˜λŠ” GitHub Action Workflow μž‘μ„±

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μ—μ„œ ubuntu μ‚¬μš©μžλ‘œ μ ‘μ†ν•˜κΈ° μœ„ν•œ μž‘μ—…
        uses: dawidd6/action-ansible-playbook@v2.8.0
        with:
          playbook: deploy.yml
          directory: ./
          key: ${{secrets.SSH_KEY}}
          inventory: |
            [all]
            43.200.163.229 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 ./action    // κΉƒν—ˆλΈŒ λ ˆν¬μ§€ν† λ¦¬λͺ…
            sudo git clone https://github.com/[계정λͺ…]/[λ ˆν¬μ§€ν† λ¦¬λͺ…]
            sudo mv -f ./action/*.html /var/www/html

➑ μƒμ„±ν•œ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.


8. Commit 및 Push ν›„ κΉƒν—ˆλΈŒ μ•‘μ…˜ - Deploy EC2 μ™„λ£Œ μ—¬λΆ€ 확인

➑ Push와 λ™μ‹œμ—, EC2에 nginxλ₯Ό μ„€μΉ˜ 및 μ‹€ν–‰μ‹œν‚€κ³  κΉƒν—ˆλΈŒμ—μ„œ Pull둜 νŒŒμΌμ„ λΆˆλŸ¬μ™€μ„œ
Β γ€€ν•΄λ‹Ή html νŒŒμΌμ„ nginx νŽ˜μ΄μ§€λ‘œ λŒ€μ²΄ν•˜κ²Œ λœλ‹€.


➑ μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰λ˜λ©΄, μ•„λž˜μ™€ 같이 좜λ ₯λœλ‹€.


9. EC2 IPμ£Όμ†Œ:80/test.html URL둜 μ ‘μ†ν•˜μ—¬ VS Codeμ—μ„œ μž‘μ„±ν•œ html 파일이 좜λ ₯λ˜λŠ”μ§€
Β γ€€ν™•μΈν•œλ‹€.


10. test.html νŒŒμΌμ„ λ³€κ²½ ν›„, λ‹€μ‹œ κΉƒν—ˆλΈŒλ‘œ Push ν–ˆμ„ λ•Œ, ν•΄λ‹Ή νŽ˜μ΄μ§€κ°€ λ³€κ²½λ˜λŠ”μ§€ 확인


  • deploy.yml κ³Ό main.yml 을 λ‚˜λˆ μ„œ μž‘μ„±ν•œ μ΄μœ λŠ” ν–₯ν›„ λ³΅μž‘ν•œ μ½”λ“œ μž‘μ„± μ‹œ μž‘μ—…μ˜ 가독성과 μœ μ§€ λ³΄μˆ˜μ„±μ΄ ν–₯상될 수 있고, ν•„μš”ν•œ 경우 νŠΉμ • μž‘μ—… 단계λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ μž¬μ‚¬μš©ν•˜λŠ” 것이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
profile
κ°œλ°œμžκ°€ λ˜κΈ°κΉŒμ§€μ˜ κ³Όμ •

0개의 λŒ“κΈ€