[Ansible] 반복문(Loops)DevOps/Ansible2022. 4. 19. 23:41
Table of Contents
728x90
✔️ 반복문
✔️ 반복문의 키워드
Task 레벨에서 쓸 수 있는 키워드로 Play 레벨에서는 반복 키워드가 없어 반복문을 사용할 수 없다.
- loop
- until
- with_<lookup_plugin>
작업(Task)에서 loop
, with
, until
반복문 구성
이전 ansible 버전에서는 with_를 사용했었다가 loop로 변경됨 → 아직 혼재해서 사용함
✔️ 표준 반복문
- name: Add several users
ansible.builtin.user: # ansible 2.8 부터 module 표기 방법이 이원화
name: "{{ item }}"
state: present
groups: "wheel"
loop:
- testuser1
- testuser2
loop: 라는 지시어로 반복문을 사용한다.
반복문에서는 반드시 item 변수를 사용해야 한다.
with_list == with_items
- hosts: 192.168.100.11
gather_facts: no
tasks:
- debug:
msg: "{{ item }}"
loop:
- apple
- banana
- carrot
✔️ 리스트(목록) 반복문
loop
대신에 with_items
, with_list
를 사용할 수 있다.
- hosts: 192.168.100.11
gather_facts: no
vars:
fruits:
- apple
- banana
- carrot
tasks:
- debug:
msg: "{{ item }}"
loop: # loop 대신 with_items로 바꾸어도 정상 작동함
"{{ fruits }}"
[vagrant@controller 02_loop]$ ansible-playbook test.yaml
PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************************************************************************
TASK [debug] ********************************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11] => (item=[u'apple', u'banana', u'carrot']) => {
"msg": [
"apple",
"banana",
"carrot"
]
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************
192.168.100.11 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
✔️ 사전 반복문
loop
대신 with_dict
를 쓸 수 있다.
- name: Add several users
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
loop:
- name: 'testuser1'
groups: 'wheel'
- name: 'testuser2'
groups: 'root'
# 한줄로 변경하면 다음과 같다.
[ {name: 'testuser1', groups: 'wheel'}, {name: 'testuser2', group: 'root'} ]
- hosts: 192.168.100.11
gather_facts: no
vars:
fruits:
- name: apple
count: 2
- name: banana
count: 3
tasks:
- debug:
msg: "{{ item.name }} / {{ item.count }}"
loop:
'{{ fruits }}'
[vagrant@controller dict]$ ansible-playbook test.yaml
PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************************************************************************
TASK [debug] ********************************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11] => (item={u'count': 2, u'name': u'apple'}) => {
"msg": "apple / 2"
}
ok: [192.168.100.11] => (item={u'count': 3, u'name': u'banana'}) => {
"msg": "banana / 3"
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************
192.168.100.11 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
✔️ 중첩 반복문
- name: Give users access to multiple databases
community.mysql.mysql_user:
name: "{{ item[0] }}"
priv: "{{ item[1] }}.*:ALL"
append_privs: yes
password: "foo"
loop: "{{ ['alice', 'bob'] | product(['clientdb', 'employeedb', 'providerdb']) | list }}"
총 6번의 반복문이 돌며 alice와 bob에게 3개로 구성된 product의 권한을 부여한다.
sudo yum install httpd,php,mariadb-server
해당 yum 명령은 프로세스가 1번 돌며 3개의 패키지를 설치한다.
sudo yum intsall httpd
sudo yum install php
sudo yum install mariadb-server
위 3줄의 명령은 프로세스 생성 → 패키지 설치가 3번 반복되는 구조이다.
모듈이 참조하는 yum(RedHat), apt(Debian)와 같은 유틸리티 자체가 여러개의 리스트를 받을 수 있어서
반복문을 사용하는 것이 더 비효율적이다.
여러개의 데이터베이스에 권한을 주거나 여러명의 사용자를 만들어야 할 경우 반복문을 사용하면 유용하다.
따라서 패키지를 설치할 때는 반복문을 쓰는게 비효율적이고,
어떤 서비스를 시작 할 때는 반복문을 사용하는게 좋다.
명령어를 실행 시 time을 붙이면 명령어가 실행 후 종료될 때까지의 시간을 볼 수 있다.
time sleep 3
728x90
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] 핸들러 (Handler) (0) | 2022.04.20 |
---|---|
[Ansible] 조건문(Conditionals) (0) | 2022.04.19 |
[Ansible] 변수(Variables) (0) | 2022.04.19 |
[Ansible] Playbook 실행 (0) | 2022.04.16 |
[Ansible] Ad-hoc 명령어로만 Wordpress 배포하기 (0) | 2022.04.15 |
@TTOII :: 뭉게뭉게 클라우드
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!