지난번에 이어 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 |