[Ansible] 06. Loop (1)

Date:     Updated:

카테고리:

태그:

[Ansible] 06. Loop (1)


🔔 자세한 모듈 내용은 아래 문서를 참고

모듈 내용 : https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#modules

예제 Github : https://github.com/revenge1005/Ansible_study


🔔 Loop

  • Ansible 2.4 까지는 with_* 키워드를 사용하여 작업 하였는데, 2.5 부터는 loop 키워드를 사용

  • with_* 는 여러가지 반복문을 완전히 대체하는 것은 아니지만, 거의 대부분 loop에서도 유효 함

  • 패키지 관련된 모듈은 반복문을 쓰지 않을것을 권장


📜 1. Standard Loops - with_items

# with_items를 사용하여 기본 loop 지정할 있으며, 
# 각 반복에 해당하는 값은 으로 접근 가능하다.

$ cat loop01.yml
---
- name: Loops Playbook
  hosts: all
  become: yes

  tasks:

  - name: add group
    group: name={{ item }} state=present
    with_items:
     - t_group01
     - t_group02

  - name: add several users
    user: name={{ item.name }} state=present groups={{ item.groups }}
    with_items:
     - { name: 't_user01', groups: 't_group01' }
     - { name: 't_user02', groups: 't_group02' }

image


📜 2. Nested Loops - with_nested

# with_nested를 사용하여 중첩 loop 사용할 수 있음.

$ cat <<EOF > loop02.yml
---
- name: Loops Playbook
  hosts: all
  become: yes

  tasks:
  - name: add several group/users
    user: name={{ item[0] }} state=present groups={{ item[1] }}
    with_nested:
     - [ 't_user03', 't_user04' ]
     - [ 't_group01', 't_group02' ]
EOF
# 아래와 같이 다른 list variable에서 읽어올 수 있음

$ cat <<EOF > loop02.yml
---
- name: Loops Playbook
  hosts: all
  become: yes

  vars:
    users:
     - t_user03
     - t_user04  

  tasks:
  - name: add several group/users
    user: name={{ item[0] }} state=present groups={{ item[1] }}
    with_nested:
     - "{{ users }}"
     - [ 't_group01', 't_group02' ] 
EOF

image (1)


📜 3. Looping over Hashes - with_dict

# with_dict를 사용하여 아래와 같이 users hash list에 대해서도 loop 를 돌릴 수 있음.

$ cat <<EOF > loop03.yml
---
- name: Loops Playbook
  hosts: all
  become: yes

  vars:
    users:
      alice:
        name: Alice Appleworth
        telephone: 123-456-7890
      bob:
        name: Bob Bananarama
        telephone: 987-654-3210

  tasks:
  - name: Print phone records
    debug: 
     msg: "User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
    with_dict: "{{ users }}"
EOF

image (2)


📜 4. Looping over Files - with_file

# with_file를 사용하여 목록에 있는 파일의 내용에 대해 loop를 돌릴 수 있음. 
# 은 각 iteration file의 contents를 가리킴.

$ cat loop04.yml
---
- name: Loops Playbook
  hosts: all
  become: yes

  tasks:
  # 각 파일의 내용이 포함된 디버그 메시지를 내보냅니다.
  - name: Check the file contents
    debug: msg={{ item }}
    with_file:
      - "~/test/test01.txt"
      - "~/test/test02.txt"

image (3)


📜 5. Looping over Fileglobs - with_fileglob

# 하나의 디렉토리 하에 있는 패턴과 일치하는 모든 파일 path에 대해 loop를 돌릴 수 있음.
# 상대 경로를 사용할 때에는 주의가 필요하다
# (role 내부에서 사용하는 경우 절대 경로가 role 기준으로 바뀜)

$ tree
.
├── files
│   ├── index.html
│   ├── test01.txt
│   ├── test02.txt
│   ├── test03.txt
│   ├── test04.txt
│   └── test05.txt
├── ansible.cfg
├── inventory
└── loop5.yml

$ cat <<EOF > loop05.yml
---
- name: Loops Playbook
  hosts: node01
  become: yes

  vars:
    s_folder: /root/ansible_test/files
    d_folder: /home/choi/

  tasks:
  - name: Copy File
    copy:
      src: "{{ item }}"
      dest: "{{ d_folder }}"
      mode: 0555
    with_fileglob: "{{ s_folder }}/*"
EOF

image (4)


ANSIBLE 카테고리 내 다른 글 보러가기

댓글 남기기