ansible playbook은 task를 실행하는 ansible의 실행 모듈이다. 플레이모듈은 YAML파일 형태로 포매팅되어 playbook의 collection 내부 모듈의 실행 로직과 문법에 따라 피제어노드에 명령을 전달한다.
playbook은 모듈 단위 작업인 task와 task의 집합 작업인 play로 구분된다. play는 하위 task들이 실행될 노드, 사용자 등등 큰 프레임을 고정시키고, 하위 task에서 상세한 작업을 실행하는 것이다.
ansible-playbook의 기초 문법은 다음과 같다.
ansible-playbook -i INVENTORY [optional] PLAYBOOK
INVENTORY: 미리 정의해놓은 인벤토리 파일
PLAYBOOK: 이제 알게 될 업무 지시 파일
PLAYBOOK 작성
---
- name: practice
become: true
hosts: all
tasks:
- name: practice playbook
module: value
위에서 보는 것이 playbook의 기초 모형이다. name, become, hosts, tasks의 4개가 리스트로 묶여 playbook을 형성한다. name은 해당 play의 이름, become은 특정 사용자로 로그인할것인지, 아닌지를 결정한다. 만약 다른 유저로 로그인하고싶다면 become과 같은 depth에서 become_user: USER를 정의해주면 된다. hosts는 해당 tasks 이하가 실행될 노드들을 결정하는데, all이면 인벤토리에서 정의된 모든 노드들을 의미하고, 저번 포스트에 작성했던 것처럼 group을 참조하면([group]: node1 node2) node1 node2에서만 실행된다.
tasks의 하위 리스트인 name은 해당 모듈이 실행될 때 task의 이름을, module 및 value에는 실행할 모듈과 모듈에 넣을 값들을 집어넣어준다.
이제 기초는 알았으니 직접 playbook을 작성해보자.
개발환경
- Container with docker 19.06.3
- ansible 2.11.0
- python 3.8.0
- SSH
- pip3 install flask
제어 노드
ansible
피제어 노드
node1
node2
node3
node4
- name: practice
become: false
hosts: all
tasks:
- name: create folder
ansible.builtin.command:
cmd: mkdir /root/from-ansible
creates: /root/from-ansible
- name: config file
ansible.builtin.shell: |-
cat << EOF > /root/config.file
this is configuration file
EOF
그렇게 복잡하지 않은 playbook이다. play의 이름은 practice(name: practice)고 모든 호스트에서 실행(hosts: all)한다. 하위 tasks들의 이름은 create folder와 config file이고, ansible.builtin.command 모듈과 ansible.builtin.shell 모듈을 사용한다.(둘다 builtin 모듈이므로 그냥 command, shell만 써도 동작하지만, 처음이니까 그냥 풀네임으로 작성했다)
command 모듈은 cmd: 에 적힌 명령을 실행하는데, 만약 /root/from-ansible 경로가 이미 존재할 경우 해당 페이즈를 스킵한다(만약 creates를 주지 않고 cmd 값만 부여한 상태로 /root/from-ansible경로가 존재하면 에러가 나며 playbook이 중단된다)
shell 모듈은 아래에 적힌 모듈을 shell(/bin/sh) 모듈로 실행하는데, command와 유사하다. 다만 차이점은 command는 각종 shell 연산자들(<, >, |, ||, && 등)을 수행할 수 없지만, shell 모듈은 수행할 수 있다는 것이다. 어쨌든, shell cat ~으로 config.file에 "this is configuration file"이란 내용을 작성하는 task다.
그럼 직접 실행해보자.
# vim hosts.ini
node1 ansible_host=172.31.0.21 ansible_user=root
node2 ansible_host=172.31.0.22 ansible_user=root
node3 ansible_host=172.31.0.23 ansible_user=root
node4 ansible_host=172.31.0.24 ansible_user=root
[server]
node1
node3
[client]
node2
node4

실행은 순조롭다. 다만 WARNING이 하나 등장했는데, 보니 command 모듈로 mkdir을 실행하지 말고 file 모듈의 state=directory의 사용을 권장하는 이야기다. 뭔가 내부 모듈의 호환성이나 곧 DESCRETE될 수도 있는 기능인가보다. 뭐 WARNING이므로 실행 및 결과에는 문제가 없으므로 일단 패스.
또한 더 많은 모듈에 대한 정보는 ansible의 공식 Docs에 있다.
https://docs.ansible.com/ansible/latest/collections/ansible/index.html
Collections in the Ansible Namespace — Ansible Documentation
© Copyright Ansible project contributors. Last updated on May 19, 2021.
docs.ansible.com
이것으로 ansible의 기초중의 기초를 마쳤다. 다음엔 좀 더 본격적인 ansible 활용으로 들어가보자.
'DevOps > ansible' 카테고리의 다른 글
| ansible 기초/설치하기 (0) | 2021.05.31 |
|---|
