안녕하세요, 오늘은 2주 차 진행 내용을 가지고 왔습니다.
먼저, 반복문입니다.
1. 반복문
반복문을 사용하면 동일한 모듈을 사용하는 작업을 여러 번 작성하지 않아도 됩니다.
예를 들어 서비스에 필요한 포트를 방화벽에 추가한다고 하면, 포트를 추가하는 작업을 여러 개 작성하는 대신 loop 반복문을 이용해 작업 하나로 여러 개의 포트를 추가할 수 있습니다.
참조 링크 : https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html
여기서 빌트인 모듈을 통해서 실습을 진행했습니다.
#1. ansible.builtin.service
참조 링크 : https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html
loop 키워드를 작업에 추가하면 작업을 반복해야 하는 항목의 목록을 값으로 사용합니다. 그리고 해당하는 값을 사용하려면 item 변수를 이용할 수 있습니다.
1) 플레이북 생성
~/my-ansible/check-services.yml
---
- hosts: all
tasks:
- name: Check sshd state
ansible.builtin.service:
name: sshd
state: started
- name: Check rsyslog state
ansible.builtin.service:
name: rsyslog
state: started
state -
- started : **Start service httpd, if not started**
- stooped : Stop service httpd, if started
- restarted : Restart service httpd, in all cases
- reloaded : Reload service httpd, in all cases
위의 플레이북을 통해서 프로세스가 동작하는지 확인해 봅니다.
위에 볼드체로 되어 있는 것과 같이, state의 started 상태를 확인하는 플레이북입니다.
2) 플레이북 실행
ansible -m shell -a "pstree |grep sshd" all
ansible -m shell -a "pstree |grep rsyslog" all
3) loop 반복문 적용
동일한 내용을 반복문을 적용해 봅시다.
~/my-ansible/check-services1.yml
---
- hosts: all
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop:
- sshd
- rsyslog
위의 내용을 실행하면 다음과 같이 출력됩니다.
4) loop 키워드에 변수명 추가
~/my-ansible/check-services2.yml
---
- hosts: all
vars:
services:
- sshd
- rsyslog
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop: "{{ services }}"
위의 check-services1.yml 플레이북에서 sshd, rsyslog를 loop: "{{ services }}"로 지정해 봅니다.
실행 결과는 다음과 같습니다.
#2. ansible.builtin.file 모듈
참조 링크 : https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html
- 하나의 아이템을 사용할 때도 있지만, 여러 개의 아이템이 필요한 경우가 발생합니다. 예를 들어 여러 개의 사용자 계정을 생성하는 플레이북을 작성한다면 사용자 계정을 생성하기 위해 필요한 이름과 패스워드 등의 여러 항목을 loop 문에서 사전 목록으로 사용할 수 있습니다.
- 여러 개의 아이템을 loop 문에서 사전 목록 dictionary으로 사용해 봅니다.
이번에는 ansible.builtin.file 모듈을 사용하여 사전 목록을 통한 반복을 진행해 보겠습니다.
1) 플레이북 생성
---
- 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'
먼저 위와 같이 플레이북을 만들어 줍니다.
2) 실행
터미널을 하나 더 띄우고, 다음의 명령어를 실행합니다.
<터미널 2>
watch -d "ssh tnode1 ls -l /var/log/test*.log"
<플레이북 실행>
ansible-playbook make-file.yml
터미널2와 터미널 1의 실행 모습입니다.
3) 확인
#3. 반복문과 Register 변수 사용
- Register 변수는 반복 실행되는 작업의 출력을 캡처할 수 있습니다.
생성할 파일 설명
- shell 모듈을 이용하여 “I can speak~”라는 메시지를 출력합니다.
- 이때 loop 키워드를 이용하여 Korean과 English를 할 수 있다고 아이템을 나열합니다.
- 그리고 하단에 register 키워드를 이용하여 실행 결과를 result 변수에 저장합니다.
- 이렇게 저장된 result 변수는 debug 모듈을 통해 해당 내용을 확인합니다.
1) 플레이북 생성
~/my-ansible/loop_register.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:
var: result
2) 실행
register 키워드에 의해 저장된 result 내용에는 대괄호 ([]) 사이에 Key-Value 쌍으로 구성된 결과 값들이 모두 저장됨
ansible-playbook loop_register.yml
여기서 results의 실행 결과는 배열 형식으로 저장된 것을 볼 수 있습니다.
이때 results의 특정 값을 플레이북에서 사용할 경우 loop문을 이용할 수 있습니다.
다음 플레이북을 통해서 debug 모듈에 loop 키워드를 사용하여 result.results를 아이템 변수로 사용해 보겠습니다.
해당 아이템의 stdout의 값을 출력할 때는 item.stdout이라는 변수로 결과값을 출력합니다.
1) 플레이북 생성
~/my-ansible/loop_register1.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 }}"
Return Values : Common
참조 링크 : https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html#common
- stderr : 명령의 표준 에러
- stderr_lines : 표준 에러 출력을 행 단위로 구분한 목록
- stdout : 명령의 표준 출력
- stdout_lines : 표준 출력을 행 단위로 구분한 목록
- rc : ‘return code’ 반환 코드
- msg : 사용자가 전달한 일반 문자열 메시지
2) 실행
ansible-playbook loop_register1.yml
감사합니다.
'DevOps > Ansible' 카테고리의 다른 글
[Ansible 101] 핸들러 및 작업 실패 처리 (0) | 2024.01.21 |
---|---|
[Ansible 101] 조건문 (0) | 2024.01.21 |
[Ansible 101 스터디] 앤서블 1주차 기본 실습 (변수) (6) | 2024.01.14 |
[Ansible 101 스터디] 앤서블 1주차 기본 실습 (인벤토리, 플레이북) (1) | 2024.01.14 |
[Ansible 101 스터디] 왜 앤서블인가, 앤서블 소개, 특징 (1) | 2024.01.14 |