1. 반복문
Ansible Loops
- 반복문을 사용하면 동일한 모듈을 사용하는 작업을 여러 번 작성하지 않아도 됩니다.
- ex) 서비스에 필요한 여러 개의 포트를 방화벽에 추가할 때,
1.1 단순 반복문
반복문을 사용하여 ansible.builtin.service
모듈을 통해 여러 개의 서비스를 구동해봅니다.
loop
작업을 반복해야 하는 목록을 정의합니다.{{ item }}
해당하는 값을 item 변수로 사용할 수 있습니다.
check-services.yml
---
- hosts: all
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop:
- sshd
- rsyslog
check-services-with-vars.yml
- loop문에 사용하는 아이템을 변수에 저장하여 사용할 수 있습니다.
---
- hosts: all
vars:
services:
- sshd
- rsyslog
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop: "{{ services }}"
작성한 플레이북을 실행하고 결과를 확인합니다.
1.2 사전 목록에 의한 반복문
하나의 아이템이 아닌, 여러 개의 아이템이 필요한 경우 loop 문에서 사전 목록(dictionary)을 사용할 수 있습니다.
- 사용자 계정을 생성할 때, 사용할 필요한 여러 개의 항목이 필요합니다.
- 이름
- 패스워드
- 등등
make-file.ymlansible.builtin.file
모듈을 통해 파일을 생성을 생성하고 권한을 부여합니다.
{{ item['log-path'] }}
파일 위치{{ item['log-mode'] }}
파일 권한
---
- hosts: all
tasks:
- name: Create files
ansible.builtin.file:
path: "{{ item['log-path'] }}"
mode: "{{ item['log-mode'] }}"
state: touch
loop:
- log-path: /var/log/test1.log
log-mode: '0644'
- log-path: /var/log/test2.log
log-mode: '0600'
작성한 플레이북을 실행하고 결과를 확인합니다.

1.3 반복문과 Register 변수 사용
반복 실행되는 작업 또한, Register 변수를 통해 작업이 잘 수행되었는지 확인할 수 있습니다.
loop_register.yml
- register 키워드를 이용하여 실행 결과를 result변수에 저장합니다.
- 저장된 result 변수는 debug 모듈을 통해 해당 내용을 확인합니다.
---
- hosts: localhost
tasks:
- name: Loop echo test
ansible.builtin.shell: "echo 'I can speak {{ item }}'"
loop:
- Korean
- English
register: result
- name: Show result
ansible.builtin.debug:
var: result
작성한 플레이북을 실행하고 결과를 확인합니다.
앞서 실행 결과인 result내의 results는 배열 형식으로 저장된 것을 볼 수 있는데, 이때 results의 특정 값을 플레이북에서 사용할 경우 loop문을 이용할 수 있습니다.
- debug 모듈에서 loop 키워드를 사용하하여 result.results를 아이템 변수로 사용
item.stdout
아이템 결과를 stdout으로 값을 출력
loop_register-stdout.yml
---
- hosts: localhost
tasks:
- name: Loop echo test
ansible.builtin.shell: "echo 'I can speak {{ item }}'"
loop:
- Korean
- English
register: result
- name: Show result
ansible.builtin.debug:
msg: "Stdout: {{ item.stdout }}"
loop: "{{ result.results }}"
작성한 플레이북을 실행하고 결과를 확인합니다.
2. 조건문
앤서블은 조건문을 사용하여 특정 조건이 충족될 때 작업 또는 플레이북을 실행할 수 있습니다.
- ex) 호스트의 운영체제 버전에 해당하는 서비스를 설치할 경우,
- 조건문 사용 시, 플레이 변수, 작업 변수, 앤서블 팩트 등을 사용할 수 있습니다.
2.1 조건 작업 구문
when
- when문이 true인지 false인지 여부에 따라 작업이 실행되거나 건너뜁니다.
when_task.yml
---
- hosts: localhost
vars:
run_my_task: false
tasks:
- name: echo message
ansible.builtin.shell: "echo test"
when: run_my_task
register: result
- name: Show result
ansible.builtin.debug:
var: result
run_my_task 변수에 true 값, when 문에서 run_my_task를 사용하면 true인 경우에만 작업이 실행됩니다.
- false인 경우, 해당 태스트가 수행되지 않고 건너뜀(skipping)
2.2 조건 연산자
when 문에 boolean 변수(true,false) 외에도 조건 연산자를 사용할 수 있습니다.
!= | 값이 같지 않을때 true |
---|---|
>, >=, <=, < | '초과', '이상', '이하', '미만'일 때, true |
not | 조건의 부정 |
and, or | '그리고', '또는'의 의미로 여러 조건의 조합 기능 |
in | 값이 포함된 경우 true |
is defined | 변수가 정의된 경우 true |
OS 종류에 따라 테스크를 수행합니다.
in
연산자
- 팩트(ansible_facts['distribution'])에서 플레이변수(supported_distos)가 포함된 경우 테스크 수행
check-os.yml
---
- hosts: all
vars:
supported_distos:
- Ubuntu
- CentOS
tasks:
- name: Print supported OS
ansible.builtin.debug:
msg: "This {{ ansible_facts['distribution']}} need to use apt"
when: ansible_facts['distribution'] in supported_distos
2.3 복수 조건문
when문은 단일 조건문 뿐만 아니라, 복수 조건문도 사용할 수 있습니다.
- ex) 운영체제가 Ubuntu이고 서버타입이 x86_64일 경우에만 작업이 실행되도록 구성
check-os.yaml
- or 구문 사용
---
- hosts: all
tasks:
- name: Print os type
ansible.builtin.debug:
msg: "OS Type {{ ansible_facts['distribution'] }}"
when: ansible_facts['distribution'] == "CentOS" or ansible_facts['distribution'] == "Ubuntu"
플레이북을 실행합니다.
Ubuntu이고, Version이 22.04의 경우에만 작업이 수행되도록 and 연산자를 사용합니다.
when: ansible_facts['distribution'] == "Ubuntu" and ansible_facts['distribution_version'] == "22.04"
and 연산자와 or 연산자를 함께 사용할 수도 있습니다.
when: >
( ansible_facts['distribution'] == "CentOS" and
ansible_facts['distribution_version'] == "8" )
or
( ansible_facts['distribution'] == "Ubuntu" and
ansible_facts['distribution_version'] == "22.04" )
3. 핸들러 및 작업 실패 처리
한 작업에서 시스템을 변경해야 하는 경우, 추가 작업을 실행해야 하는 경우가 있습니다. 예를 들어 서비스의 구성 파일을 변경하려면 변경 내용이 적용되도록 서비스를 다시 로드해야 합니다.
이때, 핸들러는 다른 작업에서 트리거한 알림에 응답하는 작업이며, 해당 호스트에 작업이 변경될 때만 핸들러에 통지합니다.
3.1 핸들러
handler
키워드로 핸들러를 정의하고,notify
키워드를 통해 정의한 핸들러 호출합니다.- 여러 개의 핸들러 정의 시, 각각의 고유한 이름을 사용하여 정의하는 것이 좋습니다.
handler-sample.yml
---
- hosts: tnode2
tasks:
- name: restart rsyslog
ansible.builtin.service:
name: "rsyslog"
state: restarted
notify:
- print msg
handlers:
- name: print msg
ansible.builtin.debug:
msg: "rsyslog is restarted"
syslog 서비스를 재시작하고, print msg라는 핸들러를 호출해 메시지 출력합니다.
3.2 작업 실패 무시
- 앤서블은 일반적으로 작업이 실패하면 이후의 모든 작업을 건너뜁니다.
- 하지만, 작업이 실패해도
ignore_errors
키워드를 통해 플레이북을 계속 실행할 수 있습니다.
실제로 존재하지 않는 apache3 패키지를 설치시도 하여 실패를 유도하고, 작업 실패를 무시해봅니다.
---
- hosts : tnode1
tasks:
- name: Install apache3
ansible.builtin.apt:
name: apache3
state: latest
ignore_errors: yes
- name: Print msg
ansible.builtin.debug:
msg: "Before task is ignored"
플레이북이 중단되지 않고 작업 결과 로그와 메시지까지 잘 출력되는 것을 볼 수 있습니다.
3.3 작업 실패 후 핸들러 실행
- 앤서블은 일반적으로 작업이 실패하고 해당 호스트에서 플레이가 중단되면 이전 작업에서 알림을 받은 모든 핸들러가 실행되지 않습니다.
- 하지만,
force_handlers: yes
키워드를 설정하면 작업이 실패하여 플레이가 중단되어도 알림을 받은 핸들러가 호출됩니다.
force-handler.yml
- hosts 아래 force_handlers: yes 를 추가하고, install apache2 태스크를 추가합니다
---
- hosts: tnode2
force_handlers: yes
tasks:
- name: restart rsyslog
ansible.builtin.service:
name: "rsyslog"
state: restarted
notify:
- print msg
- name: install apache3
ansible.builtin.apt:
name: "apache3"
state: latest
handlers:
- name: print msg
ansible.builtin.debug:
msg: "rsyslog is restarted"
작업이 실패하여 플레이는 중단되었지만, 알림을 받은 핸들러는 호출이 된 것을 볼 수 있습니다.
3.4 작업 실패 조건 지정
- 앤서블이 쉘 스크립트를 실행한 뒤 결과를 실패 또는 에러 메시지를 출력해도, 앤서블에서는 작업이 성공했다고 간주합니다.
- 어떠한 명령어이라도 실행 시, 테스크를 changed로 합니다.
- 이런 경우,
failed_when
키워드를 사용하여 작업이 실패했음을 나태는 조건을 지정할 수 있습니다.
먼저, 사용자 계정과 패스워드를 매개변수로 입력받아 계정을 생성해주는 스크립트를 작성합니다.
adduser-script.sh
#!/bin/bash
# 사용자 계정 및 패스워드가 입력되었는지 확인
if [[ -n $1 ]] && [[ -n $2 ]]
then
UserList=($1)
Password=($2)
# for문을 이용하여 사용자 계정 생성
for (( i=0; i < ${#UserList[@]}; i++ ))
do
# if문을 사용하여 사용자 계정이 있는지 확인
if [[ $(cat /etc/passwd | grep ${UserList[$i]} | wc -l) == 0 ]]
then
# 사용자 생성 및 패스워드 설정
useradd ${UserList[$i]}
echo ${Password[$i]} | passwd ${UserList[$i]} --stdin
else
# 사용자가 있다고 메시지를 보여줌.
echo "this user ${UserList[$i]} is existing."
fi
done
else
# 사용자 계정과 패스워드를 입력하라는 메시지를 보여줌.
echo -e 'Please input user id and password.\nUsage: adduser-script.sh "user01 user02" "pw01 pw02"'
fi
shell 모듈로 이전에 작성한 스크립트를 실행하도록 합니다.
failed-when.yml
---
- hosts: localhost
tasks:
- name: Run user add script
ansible.builtin.shell: /home/ubuntu/my-ansible/adduser-script.sh
register: command_result
- name: Print msg
ansible.builtin.debug:
msg: "{{ command_result.stdout }}"
-v
옵션을 통하여 플레이북 결과를 상세하게 확인해보니, Please input user id and password
라는 경고문이 출력되고 스크립트가 성공하지 않았지만, 앤서블에서는 작업이 성공했다고 간주되는 것을 볼 수 있습니다.
failed_when
조건식을 통해 작업 실패 조건을 지정합니다.
- command_result.stdout 변수에 “Please…”라는 문자열이 있으면 작업을 실패(fail)로 처리하겠다는 의미
failed-when2.yml
따라서, 앤서블 사용 시, 쉘 스크립트 보다는 모듈을 사용하여 앤서블의 장점을 활용하는 것이 좋습니다.
3.5 앤서블 블록 및 오류처리
앤서블은 블록 block 이라는 오류를 제어하는 문법을 제공합니다. 블록은 작업을 논리적으로 그룹화하는 절이며, 작업 실행 방법을 제어하는 데 사용할 수 있습니다. 또한 블록을 통해 rescue
문과 always
문을 함께 사용함으로써 오류를 처리할 수 있습니다.
block
: 실행할 기본 작업을 정의함rescure
: block 절에 정의된 작업이 실패할 경우 실행할 작업을 정의함always
: block 및 rescue 절에 정의된 작업의 성공 또는 실패 여부와 관계 없이 항상 실행되는 작업을 정의함
block-example.yml
- block 구문에서 failed_when 구문을 사용하여 result.msg 변수에 “Not..” 메시지 발견되면 실패 처리함
- rescue 구문은 block 정의 작업이 실패 시 실행되며, 해당 디렉터리가 없는 경우 생성함
- always 구문은 항상 실행되며, 여기서는 로그 파일을 생성함
---
- hosts: tnode2
vars:
logdir: /var/log/daily_log
logfile: todays.log
tasks:
- name: Configure Log Env
block:
- name: Find Directory
ansible.builtin.find:
paths: "{{ logdir }}"
register: result
failed_when: "'Not all paths' in result.msg"
rescue:
- name: Make Directory when Not found Directory
ansible.builtin.file:
path: "{{ logdir }}"
state: directory
mode: '0755'
always:
- name: Create File
ansible.builtin.file:
path: "{{ logdir }}/{{ logfile }}"
state: touch
mode: '0644'
block구문에서 작업이 실패하여 resuce구문의 작업이 수행된 것을 확인할 수 있습니다.
한번 더 실행 시에 block구문과 always구문만 작업이 수행된 것을 볼 수 있습니다.
'Automation > Ansible' 카테고리의 다른 글
앤서블(Ansible) 세마포어(Semaphore UI) - 4주차_2 (3) | 2024.02.08 |
---|---|
앤서블(Ansible) 보안설정 및 모니터링 자동화 - 4주차 (0) | 2024.02.08 |
앤서블(Ansible) 롤과 인프라 구성 자동화 - 3주차 (0) | 2024.02.04 |
앤서블(Ansible) 개념 및 기본 사용 - 1주차 (2) | 2024.01.12 |
1. 반복문
Ansible Loops
- 반복문을 사용하면 동일한 모듈을 사용하는 작업을 여러 번 작성하지 않아도 됩니다.
- ex) 서비스에 필요한 여러 개의 포트를 방화벽에 추가할 때,
1.1 단순 반복문
반복문을 사용하여 ansible.builtin.service
모듈을 통해 여러 개의 서비스를 구동해봅니다.
loop
작업을 반복해야 하는 목록을 정의합니다.{{ item }}
해당하는 값을 item 변수로 사용할 수 있습니다.
check-services.yml
---
- hosts: all
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop:
- sshd
- rsyslog
check-services-with-vars.yml
- loop문에 사용하는 아이템을 변수에 저장하여 사용할 수 있습니다.
---
- hosts: all
vars:
services:
- sshd
- rsyslog
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop: "{{ services }}"
작성한 플레이북을 실행하고 결과를 확인합니다.
1.2 사전 목록에 의한 반복문
하나의 아이템이 아닌, 여러 개의 아이템이 필요한 경우 loop 문에서 사전 목록(dictionary)을 사용할 수 있습니다.
- 사용자 계정을 생성할 때, 사용할 필요한 여러 개의 항목이 필요합니다.
- 이름
- 패스워드
- 등등
make-file.ymlansible.builtin.file
모듈을 통해 파일을 생성을 생성하고 권한을 부여합니다.
{{ item['log-path'] }}
파일 위치{{ item['log-mode'] }}
파일 권한
---
- hosts: all
tasks:
- name: Create files
ansible.builtin.file:
path: "{{ item['log-path'] }}"
mode: "{{ item['log-mode'] }}"
state: touch
loop:
- log-path: /var/log/test1.log
log-mode: '0644'
- log-path: /var/log/test2.log
log-mode: '0600'
작성한 플레이북을 실행하고 결과를 확인합니다.

1.3 반복문과 Register 변수 사용
반복 실행되는 작업 또한, Register 변수를 통해 작업이 잘 수행되었는지 확인할 수 있습니다.
loop_register.yml
- register 키워드를 이용하여 실행 결과를 result변수에 저장합니다.
- 저장된 result 변수는 debug 모듈을 통해 해당 내용을 확인합니다.
---
- hosts: localhost
tasks:
- name: Loop echo test
ansible.builtin.shell: "echo 'I can speak {{ item }}'"
loop:
- Korean
- English
register: result
- name: Show result
ansible.builtin.debug:
var: result
작성한 플레이북을 실행하고 결과를 확인합니다.
앞서 실행 결과인 result내의 results는 배열 형식으로 저장된 것을 볼 수 있는데, 이때 results의 특정 값을 플레이북에서 사용할 경우 loop문을 이용할 수 있습니다.
- debug 모듈에서 loop 키워드를 사용하하여 result.results를 아이템 변수로 사용
item.stdout
아이템 결과를 stdout으로 값을 출력
loop_register-stdout.yml
---
- hosts: localhost
tasks:
- name: Loop echo test
ansible.builtin.shell: "echo 'I can speak {{ item }}'"
loop:
- Korean
- English
register: result
- name: Show result
ansible.builtin.debug:
msg: "Stdout: {{ item.stdout }}"
loop: "{{ result.results }}"
작성한 플레이북을 실행하고 결과를 확인합니다.
2. 조건문
앤서블은 조건문을 사용하여 특정 조건이 충족될 때 작업 또는 플레이북을 실행할 수 있습니다.
- ex) 호스트의 운영체제 버전에 해당하는 서비스를 설치할 경우,
- 조건문 사용 시, 플레이 변수, 작업 변수, 앤서블 팩트 등을 사용할 수 있습니다.
2.1 조건 작업 구문
when
- when문이 true인지 false인지 여부에 따라 작업이 실행되거나 건너뜁니다.
when_task.yml
---
- hosts: localhost
vars:
run_my_task: false
tasks:
- name: echo message
ansible.builtin.shell: "echo test"
when: run_my_task
register: result
- name: Show result
ansible.builtin.debug:
var: result
run_my_task 변수에 true 값, when 문에서 run_my_task를 사용하면 true인 경우에만 작업이 실행됩니다.
- false인 경우, 해당 태스트가 수행되지 않고 건너뜀(skipping)
2.2 조건 연산자
when 문에 boolean 변수(true,false) 외에도 조건 연산자를 사용할 수 있습니다.
!= | 값이 같지 않을때 true |
---|---|
>, >=, <=, < | '초과', '이상', '이하', '미만'일 때, true |
not | 조건의 부정 |
and, or | '그리고', '또는'의 의미로 여러 조건의 조합 기능 |
in | 값이 포함된 경우 true |
is defined | 변수가 정의된 경우 true |
OS 종류에 따라 테스크를 수행합니다.
in
연산자
- 팩트(ansible_facts['distribution'])에서 플레이변수(supported_distos)가 포함된 경우 테스크 수행
check-os.yml
---
- hosts: all
vars:
supported_distos:
- Ubuntu
- CentOS
tasks:
- name: Print supported OS
ansible.builtin.debug:
msg: "This {{ ansible_facts['distribution']}} need to use apt"
when: ansible_facts['distribution'] in supported_distos
2.3 복수 조건문
when문은 단일 조건문 뿐만 아니라, 복수 조건문도 사용할 수 있습니다.
- ex) 운영체제가 Ubuntu이고 서버타입이 x86_64일 경우에만 작업이 실행되도록 구성
check-os.yaml
- or 구문 사용
---
- hosts: all
tasks:
- name: Print os type
ansible.builtin.debug:
msg: "OS Type {{ ansible_facts['distribution'] }}"
when: ansible_facts['distribution'] == "CentOS" or ansible_facts['distribution'] == "Ubuntu"
플레이북을 실행합니다.
Ubuntu이고, Version이 22.04의 경우에만 작업이 수행되도록 and 연산자를 사용합니다.
when: ansible_facts['distribution'] == "Ubuntu" and ansible_facts['distribution_version'] == "22.04"
and 연산자와 or 연산자를 함께 사용할 수도 있습니다.
when: >
( ansible_facts['distribution'] == "CentOS" and
ansible_facts['distribution_version'] == "8" )
or
( ansible_facts['distribution'] == "Ubuntu" and
ansible_facts['distribution_version'] == "22.04" )
3. 핸들러 및 작업 실패 처리
한 작업에서 시스템을 변경해야 하는 경우, 추가 작업을 실행해야 하는 경우가 있습니다. 예를 들어 서비스의 구성 파일을 변경하려면 변경 내용이 적용되도록 서비스를 다시 로드해야 합니다.
이때, 핸들러는 다른 작업에서 트리거한 알림에 응답하는 작업이며, 해당 호스트에 작업이 변경될 때만 핸들러에 통지합니다.
3.1 핸들러
handler
키워드로 핸들러를 정의하고,notify
키워드를 통해 정의한 핸들러 호출합니다.- 여러 개의 핸들러 정의 시, 각각의 고유한 이름을 사용하여 정의하는 것이 좋습니다.
handler-sample.yml
---
- hosts: tnode2
tasks:
- name: restart rsyslog
ansible.builtin.service:
name: "rsyslog"
state: restarted
notify:
- print msg
handlers:
- name: print msg
ansible.builtin.debug:
msg: "rsyslog is restarted"
syslog 서비스를 재시작하고, print msg라는 핸들러를 호출해 메시지 출력합니다.
3.2 작업 실패 무시
- 앤서블은 일반적으로 작업이 실패하면 이후의 모든 작업을 건너뜁니다.
- 하지만, 작업이 실패해도
ignore_errors
키워드를 통해 플레이북을 계속 실행할 수 있습니다.
실제로 존재하지 않는 apache3 패키지를 설치시도 하여 실패를 유도하고, 작업 실패를 무시해봅니다.
---
- hosts : tnode1
tasks:
- name: Install apache3
ansible.builtin.apt:
name: apache3
state: latest
ignore_errors: yes
- name: Print msg
ansible.builtin.debug:
msg: "Before task is ignored"
플레이북이 중단되지 않고 작업 결과 로그와 메시지까지 잘 출력되는 것을 볼 수 있습니다.
3.3 작업 실패 후 핸들러 실행
- 앤서블은 일반적으로 작업이 실패하고 해당 호스트에서 플레이가 중단되면 이전 작업에서 알림을 받은 모든 핸들러가 실행되지 않습니다.
- 하지만,
force_handlers: yes
키워드를 설정하면 작업이 실패하여 플레이가 중단되어도 알림을 받은 핸들러가 호출됩니다.
force-handler.yml
- hosts 아래 force_handlers: yes 를 추가하고, install apache2 태스크를 추가합니다
---
- hosts: tnode2
force_handlers: yes
tasks:
- name: restart rsyslog
ansible.builtin.service:
name: "rsyslog"
state: restarted
notify:
- print msg
- name: install apache3
ansible.builtin.apt:
name: "apache3"
state: latest
handlers:
- name: print msg
ansible.builtin.debug:
msg: "rsyslog is restarted"
작업이 실패하여 플레이는 중단되었지만, 알림을 받은 핸들러는 호출이 된 것을 볼 수 있습니다.
3.4 작업 실패 조건 지정
- 앤서블이 쉘 스크립트를 실행한 뒤 결과를 실패 또는 에러 메시지를 출력해도, 앤서블에서는 작업이 성공했다고 간주합니다.
- 어떠한 명령어이라도 실행 시, 테스크를 changed로 합니다.
- 이런 경우,
failed_when
키워드를 사용하여 작업이 실패했음을 나태는 조건을 지정할 수 있습니다.
먼저, 사용자 계정과 패스워드를 매개변수로 입력받아 계정을 생성해주는 스크립트를 작성합니다.
adduser-script.sh
#!/bin/bash
# 사용자 계정 및 패스워드가 입력되었는지 확인
if [[ -n $1 ]] && [[ -n $2 ]]
then
UserList=($1)
Password=($2)
# for문을 이용하여 사용자 계정 생성
for (( i=0; i < ${#UserList[@]}; i++ ))
do
# if문을 사용하여 사용자 계정이 있는지 확인
if [[ $(cat /etc/passwd | grep ${UserList[$i]} | wc -l) == 0 ]]
then
# 사용자 생성 및 패스워드 설정
useradd ${UserList[$i]}
echo ${Password[$i]} | passwd ${UserList[$i]} --stdin
else
# 사용자가 있다고 메시지를 보여줌.
echo "this user ${UserList[$i]} is existing."
fi
done
else
# 사용자 계정과 패스워드를 입력하라는 메시지를 보여줌.
echo -e 'Please input user id and password.\nUsage: adduser-script.sh "user01 user02" "pw01 pw02"'
fi
shell 모듈로 이전에 작성한 스크립트를 실행하도록 합니다.
failed-when.yml
---
- hosts: localhost
tasks:
- name: Run user add script
ansible.builtin.shell: /home/ubuntu/my-ansible/adduser-script.sh
register: command_result
- name: Print msg
ansible.builtin.debug:
msg: "{{ command_result.stdout }}"
-v
옵션을 통하여 플레이북 결과를 상세하게 확인해보니, Please input user id and password
라는 경고문이 출력되고 스크립트가 성공하지 않았지만, 앤서블에서는 작업이 성공했다고 간주되는 것을 볼 수 있습니다.
failed_when
조건식을 통해 작업 실패 조건을 지정합니다.
- command_result.stdout 변수에 “Please…”라는 문자열이 있으면 작업을 실패(fail)로 처리하겠다는 의미
failed-when2.yml
따라서, 앤서블 사용 시, 쉘 스크립트 보다는 모듈을 사용하여 앤서블의 장점을 활용하는 것이 좋습니다.
3.5 앤서블 블록 및 오류처리
앤서블은 블록 block 이라는 오류를 제어하는 문법을 제공합니다. 블록은 작업을 논리적으로 그룹화하는 절이며, 작업 실행 방법을 제어하는 데 사용할 수 있습니다. 또한 블록을 통해 rescue
문과 always
문을 함께 사용함으로써 오류를 처리할 수 있습니다.
block
: 실행할 기본 작업을 정의함rescure
: block 절에 정의된 작업이 실패할 경우 실행할 작업을 정의함always
: block 및 rescue 절에 정의된 작업의 성공 또는 실패 여부와 관계 없이 항상 실행되는 작업을 정의함
block-example.yml
- block 구문에서 failed_when 구문을 사용하여 result.msg 변수에 “Not..” 메시지 발견되면 실패 처리함
- rescue 구문은 block 정의 작업이 실패 시 실행되며, 해당 디렉터리가 없는 경우 생성함
- always 구문은 항상 실행되며, 여기서는 로그 파일을 생성함
---
- hosts: tnode2
vars:
logdir: /var/log/daily_log
logfile: todays.log
tasks:
- name: Configure Log Env
block:
- name: Find Directory
ansible.builtin.find:
paths: "{{ logdir }}"
register: result
failed_when: "'Not all paths' in result.msg"
rescue:
- name: Make Directory when Not found Directory
ansible.builtin.file:
path: "{{ logdir }}"
state: directory
mode: '0755'
always:
- name: Create File
ansible.builtin.file:
path: "{{ logdir }}/{{ logfile }}"
state: touch
mode: '0644'
block구문에서 작업이 실패하여 resuce구문의 작업이 수행된 것을 확인할 수 있습니다.
한번 더 실행 시에 block구문과 always구문만 작업이 수행된 것을 볼 수 있습니다.
'Automation > Ansible' 카테고리의 다른 글
앤서블(Ansible) 세마포어(Semaphore UI) - 4주차_2 (3) | 2024.02.08 |
---|---|
앤서블(Ansible) 보안설정 및 모니터링 자동화 - 4주차 (0) | 2024.02.08 |
앤서블(Ansible) 롤과 인프라 구성 자동화 - 3주차 (0) | 2024.02.04 |
앤서블(Ansible) 개념 및 기본 사용 - 1주차 (2) | 2024.01.12 |