IaC

Ansible - Playbook Tutorial(2/3)

Operation CWAL 2021. 3. 6. 17:52

지난번에 이어 Playbook을 개선할 시간이다.

 

Ansible - Playbook Tutorial(1/3)

설치 Ubuntu 환경에서 다음 명령어로 Ansible을 손쉽게 설치할 수 있다. Ansible Controller로 사용할 Machine에서 실행한다. sudo apt update sudo apt install software-properties-common sudo apt-add-reposit..

cwal.tistory.com

vars 필드에 Playbook에서 사용할 변수들을 정의한 적이 있었다. 하지만 모든 Host가 동일한 DB 정보를 가지고 있지 않을 수 있다. 예를 들어 dev와 staging의 DB Name이나 사용자가 다를 수 있다. 이러한 케이스를 위해 개별 host마다 별도의 변수 목록을 가질 수 있도록 현재 파일 구성을 바꿔보겠다.

 

우선 host_vars 디렉토리를 추가하고, 아래와 같은 내용으로 파일 2개(test-server-1.yaml, test-server-2.yaml)를 추가하였다.

db_name: employee_db
db_user: db_user
db_password: Passw0rd

그리고 playbook.yaml에서 vars 필드를 제거한다.

- name: Deploy a web application
  hosts: test-server-1, test-server-2
  become: true

  tasks:
  - name: Install all required dependencies
    apt:  
      name:
      - python
      - python-setuptools
      - python-dev
      - build-essential
      - python-pip
      - python-mysqldb
      state: present

  - name: Install MySQL database
    apt:
      name:
      - mysql-server
      - mysql-client
      state: present

  - name: Start Mysql Service
    service:
      name: mysql
      state: started
      enabled: yes

  - name: Create Application Database
    mysql_db:
      login_unix_socket: /var/run/mysqld/mysqld.sock
      name: "{{ db_name }}"
      state: present

  - name: Create Database user
    mysql_user:
      login_unix_socket: /var/run/mysqld/mysqld.sock
      name: "{{ db_user }}"
      password: "{{ db_password }}"
      priv: '*.*:ALL'
      state: present
      host: '%'
  
  - name: Upgrade pip
    pip:
      name: pip==20.3.4

  - name: Install Python Flask dependency
    pip:
      name:
      - flask
      - flask-mysql
      state: present
    
  - name: Copy source code
    copy: src=app.py dest=/opt/app.py

  - name: Start Web Server
    shell: FLASK_APP=/opt/app.py nohup flask run --host=0.0.0.0 &

여기까지 진행했다면 현재 파일 구성은 다음과 같다.

이제 각각의 Host는 자신의 이름과 동일한 Yaml 파일을 host_vars 디렉토리에서 찾은 뒤, 변수 목록을 읽어올 수 있다. 예를 들어 test-server-1은 host_vars/test-server-1.yaml 로부터 db_name, db_user, db_password를 가져오는 방식이다.

 

이를 응용하면 그룹 단위의 변수 목록 지정도 가능하다. 우선 아래와 같이 group_vars 디렉토리를 생성 후, 현재 Host들의 그룹 이름과 동일한 test-servers.yaml 파일을 아래와 같이 작성한다.

db_name: employee_db
db_user: db_user
db_password: Passw0rd

기존 host_vars 디렉토리는 제거하도록 하며, 파일 구성은 아래와 같아야 한다.

 

ansible-playbook 명령어를 실행하면 변수 정보가 다른 파일에 위치함에도 불구하고, 기존과 동일하게 동작한다.

 

참고로 host_vars 또는 group_vars와 playbook의 변수가 중복되는 경우, playbook 내용으로 override 됨에 유의해야 한다.

 

마지막으로 하나의 Playbook에 작성된 task들을 성격에 맞게 DB와 Web으로 분리하자. tasks 디렉토리를 생성한 후 아래와 같은 파일을 각각 작성한다.

- name: Install MySQL database
  apt:
    name:
    - mysql-server
    - mysql-client
    state: present

- name: Start Mysql Service
  service:
    name: mysql
    state: started
    enabled: yes

- name: Create Application Database
  mysql_db:
    login_unix_socket: /var/run/mysqld/mysqld.sock
    name: "{{ db_name }}"
    state: present

- name: Create Database user
  mysql_user:
    login_unix_socket: /var/run/mysqld/mysqld.sock
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    priv: '*.*:ALL'
    state: present
    host: '%'

<tasks/deploy-db.yaml>

 

- name: Upgrade pip
  pip:
    name: pip==20.3.4

- name: Install Python Flask dependency
  pip:
    name:
    - flask
    - flask-mysql
    state: present
  
- name: Copy source code
  copy: src=app.py dest=/opt/app.py

- name: Start Web Server
  shell: FLASK_APP=/opt/app.py nohup flask run --host=0.0.0.0 &

<tasks/deploy-web.yaml>

 

기존 playbook.yaml은 task를 일일이 정의하는 대신, 각 모듈(db, web)에 따라 각각의 파일로 나눈 뒤 이를 include 하는 방식으로 아래처럼 간소화할 수 있다.

- name: Deploy a web application
  hosts: test-server-1, test-server-2
  become: true

  tasks:
  - name: Install all required dependencies
    apt:  
      name:
      - python
      - python-setuptools
      - python-dev
      - build-essential
      - python-pip
      - python-mysqldb
      state: present
  - include: tasks/deploy-db.yaml
  - include: tasks/deploy-web.yaml

<tasks/deploy-web.yaml>

 

web의 경우, db에 의존성이 있으므로 include 순서가 중요한 편이다.

 

여기까지 진행했다면 최종 파일 구성은 다음과 같다.

확인을 위해 ansible-playbook 명령어를 실행해보자. 파일을 분리했음에도 불구하고, 결과는 이전과 동일하다.

 

다음 포스트에선 Playbook 재사용을 위한 Role에 대해 알아볼 예정이다.

'IaC' 카테고리의 다른 글

Terraform - (3) Variables  (0) 2021.06.07
Terraform - (2) 기본 사용법  (0) 2021.06.06
Terraform - (1) 소개 및 설치  (0) 2021.03.29
Ansible - Playbook Tutorial(3/3)  (0) 2021.03.07
Ansible - Playbook Tutorial(1/3)  (0) 2021.03.06