반복문
Ansible 에서 반복문은 기본적으로 loop 키워드를 통해 작성 된다.
일반 개발 문법의 for문 while 문과 비슷하다.
- 반복문 미사용
- 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
- 반복문 사용
- 반복문을 사용할 시 에는 item 변수를 활용한다
---
- hosts: all
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop:
- sshd
- rsyslog
[도전과제 1] linux user1~10(10명) 를 반복문을 통해서 생성 후 확인 후 삭제를 해보자
- hosts: all
tasks:
- name: Create User
ansible.builtin.user:
name: "{{ item }}"
state: present
loop:
- user1
- user2
- user3
- user4
- user5
- user6
- user7
- user8
- user9
- user10
[도전과제 2] loop 반복문 중 sequence 를 이용하여 /var/log/test1 ~ /var/log/test100 100개 파일(file 모듈)을 생성 확인 후 삭제를 해보자
이번에는 register을통해 playbook을 실행하면서 결과값도 확인할수 있도록했다.
- hosts: all
tasks:
- name: Create file
ansible.builtin.file:
path: "/var/log/test{{ item }}"
state: touch
with_sequence: start=1 end=100
- name: Check create file
ansible.builtin.shell:
cmd: ls /var/log/test*
register: result
- name : print
ansible.builtin.debug:
var: result
조건문
Ansible 에서 조건문은 기본적으로 when 키워드를 사용하여 작성된다.
when 뒤에 정의한 상태가 ture or false 인 것을 확인한다
- 단순 반복문
---
- hosts: localhost
vars:
run_my_task: ??
tasks:
- name: echo message
ansible.builtin.shell: "echo test"
when: run_my_task
register: result
- name: Show result
ansible.builtin.debug:
var: result
그 어떤 언어와 같이 엔서블의 조건문 또한 조건연산자를 사용할 수 있다
- Equality Operator:
==
- Inequality Operator:
!=
- Greater Than Operator:
>
- Greater Than or Equal To Operator:
>=
- Less Than Operator:
<
- Less Than or Equal To Operator:
<=
- Logical AND Operator:
and
- Logical OR Operator:
or
- Logical NOT Operator:
not
- Existence Check Operator:
is defined
- Regex Match Operator:
matches
- List Contains Operator:
in
또한 or , ans 연산자를 통해 여러 조건 문을 혼합할 수 있다.
하단 도전과제에서 사용해 보겠다.
[도전과제 3] Ubuntu OS이면서 fqdn으로 tnode1 인 경우, debug 모듈을 사용하여 OS 정보와 fqdn 정보를 출력해보자
- hosts: all
tasks:
- name: if fqdn same as tnode1 and os is ubuntu it will work
debug:
msg: "OS: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}, FQDN: {{ ansible_facts['fqdn'] }}"
when:
- ansible_facts['distribution'] == 'Ubuntu' and ansible_facts['fqdn'] == 'ip-10-10-1-11.ap-northeast-2.compute.internal'
[도전과제 4] 0~10 까지 2씩 건너 뛰며 5보다 큰 값 출력
- hosts: all
tasks:
- name: Up than 5
ansible.builtin.command: echo {{ item }}
loop: "{{ range(0, 11, 2) }}"
when: item > 5
핸들러
- 앤서블 모듈은 멱등(idempotent)이 가능하도록 설계되어 있습니다. 즉 플레이북을 여러 번 실행해도 결과는 항상 동일합니다. 또한 플레이 및 해당 작업은 여러 번 실행할 수 있지만, 해당 호스트는 원하는 상태로 만드는 데 필요한 경우에만 변경됩니다.
- 하지만 한 작업에서 시스템을 변경해야 하는 경우 추가 작업을 실행해야 할 수도 있습니다. 예를 들어 서비스의 구성 파일을 변경하려면 변경 내용이 적용되도록 서비스를 다시 로드해야 합니다. 이때 핸들러는 다른 작업에서 트리거한 알림에 응답하는 작업이며, 해당 호스트에서 작업이 변경될 때만 핸들러에 통지합니다.
[도전 과제 5] - apache2 패키지를 apt 모듈을 통해서 설치 시, 핸들러를 호출하여 service 모듈로 apache2를 재시작 해보자
ansible.builtin.apt
모듈 - https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_module.html
핸들러에서 핸들러를 호출 가능하다
- hosts: tnode1
tasks:
- name: Install Apache2
ansible.builtin.apt:
name: apache2
state: present
notify: restart apache2
handlers:
- name: restart apache2
ansible.builtin.service:
name: apache2
state: restarted
notify: restart msg
- name : restart msg
ansible.builtin.debug:
msg: "Restart Apache2"
롤 구조 소개
Roles
- https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html
롤이란 앤서블을 다른 사람들과 공유 및 동시 작업을 용이해주게 하는 기능이빈다.
제가 이해한 바로는 개발자들이 VCS 를 사용하면서 working공간을 나누어 작업하는 것과 비슷한 개념으로 이해하였습니다
우선 앤서블 role을 생성하게 된다면 기본적으로 하단 구조로 공간을 나누어 줍니다
#
ansible-galaxy role init my-role
- Role my-role was created successfully
#
tree ./my-role/
my-role/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
각각의 폴더의 역할은 하단의 표와 같습니다
'Ansible > Study' 카테고리의 다른 글
Ansible - 보안설정/ 모니터링 자동화 (1) | 2024.02.12 |
---|---|
시스템 구축 및 환경 설정 자동화 (0) | 2024.02.04 |
Ansible 기초 정리 (0) | 2024.01.09 |