IaC

Ansible - Playbook Tutorial(3/3)

Operation CWAL 2021. 3. 7. 20:49

Ansible Roles

Ansible은 사용자가 만든 Module의 재사용성을 높이고 커뮤니티 내에서 공유하기 Role 이라는 개념을 제공한다.

보통 Role은 아래와 같은 파일 계층으로 구성된다. 예를 들어, webserver 라는 Role이 있다고 가정하자.

 

하지만 사용자가 Role 디렉토리와 파일을 처음부터 직접 만드는 대신, 아래 명령어를 통해 간단하게 생성 가능하다.

ansible-galaxy init webserver

 

참고로 다른 사용자가 이미 만들어놓은 Role을 import 하는 명령어는 아래와 같다.

ansible-galaxy import webserver

 

저번 실습에선 include 키워드를 통해 다른 파일에 위치한 task들을 가져왔다. 이번엔 flask-web, mysql-db role을 생성하고 Playbook에서 이를 불러오는 방식으로 수정해보자. 우선 roles 디렉토리를 만들고, 그 밑에 아래 명령어를 사용하여 mysql-db role을 생성 및 초기화한다.

ansible-galaxy init mysql-db

README.md는 GitHub에 Role을 업로드을 때 메인으로 출력되는 파일이며, ansible-galaxy 명령어를 통해 기본 템플릿이 작성된 상태이다.

README.md

일단 README.md 파일은 내버려두고, tasks/main.yml 파일을 작성해보자. 이미 작성해놓은 deploy-db.yaml 파일 내용을 그대로 복사하면 된다. 내용을 복사/붙여넣기 후 기존 deploy-db.yaml 파일은 삭제한다.

- 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: '%'

<roles/mysql-db/tasks/main.yml>


이제 mysql-db Role을 사용하는 playbook은 자동으로 main.yaml에 정의한 Task를 가져오게 된다. 다음은 같은 방법으로 flask-web role을 생성한다. tasks 디렉토리는 이제 더 이상 사용하지 않기 때문에 삭제한다.

 

- 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 &

<roles/flask-web/tasks/main.yml>

 

playbook.yaml 파일 내용 중 apt를 통해 python 관련 패키지를 설치하는 task가 존재한다. 해당 task도 python-package라는 별도의 role을 만들어 분리해보자. 

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

<roles/python-packages/tasks/main.yml>

 

마지막으로 playbook을 다음과 같이 수정한다.

- name: Deploy a web application
  hosts: test-server-1, test-server-2
  become: true
  roles:
  - python-packages
  - mysql-db
  - flask-web

<roles/python-packages/tasks/main.yml>

ansible-playbook 명령어 실행시 role 나열순으로 실행하기 때문에, 이전처럼 dependency에 따라 순서를 정하였다

여기까지 진행했다면 현재 파일 구성은 아래와 같아야 한다.

이제 정상적으로 동작하는지 확인해볼 시간이다. 결과는 이전과 동일할까?

 

문제없이 작업이 완료된 것을 알 수 있다. 이렇게 구현한 Role은 GitHub에 올린 뒤, Ansible Galaxy 커뮤니티를 통해 공유하는 것이 일반적이다.  다음번에 기회가 된다면, 이 공유 방법에 대해 설명하는 포스트를 작성하겠다.

'IaC' 카테고리의 다른 글

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