Ansible

include_tasks와 if를 활용한 nginx 설치 플레이북 작성

Joon0464 2021. 7. 22. 17:13

1. include_tasks를 사용하지 않고 nginx를 노드에 설치

---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes

  tasks:
    - name: Install nginx web server
      action : "{{ ansible_pkg_mgr }} name=nginx state=present update_cache=yes"
      when : ansible_distribution == 'Ubuntu'

    - name: Install nginx web server2-1
      action : "{{ ansible_pkg_mgr }} name=epel-release state=latest"
      when : ansible_distribution == 'CentOS'
    - name: Install nginx web server2-2
      action : "{{ ansible_pkg_mgr }} name=nginx state=present"
      when : ansible_distribution == 'CentOS'

플레이북을 작성하여 nginx를 각 운영체제에 맞게 설치하도록 설정한 코드이다.

# ansible-playbook sim_nginx_install_w_when.yml

플레이북을 통해 nginx 설치를 진행한다.

 

2. include_tasks를 포함하여 플레이북 다시 작성

include_tasks를 사용하여 구조적으로 플레이북을 작성하면 코드의 내용이 길어지면 추후의 내용을 확인하고 수정하기 어려워지기 때문이다.

---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes

  tasks:
  - name: nginx for Ubuntu
    include_tasks: Ubuntu.yml
    when: ansible_distribution == 'Ubuntu'

  - name: nginx for CentOS
    include_tasks: CentOS.yml
    when: ansible_distribution == 'CentOS'

include_tasks 와 when을 사용하여 노드의 운영체제가 Ubuntu인 경우에는 Ubuntu.yml을 CentOS인 경우에는 CentOS.yml을 각각 실행한다.

- name: Install nginx web server
  action : "{{ ansible_pkg_mgr }} name=nginx state=present update_cache=yes"
- name: Upload default index.html for web server
  get_url: url=https://www.apache.org dest=/usr/share/nginx/html/ mode=0644 validate_certs=no

Ubuntu.yml 파일을 위와 같이 작성한다.

- name: Install epel-release
  action : "{{ ansible_pkg_mgr }} name=epel-release state=latest"
- name: Install nginx web server
  action : "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: Upload default index.html for web server
  get_url: url=https://www.apache.org dest=/usr/share/nginx/html/ mode=0644
- name: Start nginx web server
  service: name=nginx state=started

CentOS.yml을 위와 같이 작성한다.

# ansible-playbook sim_nginx_install_w_when.yml

플레이북 구성을 시작하면 각 운영체제에 맞게 nginx가 구성되기 시작한다. 각 운영체제에 맞는 설치는 진행하고 맞지 않는 설치는 skip되어 넘어간다. 설치는 각 운영체제에 맞는 설치파일이 동작하여 설치가 진행된다.

 

3. if를 활용

---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ 'Ubuntu' if ansible_distribution == 'Ubuntu'
                   else 'CentOS' if ansible_distribution == 'CentOS'
                   else 'Just Linux' }}"

  tasks:
  - name: nginx for Any Linux
    include_tasks: "{{ lnx_name }}.yml"

vars를 이용하여 lnx_name이라는 변수를 생성한다. lnx_name의 값은 if를 사용하여 운영체제가 Ubuntu일 때는 Ubuntu로 CentOS일 경우에는 CentOS로 그 이외의 운영체제는 Just Linux로 할당된다.

tasks에 lnx_name 변수와 include_tasks를 이용하여 특정 운영체제마다 원하는 설치파일이 동작하도록 설정되어있다.

ansible-playbook nginx__install_w_if.yml

해당 플레이북을 동작시키면 설치가 각 운영체제에 맞게 진행된다. 더 이상 skip이라는 문구가 없이 설치가 진행되어 task가 낭비되지 않고 더 빠르게 설치가 진행된다.