[Ansible] 06. Loop (1)
카테고리: ANSIBLE
태그: ansible
[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' }

📜 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

📜 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

📜 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"

📜 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

댓글 남기기