참고
플레이북 반복문 & 조건문
반복문(loop)
NOTE
Ansible에서는 loop를 통해 동일한 모듈을 작성하는 작업을 단순화 할 수 있습니다.
- name: 서비스 상태체크
hosts: all
gather_facts: no
tasks:
- name: 서비스 상태 수집
service_facts:
- name: 서비스 상태 확인
# item으로 반복객체 사용
debug:
msg: "{{ item }} is {{ ansible_facts.services[item + '.service'].state }}"
# 반복대상
loop:
- sshd
- rsyslog
- cron
YAML
복사
loop 예시1
---
- name: 서비스 상태체크
hosts: all
gather_facts: no
tasks:
- name: 파일 생성
file:
path: "{{ item['log-path'] }}"
mode: "{{ item['log-mode'] }}"
state: touch
# 반복요소에 이름지정도 가능
loop:
- log-path: /root/bh/ansible/test1.log
log-mode: '0644'
- log-path: /root/bh/ansible/test.log
log-mode: '0600'
YAML
복사
loop 예시2
---
- name: 인사하기
hosts: all
gather_facts: no
# vars 변수
vars:
hello:
- name: bh1
message: hello1
- name: bh2
message: hello2
# vars 변수를 통해 반복문 진행
tasks:
- name: 인사하기
debug:
msg: "{{ item.name }} {{ item.message }}"
loop: "{{ hello }}"
YAML
복사
loop 예시3
Ansible 2.5버전 이전에는 with_ 접두사 뒤에 여러개의 반복문 키워드를 제공하는 서로 다른 구문의 반복문을 사용했습니다. 아직까지 사용가능은 하지만, 결국 with_로 시작하는 구문은 사용하지 않을 것이므로 사용하지 않는게 좋습니다.
•
with_items: 문자열, 사전 목록과 같이 단순한 목록의 loop키워드와 동일하게 동작
•
with_file: 제어노드의 파일이름을 목록으로 사용하는 경우 사용
•
with_sequence: 숫자로된 순서에 따라 값 목록을 생성하는 매개변수
조건 작업 구문(when)
NOTE
Ansible에서는 when을 사용하여 조건부로 작업을 실행할 수 있습니다.
- hosts: localhost
# 조건문 변수
vars:
run_my_task: true
# 변수가 true이므로 실행
tasks:
- name: debug message
debug:
msg: "echo test"
when: run_my_task
YAML
복사
when 에시1
---
- hosts: localhost
vars:
condition1: true
condition2: false
tasks:
# or 사용
- name: debug message OR
debug:
msg: "echo test"
when:
- condition1 or condition2
# and 사용
- name: debug message AND 1
debug:
msg: "echo test"
when:
- condition1 and condition2
# when 조건은 기본적으로 and이다.
- name: debug message AND 2
debug:
msg: "echo test"
when:
- condition1
- condition2
YAML
복사
when 에시2
- hosts: localhost
vars:
items:
- condition1: true
- condition2: false
tasks:
- name: debug message OR
debug:
msg: "echo test"
when:
- items[0]
- items[1]
# loop의 item을 조건으로 사용한다.
- name: debug message for
debug:
msg: "echo test"
loop: "{{ items }}"
when: item
YAML
복사
when 예시3
핸들러(notify) 및 작업 실패처리
NOTE
Ansible의 핸들러는 다른 작업에서 트리거한 알람에 응답하는 작업이며, 변경될 때만 실행됩니다. notify 키워드를 통해 등록할 수 있습니다.
핸들러는 일반적으로 playbook에 있는 모든 다른 작업이 완료된 후 실행된다. 또한 동작순서는 notify문의 순서가 아닌, handlers에 명시된 순서대로 실행된다.
- hosts: all
tasks:
# notify에 핸들러 이름 등록(changed인 경우에만 실행됨)
- name: 파일 복사
copy:
src: /root/bh/ansible/test.log
dest: /root/bh/ansible/test_copy.log
notify: 변경 알림
handlers:
- name: 변경 알림
debug:
msg: 파일복사 성공
YAML
복사
notift 예시 1
에러 무시(ignore_errors)
Ansible은 기본적으로 작업이 실패하면 이후의 모든 작업을 건너뜁니다. 하지만 작업이 실패해도 ignore_errors 키워드를 설정하면 계속해서 실행되도록 할 수 있습니다.
- hosts: all
tasks:
- name: 파일 복사
copy:
src: /root/bh/ansible/test3.log
dest: /root/bh/ansible/test_copy3.log
notify: 변경 알림
# 에러 무시(에러 발생해도 다음작업이 실행됨)
ignore_errors: yes
- name: 에러무시 확인
debug:
msg: "에러가 무시됨"
handlers:
- name: 변경 알림
debug:
msg: 파일복사 성공
YAML
복사
에러 무시 예시
작업 실패 후 핸들러 실행(force_handlers)
Ansible의 일반적으로 작업이 실패하고 해당 호스트에서 플레이가 중단되면 이전 작업에서 알림을 받은 모든 핸들러가 동작하지 않습니다. 하지만 force_handlers:yes 키워드를 설정하면 이후 작업이 실패해도 알림을 받은 핸들러가 동작합니다.
- hosts: all
# 작업 실패이후에도 핸들러 실행
force_handlers: yes
tasks:
- name: 파일 복사
copy:
src: /root/bh/ansible/test.log
dest: /root/bh/ansible/test_copy4.log
notify: 변경 알림
- name: 실패이후 핸들러 실행여부
fail:
handlers:
- name: 변경 알림
debug:
msg: 파일복사 성공
YAML
복사
force_handlers 작업
작업 실패 조건 지정(failed_when)
Ansible에서는 실행 결과로 에러 메시지를 출력해도 성공했다고 간주합니다. 이런 경우에는 failed_when 키워드를 사용하여 실패한 조건을 지정할 수 있습니다.
- hosts: all
tasks:
- name: 파일 복사
copy:
src: /root/bh/ansible/test.log
dest: /root/bh/ansible/test_copy4.log
notify: 변경 알림
register: copy_result
# 복사가 되지 않은 경우 실패로 간주한다.
failed_when: copy_result.changed == false
- name: 실패이후 핸들러 실행여부
fail:
handlers:
- name: 변경 알림
debug:
msg: 파일복사 성공
YAML
복사
failed_when 작업
Ansible 블록 및 오류 처리(block, rescue, always)
NOTE
Ansible은 block이라는 오류를 제어하는 문법을 제공합니다. block은 논리적으로 그룹화하는 절이며, 실행을 제어하는데 사용됩니다.
- hosts: all
tasks:
- name: 실패이후 핸들러 실행여부
# 작업 공간
block:
- name: 작업
fail:
# 실패시 동작
rescue:
- name: 실패시 동작
debug:
msg: 작업이 실패했다.
# 작업 결과가 나오면 동작
always:
- name: 무조건 동작
debug:
msg: 무조건 실행된다.
YAML
복사
•
block: 실행할 기본 작업을 정의함
•
rescue: block절에 정의된 작업이 실패하는 경우 실행할 작업을 정의한다.
•
always: block & rescue절에 정의된 작업의 성공과 실패여부와 관계없이 항상 실행된다.