
์ด์ ์ฑํฐ๊น์ง ํ๋์ play์์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋์์ ์ฒ๋ฆฌํ์ต๋๋ค. ์ด๋ฒ์๋ play๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋๋์ด ๊ทธ๋ฃน๋ณ๋ก ๋ค๋ฅธ ์์ ์ ์ํํ๊ณ , serial๋ก ํ ๋์ฉ ์์ฐจ ์ฒ๋ฆฌํ๋ฉฐ, delegate_to๋ก ํน์ task๋ง ๋ค๋ฅธ ๋ ธ๋์์ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
์ค์ต์ ์ํด inventory.ini์ ์๋ธ๊ทธ๋ฃน์ ์ถ๊ฐํฉ๋๋ค:
[managed]
node1 ansible_host=node1
node2 ansible_host=node2
node3 ansible_host=node3
[primary]
node1 ansible_host=node1
[secondary]
node2 ansible_host=node2
node3 ansible_host=node3
[managed:vars]
ansible_connection=ssh
ansible_user=ansible
ansible_password=ansible
[primary:vars]
ansible_connection=ssh
ansible_user=ansible
ansible_password=ansible
[secondary:vars]
ansible_connection=ssh
ansible_user=ansible
ansible_password=ansible
primary(node1)์ secondary(node2, node3)๋ก ์ญํ ์ ๋๋ ๋๋ฉด, play๋ณ๋ก ๋์ ๊ทธ๋ฃน์ ๋ค๋ฅด๊ฒ ์ง์ ํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง playbook์๋ ํญ์ play๊ฐ 1๊ฐ์์ต๋๋ค. ํ๋์ ํ์ผ์ play๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ฃ์ผ๋ฉด ๊ทธ๋ฃน๋ณ๋ก ๋ค๋ฅธ ์์ ์ ์์๋๋ก ์ํํ ์ ์์ต๋๋ค.
| task | play | |
|---|---|---|
| ๋จ์ | ๋ฌด์์ ํ๋๋ | ๋๊ตฌ์๊ฒ ๋ฌด์์ ํ๋๋ |
| ๋์ ๋ณ๊ฒฝ | ๋ถ๊ฐ (play์ hosts๋ฅผ ๋ฐ๋ฆ) |
play๋ง๋ค hosts, become, serial ๋ฑ์ ๋ค๋ฅด๊ฒ ์ค์ ๊ฐ๋ฅ |
| ์คํ ์์ | play ์์์ ์ โ ์๋ ์์ฐจ | playbook ์์์ ์ โ ์๋ ์์ฐจ |
task๋ง์ผ๋ก๋ ์ค๊ฐ์ ๋์ ํธ์คํธ๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋์์ด ๋ฐ๋์ด์ผ ํ๋ฉด play๋ฅผ ๋๋ ์ผ ํฉ๋๋ค.
playbook/multi_play.yml:
---
- name: multi playbook primary
hosts: primary
become: true
gather_facts: false
vars:
node_role: "primary"
tasks:
- name: "write {{ node_role }}"
ansible.builtin.copy:
content: "{{ node_role }}\n"
dest: /tmp/role.txt
- name: ํ์ผ ์ฝ๊ธฐ
command: cat /tmp/role.txt
register: result
- name: ๊ฒฐ๊ณผ ์ถ๋ ฅ
debug:
msg: "{{ result.stdout }}"
- name: multi playbook secondary
hosts: secondary
become: true
gather_facts: false
vars:
node_role: "secondary"
tasks:
- name: "write {{ node_role }}"
ansible.builtin.copy:
content: "{{ node_role }}\n"
dest: /tmp/role.txt
- name: ํ์ผ ์ฝ๊ธฐ
command: cat /tmp/role.txt
register: result
- name: ๊ฒฐ๊ณผ ์ถ๋ ฅ
debug:
msg: "{{ result.stdout }}"
YAML ์ต์์๊ฐ ๋ฆฌ์คํธ(-)์ด๋ฏ๋ก, play๋ฅผ ์ฌ๋ฌ ๊ฐ ๋์ดํ๋ฉด ๋ฉ๋๋ค. ์ฃผ์ํ ์ ์ ---(YAML ๋ฌธ์ ๊ตฌ๋ถ์)๋ ํ์ผ ๋งจ ์์ ํ ๋ฒ๋ง ์ด๋ค๋ ๊ฒ์
๋๋ค. play ์ฌ์ด์ ---๋ฅผ ๋ ๋ฃ์ผ๋ฉด ๋ณ๋ YAML ๋ฌธ์๋ก ํด์๋์ด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
PLAY [multi playbook primary] ****************************************************
TASK [write primary] *************************************************************
changed: [node1]
TASK [ํ์ผ ์ฝ๊ธฐ] *****************************************************************
changed: [node1]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node1] => {
"msg": "primary"
}
PLAY [multi playbook secondary] **************************************************
TASK [write secondary] ***********************************************************
changed: [node3]
changed: [node2]
TASK [ํ์ผ ์ฝ๊ธฐ] *****************************************************************
changed: [node3]
changed: [node2]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node2] => {
"msg": "secondary"
}
ok: [node3] => {
"msg": "secondary"
}
Play 1(primary)์ด ์์ ํ ๋๋ ํ Play 2(secondary)๊ฐ ์์๋ฉ๋๋ค. ๊ฐ์ play ์์ ๋ ธ๋๋ค(node2, node3)์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋์ด, ์ถ๋ ฅ ์์๊ฐ node3 โ node2๋ก ๋ค๋ฐ๋ ์๋ ์์ต๋๋ค.
์ ์์ ์์ ๋ play๋ hosts๋ง ๋ค๋ฅด๊ณ task ๊ตฌ์กฐ๋ ๋์ผํฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ inventory์ ๊ทธ๋ฃน ๋ณ์์ node_role์ ์ ์ํ๊ณ , play ํ๋๋ก hosts: managed๋ฅผ ์ฐ๋ ๊ฒ์ด ๋ ๊ฐ๊ฒฐํฉ๋๋ค:
[primary:vars]
node_role=primary
[secondary:vars]
node_role=secondary
๋ฉํฐ play๊ฐ ์ง์ง ํ์ํ ๊ฒฝ์ฐ๋ ๊ทธ๋ฃน๋ณ๋ก task ์์ฒด๊ฐ ๋ค๋ฅผ ๋์ ๋๋ค.
Play 2์ serial: 1์ ์ถ๊ฐํฉ๋๋ค:
- name: multi playbook secondary
hosts: secondary
become: true
gather_facts: false
serial: 1
vars:
node_role: "secondary"
tasks:
...
serial ์์ด ์คํ:
PLAY [multi playbook secondary] **************************************************
TASK [write secondary] ***********************************************************
changed: [node3]
changed: [node2]
node2, node3์ด ๋์์ ์ฒ๋ฆฌ๋ฉ๋๋ค. PLAY ํค๋๊ฐ 1๋ฒ ์ถ๋ ฅ๋ฉ๋๋ค.
serial: 1 ์ถ๊ฐ ํ:
PLAY [multi playbook secondary] **************************************************
TASK [write secondary] ***********************************************************
ok: [node2]
TASK [ํ์ผ ์ฝ๊ธฐ] *****************************************************************
changed: [node2]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node2] => {
"msg": "secondary"
}
PLAY [multi playbook secondary] **************************************************
TASK [write secondary] ***********************************************************
ok: [node3]
TASK [ํ์ผ ์ฝ๊ธฐ] *****************************************************************
changed: [node3]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node3] => {
"msg": "secondary"
}
PLAY [multi playbook secondary]๊ฐ ๋ ๋ฒ ๋์ต๋๋ค. Ansible์ด ๋ด๋ถ์ ์ผ๋ก play๋ฅผ ๋
ธ๋ ์๋งํผ ๋ฐ๋ณต ์คํํ๊ธฐ ๋๋ฌธ์
๋๋ค. node2์ ๋ชจ๋ task๊ฐ ๋๋ ํ์์ผ node3์ด ์์๋ฉ๋๋ค.
serial: 2๋ก ํ๋ฉด 2๋์ฉ ๋ฌถ์ด์ ์ฒ๋ฆฌํฉ๋๋ค. ์
๋ฐ์ดํธ ์ค ์ฅ์ ๊ฐ ๋ฐ์ํด๋ ๋๋จธ์ง ๋
ธ๋๋ ์์ง ๊ฑด๋๋ฆฌ์ง ์์ ์ํ๋ฅผ ์ ์งํ ์ ์์ด, ๋กค๋ง ์
๋ฐ์ดํธ์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค.
serial: 1๋ก Worker ๋
ธ๋๋ฅผ ํ ๋์ฉ ์ํํ๋ฉด์ ์
๊ทธ๋ ์ด๋ํ๋ ์ํฉ์ ์๊ฐํด๋ด
์๋ค. drain(kubectl drain)์ Worker ์์ ์ด ์๋๋ผ kubectl์ด ์ค์น๋ ๋ค๋ฅธ ๋
ธ๋์์ ์คํํด์ผ ํฉ๋๋ค.
delegate_to ์์ด๋ ์ด๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค:
hosts: primary๋ฅผ ๋ง๋ค๋ฉด, "์ง๊ธ ์ด๋ค Worker ์ฐจ๋ก์ธ์ง"๋ผ๋ ์ํ ์ปจํ
์คํธ๊ฐ ๋๊น๋๋ค. drain โ ์
๊ทธ๋ ์ด๋ โ uncordon์ ํ ๋
ธ๋ ๋จ์๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.hosts์ ์ง์ ๋ ๋
ธ๋์์๋ง ์คํ๋๋๊น์.delegate_to๋ฅผ ์ฌ์ฉํ๋ฉด play์ ์ํ ์ปจํ ์คํธ๋ ์ ์งํ๋ฉด์, ํน์ task๋ง ๋ค๋ฅธ ๋ ธ๋์์ ์คํํ ์ ์์ต๋๋ค:
- hosts: secondary
serial: 1
tasks:
- name: drain
command: kubectl drain {{ inventory_hostname }}
delegate_to: node1 # node1์์ ์คํ
- name: ์
๊ทธ๋ ์ด๋
apt: ... # ํ์ฌ ๋
ธ๋์์ ์คํ
- name: uncordon
command: kubectl uncordon {{ inventory_hostname }}
delegate_to: node1 # node1์์ ์คํ
node2 ์ฐจ๋ก์ผ ๋: drain(node1์์) โ ์ ๊ทธ๋ ์ด๋(node2์์) โ uncordon(node1์์). node2๊ฐ ์์ ํ ๋๋์ผ node3์ผ๋ก ๋์ด๊ฐ๋๋ค.
์ฒ์์ delegate_to๋ฅผ play ๋ ๋ฒจ์ ๋ฃ์ผ๋ฉด ๋ค์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค:
[ERROR]: 'delegate_to' is not a valid attribute for a Play
Origin: /workspace/ansible/playbook/delegate.yml:7:3
5 gather_facts: false
6 serial: 1
7 delegate_to: node1
^ column 3
์์ธ: delegate_to๋ task ๋ ๋ฒจ ์์ฑ์
๋๋ค. hosts, become, serial์ฒ๋ผ play ๋ ๋ฒจ์์ ์ธ ์ ์์ต๋๋ค.
ํด๊ฒฐ: ๊ฐ๋ณ task์ delegate_to๋ฅผ ์ง์ ํฉ๋๋ค:
tasks:
- name: delegate_to test
command: hostname
delegate_to: node1 # task ๋ ๋ฒจ
playbook/delegate.yml:
---
- name: delegated playbook
hosts: secondary
become: true
gather_facts: false
serial: 1
tasks:
- name: delegate_to test
command: hostname
delegate_to: node1
register: result
- name: ๊ฒฐ๊ณผ ์ถ๋ ฅ
debug:
msg: "{{ result.stdout }}"
PLAY [delegated playbook] ********************************************************
TASK [delegate_to test] **********************************************************
changed: [node2 -> node1]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node2] => {
"msg": "node1"
}
PLAY [delegated playbook] ********************************************************
TASK [delegate_to test] **********************************************************
changed: [node3 -> node1]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node3] => {
"msg": "node1"
}
[node2 -> node1]์ด ํต์ฌ์
๋๋ค. play์ ๋์์ node2์ด์ง๋ง, ์ค์ hostname ๋ช
๋ น์ node1์์ ์คํ๋์ด ๊ฒฐ๊ณผ๊ฐ node1์
๋๋ค.
PLAY RECAP์ ๋ณด๋ฉด node1์ด ์๋๋ผ node2, node3์ผ๋ก ์ง๊ณ๋ฉ๋๋ค. play์ "ํ์ฌ ํธ์คํธ" ์ปจํ ์คํธ๋ ์ ์ง๋๊ณ , ์คํ๋ง ์์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค์ต ์ค --check ์ต์
์ผ๋ก dry-run์ ์๋ํ๋๋ฐ, command task๊ฐ skipping๋์์ต๋๋ค:
TASK [ํ์ผ ์ฝ๊ธฐ] *****************************************************************
skipping: [node1]
TASK [๊ฒฐ๊ณผ ์ถ๋ ฅ] *****************************************************************
ok: [node1] => {
"msg": ""
}
--check๋ ์ค์ ๋ณ๊ฒฝ์ ํ์ง ์์ผ๋ฏ๋ก, copy๊ฐ ํ์ผ์ ์ฐ์ง ์๊ณ command ๋ชจ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก skip๋ฉ๋๋ค. command, shell ๊ฐ์ ์คํ ๋ชจ๋์ dry-run์์ "์ด๊ฑธ ์ค์ ๋ก ์คํํ๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ์ง" ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
| ๊ฐ๋ | ์ญํ | ๋ ๋ฒจ |
|---|---|---|
| ๋ฉํฐ play | ๊ทธ๋ฃน๋ณ๋ก ๋ค๋ฅธ ์์ ์ ์์๋๋ก ์ํ | playbook ๋ ๋ฒจ |
| serial | play ๋์ ํธ์คํธ๋ฅผ N๋์ฉ ๋๋์ด ์์ฐจ ์ฒ๋ฆฌ | play ๋ ๋ฒจ |
| delegate_to | ์ํ ์ปจํ ์คํธ๋ ์ ์งํ๋ฉด์ ํน์ task๋ง ๋ค๋ฅธ ๋ ธ๋์์ ์คํ | task ๋ ๋ฒจ |
์ด ์ธ ๊ฐ์ง๋ฅผ ์กฐํฉํ๋ฉด, "Phase 1์์๋ A ๊ทธ๋ฃน์์ ์์ ํ๊ณ , Phase 2์์๋ B ๊ทธ๋ฃน์ ํ ๋์ฉ ์ํํ๋ ์ผ๋ถ ๋ช ๋ น์ A์์ ์คํ"ํ๋ ๋ณต์กํ ์ค์ผ์คํธ๋ ์ด์ ์ด ๊ฐ๋ฅํด์ง๋๋ค.