본문 바로가기
Ansible/Study

Ansible - 반복문, 조건문, 핸들러 ,롤 구조

by 식사법 2024. 1. 20.

 

반복문

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

true 일때
false 일때

그 어떤 언어와 같이 엔서블의 조건문 또한 조건연산자를 사용할 수 있다

  • 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'

fqdn과 os 버전이 출력되는 모습

[도전과제 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"

apche2가 설치, 재기동후 정상적으로 msg가 출력되는 모습

롤 구조 소개

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