본문 바로가기

리눅스

[draft] Ansible Playbook에서 loop와 when 조건문을 사용하는 방법

Ansible Playbook에서 loop와 when 조건문을 사용하는 방법(ansible-playbook)

Ansible Playbook에서는 반복 작업(loop)과 조건 실행(when)을 통해 여러 대상에 동일한 작업을 수행하거나 특정 조건에서만 작업을 실행할 수 있다.

1. Playbook 예제 작성

Playbook 파일을 생성한다.

vim example2.yml
---
- name: Chrony 설치 및 설정
  hosts: all
  become: true
  gather_facts: true

  vars:
    users:
      - ansible_user1
      - ansible_user2
      - ansible_user3

  tasks:
    - name: 사용자 계정 생성
      ansible.builtin.user:
        name: "{{ item }}"
        state: present
      loop: "{{ users }}"

    - name: Chrony 패키지 설치
      ansible.builtin.package:
        name: chrony
        state: present

    - name: Chrony 서비스 시작 (Ubuntu에서만 실행)
      ansible.builtin.service:
        name: chrony
        state: started
        enabled: true
      when: "'Ubuntu' in ansible_distribution"

    - name: 작업 완료 메시지 출력
      ansible.builtin.debug:
        msg: "Chrony installation and start completed on {{ inventory_hostname }}"

###
# ansible-playbook -i inventory/hosts.ini ansible_learn/example2.yml --limit localhost

2. Playbook 주요 구성 설명

변수 정의

vars:
  users:
    - ansible_user1
    - ansible_user2
    - ansible_user3
  • 사용자 계정 목록을 리스트 형태로 정의
  • 이후 loop에서 반복 처리

loop를 이용한 반복 작업

- name: 사용자 계정 생성
  ansible.builtin.user:
    name: "{{ item }}"
    state: present
  loop: "{{ users }}"
  • users 리스트의 값을 하나씩 item 변수에 전달
  • 각 사용자 계정을 순차적으로 생성

실행 흐름

ansible_user1 생성
ansible_user2 생성
ansible_user3 생성

패키지 설치

- name: Chrony 패키지 설치
  ansible.builtin.package:
    name: chrony
    state: present

package 모듈은 OS에 맞는 패키지 관리자를 자동 사용

  • Debian/Ubuntu → apt
  • RHEL/CentOS → yum 또는 dnf

설치 대상 패키지

  • Chrony (NTP 동기화 서비스)

when 조건문 사용

- name: Chrony 서비스 시작 (Ubuntu에서만 실행)
  ansible.builtin.service:
    name: chrony
    state: started
    enabled: true
  when: "'Ubuntu' in ansible_distribution"
  • when 조건문을 사용하여 특정 OS에서만 실행
  • ansible_distribution fact 값을 이용

예시

  • Ubuntu : 실행
  • Debian : 실행 안함
  • CentOS : 실행 안함

디버그 메시지 출력

- name: 작업 완료 메시지 출력
  ansible.builtin.debug:
    msg: "Chrony installation and start completed on {{ inventory_hostname }}"
  • 작업 완료 후 호스트별 메시지를 출력
  • inventory_hostname은 현재 실행 중인 대상 호스트 이름

3. Playbook 실행

실행 명령어

ansible-playbook -i inventory/hosts.ini ansible_learn/example2.yml --limit localhost
  • -i : 인벤토리 파일 지정
  • --limit : 실행 대상 호스트 제한
  • example2.yml : 실행할 Playbook

ansible-playbook

4. 참고 사항 (Ansible 권장 방식)

기존 Ansible 문서에서는 다음과 같은 방식도 사용된다.

with_items

그러나 최신 Ansible에서는 loop 사용이 권장된다.

기존 방식 권장 방식
with_items loop
with_dict loop + dict2items
with_list loop

 

참고URL

- Ansible Documentation : ansible playbook loop

- Ansible Documentation : ansible playbook conditional