Search
Duplicate
📒

[Ansible] 02-3. Playbook 조건/반복, 핸들러/실패 처리

상태
완료
수업
Ansible
주제
4 more properties
참고

플레이북 반복문 & 조건문

반복문(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절에 정의된 작업의 성공과 실패여부와 관계없이 항상 실행된다.