IaC(Infrastructure as Code)

Ansible Part. 6 (Loop)

cwchoiit 2024. 3. 18. 13:36
728x90
반응형
SMALL
728x90
SMALL

 

Loop

Ansible Playbook을 작성할 때도 물론 Loop를 사용할 수 있다. 그리고 Ansible에서 기존 방식과 새롭게 생겨난 방식이 있는데 둘 다 알아보겠지만 앞으로 Deprecated되고 더 이상 사용하지 않게 될 가능성도 있으니 앞으로는 새롭게 생겨난 방식으로 코드를 작성해보자.

 

with_<lookup>

아직은 Deprecated 되지 않았지만 추천하지 않는 구 방식인 with_<lookup>을 살펴보자.

- name: Playbook
  hosts: ubuntu
  become: true
  tasks:
    - name: "Create groups"
      group:
        name: "{{ item }}"
        state: "present"
      with_items:
        - backend
        - frontend
        - devops

 

위 코드를 보면 group을 만들어내는 모듈을 사용한다. 여기서 총 세번의 그룹이 만들어진다. with_items라는 키워드로 만들어 낼 그룹 3가지를 위 코드처럼 작성하면 name: "{{ item }}"에서 저 하나하나를 item이 가리키게 된다. 그래서 총 3개의 그룹이 만들어진다. 

 

실행해보자. 

ansible-playbook -i inventory playbook.yaml

 

정상적으로 실행됐으면 Ubuntu 호스트에 들어가서 다음 명령어를 입력해보자.

cat /etc/group

이렇게 총 세개의 그룹이 만들어졌음을 확인할 수 있다. 이렇게 사용하는 방법을 with_<lookup> 이라고 한다.

 

loop

이제 Ansible 공식 문서에서도 이 방법을 추천한다. 그래서 앞으로는 이것만 사용하도록 한다. 

간단하게 loop 키워드에 반복할만큼 데이터를 채워넣으면 된다.

- name: Playbook
  hosts: ubuntu
  become: true
  tasks:
    - name: "Create users"
      user:
        name: "{{ item }}"
        comment: "ansible study"
        state: "present"
      loop:
        - john
        - alice
        - cloud
        - henry
        - jeremy
        - may

데이터를 채워넣고 유저를 생성하는 모듈을 사용해서 name: "{{ item }}"을 사용하면 loop에 채워넣은 데이터를 쭉 돌게 된다.

실행해보자. 다음과 같은 결과를 확인할 수 있다.

 

근데 저렇게 loop에 직접적으로 데이터를 채워넣는 방법도 있지만, 데이터를 변수로 받을 수도 있다. 다음이 그 예시이다.

- name: Playbook
  hosts: ubuntu
  become: true
  vars:
    users:
      - jan
      - ali
      - cow
      - hazard
      - june
  tasks:
    - name: "Create a users"
      user:
        name: "{{ item }}"
        comment: "loop vars"
        state: "present"
      loop: "{{ users }}"

이렇게 작성하고 실행해보자. 다음과 같은 결과를 확인할 수 있다.

 

이제 그냥 단순 문자열 말고 Key/Value 쌍으로 이루어진 값에 대해 반복문도 가능한데, 그럴 때 많이 사용되는 builtIn Function이 'dict2items'이다. 이건 Ansible에서 공식적으로 내장하고 있는 함수인데 다음과 같이 사용할 수 있다.

- name: Playbook
  hosts: ubuntu
  become: true
  vars:
    tags:
      Name: "Debug"
      Environment: "Test"
      Owner: "cwchoiit"
  tasks:
    - name: "Debug data"
      debug:
        msg: "{{ item.key }}: {{ item.value }}"
      loop: "{{ tags | dict2items }}"

 

변수에 tags라는 값으로 Key/Value 쌍의 데이터가 이렇게 있고 Task에 사용되는 loop로 "{{ tags | dict2items }}"라고 작성한 것을 볼 수 있다. 이 구조는 {{ exp | func }}인데, exp의 값을 func 인자로 넘겨주는 표현식이다. 그래서 인자로 넘겨받으면 item이라는 객체에 key와 value에 데이터로 들어가게 된다. 그래서 위 Playbook을 실행해보면 다음과 같은 결과를 얻는다.

Ubuntu 그룹에 호스트가 2개가 있으니까 그리고 alias로 ubuntu1, ubuntu2로 선언했기 때문에 Key/Value 한 쌍이 각각의 호스트에서 한번씩 실행되는것을 알 수 있고 msg값으로 tags에 정의한 "Key: Value"로 표현됨을 알 수 있다. 

 

그리고 이렇게 사용하는 방법을 살짝만 응용하면 다음과 같이도 작성할 수 있다. 

- name: Playbook
  hosts: ubuntu
  become: true
  vars:
    users:
      - name: jan
        shell: /bin/bash
      - name: ali
        shell: /bin/sh
      - name: cow
        shell: /bin/bash
      - name: hazard
        shell: /bin/sh
      - name: june
        shell: /bin/bash
  tasks:
    - name: "Create a user"
      user:
        name: "{{ item.name }}"
        shell: "{{ item.shell }}"
        comment: "cwchoiit-ansible"
        state: "present"
      loop: "{{ users }}"

그리고 이를 실행해보면 다음과 같은 결과를 얻는다.

 

이런 여러 방법을 통해 반복문을 만들어 낼 수 있고 이 외에 문서를 참고하면 더 많은 유스케이스가 있으니 문서를 잘 참조하면 좋을 것 같다.

 

Loops — Ansible Community Documentation

Ansible Community Documentation Ansible Loops Ansible offers the loop, with_ , and until keywords to execute a task multiple times. Examples of commonly-used loops include changing ownership on several files and/or directories with the file module, creatin

docs.ansible.com

 

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

Ansible Part. 7 (Condition)  (0) 2024.03.18
Ansible Part. 5 (Variables)  (0) 2024.03.18
Ansible Part. 4 (Handler)  (0) 2024.03.18
Ansible Part. 3 (Playbook)  (0) 2024.03.18
Ansible Part. 2 (Adhoc)  (3) 2024.03.17