[Ansible] 블록 (Block)DevOps/Ansible2022. 4. 20. 21:52
Table of Contents
728x90
✔️ 블록
블록 - 여러 작업을 묶어놓은 그룹
✔️ 블록의 기능
1. 여러 작업에 공통의 키워드를 부여할 수 있음 (ex. 조건문)
tasks:
- name: Install, configure, and start Apache
block: - name: Install httpd and memcached
ansible.builtin.yum:
name:
- httpd
- memcached
state: present
- name: Apply the foo config template
ansible.builtin.template:
src: templates/src.j2
dest: /etc/foo.conf
- name: Start service bar and enable it
ansible.builtin.service:
name: bar
state: started
enabled: True
when: ansible_facts['distribution'] == 'CentOS'
become: true
become_user: root
ignore_errors: yes
block에 keyword를 부여하면 block 내의 모든 task에 부여되므로 코드 라인을 줄일 수 있다.
2. block
, rescue
, always
블록을 이용해 오류 처리를 할 수 있다.
block
블록은 항상 실행rescue
는block
블록의 오류가 있을 때만 실행always
는 항상 실행
블록문에서 오류가 발생하면 rescue로 분기해 오류를 해결하기 위한 작업을 실행한다.
tasks:
- name: Handle the error
block: - name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure # 일부러 오류를 발생시키는 작업
ansible.builtin.command: /bin/false
- name: Never print this # 후속 작업은 실행하지 않는다.
ansible.builtin.debug: # 태스크가 실패하면 플레이를 중단하고
msg: 'I never execute, due to the above task failing, :-('
rescue:
- name: Print when errors
ansible.builtin.debug: # rescue에 있는 태스크가 실행된다.
msg: 'I caught an error, can do stuff here to fix it, :-)'
python에서의 try, except 구문, java에서의 try, catch 구문과 같다.
✔️ Block always
- name: Always do X
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I never execute :-('
always:
- name: Always do this
ansible.builtin.debug:
msg: "This always executes, :-)"
블록 내 태스크의 실패 유무와 상관없이 always에 있는 태스크는 항상 실행이 된다.
- name: Attempt and graceful roll back demo
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I never execute, due to the above task failing, :-('
rescue:
- name: Print when errors
ansible.builtin.debug:
msg: 'I caught an error'
- name: Force a failure in middle of recovery! >:-)
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I also never execute :-('
always:
- name: Always do this
ansible.builtin.debug:
msg: "This always executes"
블록에서 오류가 발생하지 않으면 rescue는 실행되지 않고 always는 실행되며
블록에서 오류가 발생하면 rescue가 실행되며 always는 항상 실행된다.
예제
/usr/bin/false 의 명령은 항상 fail을 만든다.
- hosts: 192.168.100.11
tasks:
- block:
- debug:
msg: hello world
- command: /usr/bin/false
- debug:
msg: hello world2
ignore_errors: yes
rescue:
- debug:
msg: It's rescue
always:
- debug:
msg: It's Always
결과
[vagrant@controller 05_block]$ ansible-playbook test.yaml
PLAY [192.168.100.11] ***************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [192.168.100.11]
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello world"
}
TASK [command] **********************************************************************************************************************
fatal: [192.168.100.11]: FAILED! => {"changed": true, "cmd": ["/usr/bin/false"], "delta": "0:00:00.004213", "end": "2022-04-18 06:18:07.178442", "msg": "non-zero return code", "rc": 1, "start": "2022-04-18 06:18:07.174229", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "It's rescue"
}
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "It's Always"
}
PLAY RECAP **************************************************************************************************************************
192.168.100.11 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=1 ignored=0
[vagrant@controller 05_block]$ ansible-playbook test.yaml
PLAY [192.168.100.11] ***************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [192.168.100.11]
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello world"
}
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello world2"
}
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "It's Always"
}
PLAY RECAP **************************************************************************************************************************
192.168.100.11 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
✔️ ignore_errors
task가 실패하면 더 이상 후속 작업을 할 수 없는데 ignore_errors를 사용하면 후속 작업을 진행할 수 있다.
- hosts: 192.168.100.11
tasks:
- block:
- debug:
msg: hello world
- command: /usr/bin/false
ignore_errors: yes
- debug:
msg: hello world2
# ignore_errors: yes # 여기에 작성해도 된다.
rescue:
- debug:
msg: It's rescue
always:
- debug:
msg: It's Always
결과
[vagrant@controller 05_block]$ ansible-playbook test.yaml
PLAY [192.168.100.11] ***
TASK [Gathering Facts] **
ok: [192.168.100.11]
TASK [debug] ****
ok: [192.168.100.11] => {
"msg": "hello world"
}
TASK [command] **
fatal: [192.168.100.11]: FAILED! => {"changed": true, "cmd": ["/usr/bin/false"], "delta": "0:00:00.002252", "end": "2022-04-18 06:20:13.333369", "msg": "non-zero return code", "rc": 1, "start": "2022-04-18 06:20:13.331117", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring
TASK [debug] ****
ok: [192.168.100.11] => {
"msg": "hello world2"
}
TASK [debug] ****
ok: [192.168.100.11] => {
"msg": "It's Always"
}
PLAY RECAP **
192.168.100.11 : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
[vagrant@controller 05_block]$
728x90
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] 작업 제어 (Task Controll) (0) | 2022.04.20 |
---|---|
[Ansible] 태그 (Tag) (0) | 2022.04.20 |
[Ansible] 핸들러 (Handler) (0) | 2022.04.20 |
[Ansible] 조건문(Conditionals) (0) | 2022.04.19 |
[Ansible] 반복문(Loops) (0) | 2022.04.19 |
@TTOII :: 뭉게뭉게 클라우드
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!