Ansible: Ansible Task(작업)

Ansible의 Playbook에 기본적인 기본인 Ansible Task에 대해 더 깊이 이해하려면, 먼저 Ansible이 무엇인지, 그리고 Playbook이 무엇인지 알아볼 필요가 있습니다. 이를 바탕으로 Playbook의 Task를 더욱 자세히 살펴봅시다.

Ansible 이해하기

Ansible은 IT 자동화 도구로, 서버 구성 관리, 애플리케이션 배포, 실행 중인 프로세스 조정 등 다양한 작업을 자동화할 수 있습니다. Ansible은 간단한 구성, 사용자 친화적인 디자인, 스크립트 기반의 작업 실행 등을 통해 IT 전문가들 사이에서 인기를 얻고 있습니다.

Ansible Playbook 이해하기

Ansible Playbook은 Ansible 작업을 정의하는 YAML 스크립트입니다. Playbook을 통해 서버 구성, 애플리케이션 배포, 복잡한 IT 작업 흐름 등을 정의하고 자동화할 수 있습니다.

Playbook은 하나 이상의 ‘Play’로 구성되며, 각 Play는 특정 호스트 그룹에 대해 실행되는 일련의 ‘작업’ 또는 ‘Task’를 포함합니다. 이제 이 ‘Task’에 대해 더 자세히 알아봅시다.

Playbook에 대한 내용은 아래 내용을 참고부탁드립니다.

Ansible Task 이해하기

Ansible Playbook의 Task는 원격 호스트에서 수행할 작업을 정의합니다. Task는 Playbook의 핵심 요소로, 실제로 작업을 수행하는 부분입니다.

Task는 다음과 같이 정의됩니다:

  1. - name: Install package
  2.   yum:
  3.   name: package_name
  4.   state: present

위 예시에서 Task의 이름은 “Install package”이며, yum 모듈을 사용하여 package_name 패키지를 설치하는 작업을 수행하게 됩니다.

Task는 원하는 만큼 많이 추가할 수 있으며, 각 Task는 순차적으로 실행됩니다. 따라서, Playbook은 여러 Task를 통해 복잡한 IT 작업의 흐름을 정의하게 됩니다.

Task의 다양한 활용

Task는 다양한 활용이 가능합니다. 예를 들어, 패키지 설치, 서비스 관리, 사용자와 그룹 관리, 파일 및 디렉토리 관리 등 다양한 작업을 Task로 정의할 수 있습니다.

또한, Task는 조건을 지정하여 특정 조건이 충족될 때만 실행되도록 설정할 수 있습니다. 예를 들어, 특정 파일이 존재할 때만 파일을 삭제하는 Task를 작성할 수 있습니다. 이를 통해 Playbook의 유연성을 높일 수 있습니다.

Playbook으로 패키지 설치하기

Ansible Playbook을 이용하여 패키지를 설치하는 예시는 다음과 같습니다. 이 예시에서는 “httpd”라는 웹 서버 패키지를 설치하는 작업을 정의하고 있습니다.

  1. ---
  2. - hosts: target_hosts
  3.   tasks:
  4.   - name: Install httpd
  5.   yum:
  6.   name: httpd
  7.   state: present
  8. ...

이 Playbook을 설명하면, hosts 부분에는 작업을 수행할 대상 호스트가 지정되어 있습니다. 여기에는 실제 호스트명, IP 주소, 또는 Ansible 인벤토리에서 정의한 그룹명 등이 올 수 있습니다.

tasks 섹션에는 수행할 작업들이 나열됩니다. 여기서는 “Install httpd”라는 이름의 Task 하나가 정의되어 있습니다.

이 Task에서는 yum 모듈을 사용하여 “httpd” 패키지를 설치하도록 지정하고 있습니다. name에는 패키지 이름을, state에는 패키지의 상태를 지정하며, 여기서는 패키지가 설치되어 있어야 한다는 의미로 present를 지정하였습니다.

이 Playbook을 실행하면, 지정한 대상 호스트에서 “httpd” 패키지가 설치됩니다. 만약 패키지가 이미 설치되어 있다면 아무런 작업도 수행하지 않습니다. 이렇게 Ansible의 Task는 아이디엠포턴트(idempotent)하게 동작하므로, 동일한 Playbook을 여러 번 실행해도 동일한 결과를 보장합니다.

Playbook으로 서비스 관리

Ansible Playbook을 사용하여 서비스의 상태를 확인하고, 필요에 따라 서비스를 중지하거나 시작하는 예시는 다음과 같습니다. 이 예시에서는 “httpd”라는 웹 서버 서비스를 대상으로 합니다.

  1. ---
  2. - hosts: target_hosts
  3.   tasks:
  4.   - name: Check the status of httpd service
  5.   service:
  6.   name: httpd
  7.   state: status
  8.   register: result
  9.  
  10.   - name: Stop the httpd service if it is running
  11.   service:
  12.   name: httpd
  13.   state: stopped
  14.   when: result.state == "running"
  15.  
  16.   - name: Start the httpd service if it is stopped
  17.   service:
  18.   name: httpd
  19.   state: started
  20.   when: result.state == "stopped"
  21. ...

이 Playbook을 설명하면, 첫 번째 Task에서는 service 모듈을 사용하여 “httpd” 서비스의 상태를 확인하고, 결과를 result라는 변수에 저장합니다.

두 번째 Task에서는 조건문 when을 사용하여 “httpd” 서비스가 실행 중일 때(result.state == "running"), 이를 중지하도록 지정하고 있습니다.

마지막 세 번째 Task에서는 역시 조건문을 사용하여 “httpd” 서비스가 중지 상태일 때(result.state == "stopped"), 이를 시작하도록 지정하고 있습니다.

Playbook으로 사용자 및 그룹 관리

Ansible Playbook을 이용하여 사용자의 유무를 확인하고, 해당 사용자와 그룹을 관리하는 예시는 다음과 같습니다. 이 예시에서는 “myuser”라는 사용자와 “mygroup”이라는 그룹을 관리합니다.

  1. ---
  2. - hosts: target_hosts
  3.   tasks:
  4.   - name: Check if myuser exists
  5.   command: id -u myuser
  6.   register: result
  7.   ignore_errors: true
  8.  
  9.   - name: Create myuser if it does not exist
  10.   user:
  11.   name: myuser
  12.   state: present
  13.   when: result is failed
  14.  
  15.   - name: Check if mygroup exists
  16.   command: getent group mygroup
  17.   register: result
  18.   ignore_errors: true
  19.  
  20.   - name: Create mygroup if it does not exist
  21.   group:
  22.   name: mygroup
  23.   state: present
  24.   when: result is failed
  25.  
  26.   - name: Add myuser to mygroup
  27.   user:
  28.   name: myuser
  29.   group: mygroup
  30. ...

이 Playbook을 설명하면, 첫 번째 Task에서는 command 모듈을 사용하여 “myuser” 사용자가 존재하는지 확인하고, 결과를 result라는 변수에 저장합니다. 사용자가 존재하지 않으면 id -u myuser 명령은 오류를 반환하므로, ignore_errors: true를 설정하여 이 오류를 무시하도록 합니다.

두 번째 Task에서는 조건문 when을 사용하여 “myuser” 사용자가 존재하지 않을 때(result is failed), 이를 생성하도록 지정하고 있습니다.

세 번째와 네 번째 Task에서는 비슷한 방식으로 “mygroup” 그룹의 존재 유무를 확인하고, 그룹이 존재하지 않으면 이를 생성합니다.

마지막 Task에서는 user 모듈을 사용하여 “myuser” 사용자를 “mygroup” 그룹에 추가하도록 지정하고 있습니다.

이렇게 작성한 Playbook을 실행하면, “myuser” 사용자와 “mygroup” 그룹이 존재하지 않으면 이를 생성하고, 사용자를 그룹에 추가하는 작업을 수행합니다.

Task 작성 시 주의할 점

Task를 작성할 때는 재사용성과 유지보수성을 고려해야 합니다. Task는 가능한 한 간결하고 명확하게 작성하는 것이 좋습니다. 또한, Task의 이름은 해당 Task가 수행하는 작업을 명확하게 설명해야 합니다. 이는 Playbook의 가독성을 높이고, 유지보수를 용이하게 합니다.

또한, Task는 멱등성을 (idempotent)보장해야 합니다. 즉, 동일한 Task를 여러 번 실행해도 동일한 결과가 나와야 합니다. 이를 통해 Playbook의 안정성을 보장할 수 있습니다.

그래서 Task란?

Ansible Playbook을 사용하여 작업을 정의할 수 있는 가장 작은 단위가 Task 이며, Playbook 정의 시 Tasks 섹션 아래에 위치한 모든 것들이 Task로 알고 계시면 될 거 같습니다.

Task는 모듈(service, command 등)을 이용하여 작업을 정의하고 실행하게 되는 것이며, Playbook 실행 시 실행되는 주요 작업이 Task라고 안내드릴 수 있습니다.

마치며

Ansible의 Playbook Task는 IT 작업을 자동화하는 강력한 도구입니다. Playbook의 Task가 무엇인지부터 기본적인 사용법까지 이를 바탕으로 Ansible을 더욱 효과적으로 활용하시길 바랍니다.

참고 문헌

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_intro.html

https://watch-n-learn.tistory.com/80

https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/8/html/configuring_and_managing_identity_management/ensuring-the-presence-of-idm-groups-and-group-members-using-ansible-playbooks_managing-user-groups-using-ansible-playbooks