새소식

IaC/Ansible

[A101 Study 2주차] Ansible 반복문

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 A101 Study 2주차 스터디 내용 정리

 

 

해당 스터디는 '앤서블로 시작하는 인프라 자동화' 책을 기반으로 진행하였습니다.
실습 환경은 저번주와 마찬가지로 'Control Node 1 대 + Target Node 3대' 로 구성하였습니다.

 

이번 글에서는 모든 코드들의 기본이 되는 반복문에 대해서 알아보겠습니다.

 

1. Ansible 반복문

 

실제로 앤서블 플레이북을 통해 자동화 프로세스를 개발하다 보면, 동일한 작업을 여러 번 수행해야 되는 경우가 있습니다.
이런 경우, Ansible 에서 Loop 라는 키워드를 통해 반복문을 사용하면 더욱 효율적으로 플레이북을 작성할 수 있습니다.

 

앤서블에서는 반복하는 아이템의 유형에 따라 '단순 반복문''사전 목록에 의한 반복문' 으로 나뉠 수 있고,
앤서블 버전에 따라 현재 사용되는 'loop 반복문''with 반복문' 으로 나눌 수 있습니다.

 

또한, 앞서 알아보았던 앤서블 작업 변수 (Register) 와 반복문을 함께 사용하여 반복문을 디버깅하거나 이중 반복문을 작성할 수도 있습니다.

 

앤서블 반복 아이템 유형에 따른 반복문 분류
  • 단순 반복문
  • 사전 목록에 의한 반복문

 

앤서블 버전에 따른 반복문 분류
  • loop 반복문
  • with 반복문

 

1.1. 단순 반복문

 

가장 단순한 반복문 형식, 특정 항목(item)에 대한 작업을 반복

 

  • 반복에 사용될 항목은 loop 키워드를 통해 선언하며, item 변수를 반복한다.

 

단순 반복문을 사용한 예시

 

service 모듈을 사용하여 sshdrsyslog 상태를 체크하는 플레이북입니다.

 

---
- hosts: all
  tasks:
    - name: Check sshd and rsyslog state
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
      loop:
        - sshd
        - rsyslog

 

 

 

  • 아래 플레이북처럼 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. 사전 목록에 의한 반복문

 

여러 항목(item)에 대한 작업을 반복, Dictionary 반복

 

  • 반복에 사용될 항목은 loop 키워드를 통해 선언하며, item['key'] 를 통해 반복한다.

 

사전 목록에 의한 반복문을 사용한 예시

 

file 모듈을 사용하여 파일 생성 시, 파일 경로와 파일 권한을 선언하는 플레이북입니다.

 

---
- 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. with 반복문

 

앤서블 2.5 버전 이하에서 사용되던 반복문 형식

 

  • 현재 앤서블 버전에서도 사용이 가능하나 향후 어느 시점부터는 사용되지 않을 것이므로 불가피한 경우가 아니라면 권장하지 않습니다.

 

새로 플레이북을 작성하는 경우라면 'loop 반복문' 사용을 권장합니다.
다만, 'with 반복문' 으로 작성된 플레이북을 분석해야 하는 경우도 있어 'with 반복문'도 알아두시면 도움이 될 것입니다.

 

다음은 'with 반복문' 의 몇 가지 예시입니다.

 

반복문 키워드 설명
with_items 문자열 목록 또는 사전 목록과 같은 단순한 목록의 경우 loop 키워드와 동일하게 작동,
loop와 달리 목록으로 이루어진 목록이 with_items에 제공되는 경우 단일 수준의 목록으로 병합되며,
반복문 변수 item에는 각 반복 작업 중 사용되는 목록 항목이 있음.
with_file 제어 노드의 파일 이름을 목록으로 사용할 경우 사용되며,
반복문 변수 item에는 각 반복 작업 중 파일 목록에 있는 해당 파일의 콘텐츠가 있음.
with_sequence 숫자로 된 순서에 따라 값 목록을 생성하는 매개 변수가 필요한 경우 사용되며,
반복문 변수 item에는 각 반복 작업 중 생성된 순서대로 생성된 항목 중 하나의 값이 있음.

 

with 반복문을 사용한 예시

 

debug 모듈을 사용하여 data 변수에 저장된 항목을 반복하여 출력하는 플레이북입니다.

 

---
- hosts: localhost
  vars:
    data:
      - user0
      - user1
      - user2

  tasks:
    - name: "with_items"
      ansible.builtin.debug:
        msg: "{{ item }}"
      with_items: "{{ data }}"

 

 

현재는 코드 작성과 실행에 큰 차이가 없는 것을 알 수 있습니다.

 

 

1.4. 반복문과 Register 변수 사용

 

작업 변수 (Register) 를 사용하여 반복문을 출력하거나 이중 반복문을 생성

 

  • 반복문 작업 결과를 Register 변수에 등록 후, 다음 작업으로 넘겨줄 수 있습니다.

 

반복문과 Register 변수 사용 예시

 

shell 모듈에 반복문을 사용하여 Korean, English 가 반복되어 실행된 결과를 register 에 등록하고,
이를 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

 

 

이중 반복문 구성 예시

 

아래 코드처럼 작업 변수를 통해 이중 반복문 구성도 가능합니다.

 

---
- 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. 반복문 도전과제

 

앞에서 배운 반복문을 활용해서 주어진 플레이북을 구현해보겠습니다.

 

2.1. Linux User1~10 (10명) 생성

 

반복문을 활용하여 리눅스 유저 10명을 생성해보자

 

# range 함수를 사용한 loop 반복문
---
- hosts: db
  tasks:
    - name: "create users"
      ansible.builtin.user:
        name: "user{{ item }}"
        state: present
      loop: "{{ range(1, 11) | list }}"

 

 

 

2.2. loop 반복문 중 sequence 를 이용하여 /var/log/test1~100 100개 파일(file 모듈)을 생성

 

sequence 반복문 활용

 

# with_squence 를 사용한 loop 반복문
---
- hosts: db
  tasks:
  - name: Create Files
    ansible.builtin.file:
      path: "/var/log/test{{ item }}.log"
      mode: '0600'
      state: touch
    with_sequence: start=1 end=100

 

 


 

반복문을 공부하면서 느낀점 중 한가지는 앤서블 Docs 가 좀 불친절한 편이라는 것입니다.
아직 앤서블에 대해서 몰라서 그런지, 도큐먼트 예시들에 대한 설명이나 코드가 한눈에 잘 들어오지 않습니다.
좀 더 공부해야 되는 부분이지만, 이번 계기로 인해 조금이나마 앤서블 지식이 늘어난 것 같아 뿌듯합니다.

 

참고 문서

 

 

Contents

포스팅 주소를 복사했습니다