본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2026. 2. 2. · 6 Views
Ansible 조건문과 반복문 완벽 가이드
Ansible 플레이북에서 when 조건문과 loop 반복문을 활용하는 방법을 다룹니다. 인프라 자동화의 핵심인 조건부 실행과 반복 작업을 실무 예제와 함께 쉽게 설명합니다.
목차
1. when 조건문 사용하기
김개발 씨는 오늘 회사의 서버 100대에 패키지를 설치하는 업무를 맡았습니다. 문제는 서버마다 운영체제가 다르다는 것이었습니다.
CentOS에는 yum을, Ubuntu에는 apt를 사용해야 하는데, 어떻게 하나의 플레이북으로 처리할 수 있을까요?
when 조건문은 Ansible에서 특정 조건이 참일 때만 태스크를 실행하도록 제어하는 기능입니다. 마치 교통 신호등이 초록불일 때만 차가 지나가는 것처럼, when은 조건이 맞을 때만 해당 작업을 수행합니다.
이를 통해 다양한 환경에서 유연하게 동작하는 플레이북을 작성할 수 있습니다.
다음 코드를 살펴봅시다.
- name: Install package on CentOS
yum:
name: httpd
state: present
when: ansible_distribution == "CentOS"
- name: Install package on Ubuntu
apt:
name: apache2
state: present
when: ansible_distribution == "Ubuntu"
- name: Start service only if installed
service:
name: "{{ web_service }}"
state: started
when: install_result is succeeded
김개발 씨는 입사 6개월 차 DevOps 엔지니어입니다. 이번 주 미션은 전사 서버에 웹 서버를 배포하는 것이었습니다.
처음에는 간단해 보였습니다. 그런데 막상 시작하려니 문제가 생겼습니다.
"이 서버는 CentOS고, 저 서버는 Ubuntu인데... 설치 명령어가 다르잖아?" 선배 박시니어 씨가 김개발 씨의 고민을 듣고 다가왔습니다.
"Ansible의 when 조건문을 사용하면 됩니다. 조건에 따라 다른 태스크를 실행할 수 있거든요." 그렇다면 when 조건문이란 정확히 무엇일까요?
쉽게 비유하자면, when은 마치 공항의 출입국 심사대와 같습니다. 모든 승객이 심사대를 지나가지만, 내국인 전용 창구는 내국인만, 외국인 전용 창구는 외국인만 이용할 수 있습니다.
이처럼 when도 특정 조건을 만족하는 호스트에서만 해당 태스크를 실행합니다. when이 없던 시절에는 어땠을까요?
개발자들은 운영체제별로 별도의 플레이북을 작성해야 했습니다. CentOS용 플레이북, Ubuntu용 플레이북, Debian용 플레이북...
서버 종류가 늘어날수록 관리해야 할 파일도 늘어났습니다. 더 큰 문제는 공통 로직을 수정할 때마다 모든 파일을 일일이 고쳐야 한다는 것이었습니다.
바로 이런 문제를 해결하기 위해 when 조건문이 등장했습니다. when을 사용하면 하나의 플레이북에서 다양한 환경을 처리할 수 있습니다.
또한 ansible_facts라는 시스템 정보를 활용하여 자동으로 환경을 감지합니다. 무엇보다 코드 중복을 줄이고 유지보수성을 높일 수 있다는 큰 이점이 있습니다.
위의 코드를 살펴보겠습니다. 첫 번째 태스크는 ansible_distribution 변수가 "CentOS"일 때만 실행됩니다.
이 변수는 Ansible이 자동으로 수집하는 팩트 정보입니다. 두 번째 태스크는 Ubuntu에서만 실행되며, 세 번째 태스크는 이전 설치 작업이 성공했을 때만 서비스를 시작합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 멀티 클라우드 환경을 운영한다고 가정해봅시다.
AWS, GCP, 온프레미스 서버가 혼재되어 있을 때, when 조건문으로 클라우드 제공자별 설정을 다르게 적용할 수 있습니다. 많은 기업에서 이런 패턴으로 인프라 코드를 통합 관리하고 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 when 조건에 Jinja2 이중 중괄호를 사용하는 것입니다.
when은 이미 Jinja2 컨텍스트에서 평가되므로 중괄호 없이 변수명만 적어야 합니다. 따라서 when: "{{ var }}" 대신 when: var로 작성해야 합니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어 씨의 설명을 들은 김개발 씨는 하나의 플레이북으로 모든 서버를 처리하는 데 성공했습니다.
"이렇게 간단한 방법이 있었군요!" when 조건문을 제대로 이해하면 환경에 구애받지 않는 유연한 자동화 코드를 작성할 수 있습니다.
실전 팁
💡 - when 조건에서는 Jinja2 중괄호를 사용하지 않습니다
- ansible_facts를 활용하면 OS, 버전, 아키텍처 등을 자동 감지할 수 있습니다
- 여러 조건을 조합할 때는 and, or 연산자를 사용합니다
2. 조건식 작성법
김개발 씨가 when 조건문에 익숙해질 무렵, 새로운 요구사항이 들어왔습니다. "메모리가 4GB 이상이고, CentOS 7 또는 8인 서버에만 모니터링 에이전트를 설치해주세요." 단순한 조건 하나가 아닌, 복합적인 조건을 어떻게 표현해야 할까요?
Ansible의 조건식은 Jinja2 표현식을 기반으로 합니다. 비교 연산자, 논리 연산자, 멤버십 테스트 등 다양한 방식으로 조건을 작성할 수 있습니다.
마치 수학 시험에서 여러 조건을 만족해야 합격하는 것처럼, 복합 조건을 유연하게 표현할 수 있습니다.
다음 코드를 살펴봅시다.
- name: Install monitoring agent
yum:
name: monitoring-agent
state: present
when:
- ansible_memtotal_mb >= 4096
- ansible_distribution == "CentOS"
- ansible_distribution_major_version in ["7", "8"]
- name: Configure for production
template:
src: prod.conf.j2
dest: /etc/app/config.conf
when: env == "production" or env == "staging"
- name: Skip if variable undefined
debug:
msg: "Processing {{ item_name }}"
when: item_name is defined and item_name | length > 0
김개발 씨는 when 조건문의 기본을 익힌 후 자신감이 생겼습니다. 그런데 이번 요구사항은 조금 복잡했습니다.
단순히 운영체제 하나만 확인하는 게 아니라, 여러 조건을 동시에 만족해야 했습니다. "메모리도 확인하고, OS 버전도 확인하고...
이걸 어떻게 한 번에 표현하지?" 박시니어 씨가 힌트를 주었습니다. "Ansible은 Jinja2라는 템플릿 언어를 사용합니다.
파이썬과 비슷한 문법으로 다양한 조건식을 작성할 수 있어요." 그렇다면 조건식을 작성하는 방법을 알아볼까요? 먼저 비교 연산자가 있습니다.
등호(==), 부등호(!=), 크다(>), 작다(<), 이상(>=), 이하(<=) 등 프로그래밍에서 익숙한 연산자를 그대로 사용합니다. 숫자뿐 아니라 문자열 비교에도 활용됩니다.
다음으로 논리 연산자입니다. and는 두 조건이 모두 참일 때, or는 둘 중 하나만 참이어도, not은 조건을 반전시킵니다.
이 연산자들을 조합하면 복잡한 비즈니스 로직도 표현할 수 있습니다. Ansible만의 특별한 문법도 있습니다.
when 아래에 조건을 리스트 형태로 나열하면 자동으로 AND 조건으로 처리됩니다. 위 코드의 첫 번째 예제처럼 세 가지 조건을 리스트로 작성하면, 세 조건이 모두 참일 때만 태스크가 실행됩니다.
가독성이 훨씬 좋아지는 방법입니다. 멤버십 테스트도 유용합니다.
in 키워드를 사용하면 값이 리스트에 포함되어 있는지 확인할 수 있습니다. 위 예제에서 ansible_distribution_major_version in ["7", "8"]은 버전이 7 또는 8인지 확인합니다.
여러 값을 or로 연결하는 것보다 훨씬 깔끔합니다. 변수의 존재 여부를 확인하는 것도 중요합니다.
is defined와 is undefined 테스트를 사용하면 변수가 정의되어 있는지 확인할 수 있습니다. 정의되지 않은 변수를 참조하면 에러가 발생하므로, 안전한 코드를 위해 꼭 필요한 확인입니다.
필터를 활용한 조건식도 있습니다. | length는 문자열이나 리스트의 길이를 반환합니다.
| int는 문자열을 정수로 변환합니다. 이런 필터들을 조건식과 조합하면 더욱 정교한 조건을 만들 수 있습니다.
실무에서 자주 사용하는 패턴을 소개합니다. 프로덕션 환경에서만 특정 설정을 적용하거나, 특정 태그가 붙은 서버에만 작업을 수행하거나, 이전 태스크의 결과에 따라 분기하는 등의 작업이 조건식으로 가능합니다.
조건식을 잘 활용하면 하나의 플레이북으로 다양한 시나리오를 처리할 수 있습니다. 김개발 씨는 복합 조건식을 작성하여 요구사항을 완벽히 충족시켰습니다.
실전 팁
💡 - 여러 조건을 리스트로 나열하면 자동으로 AND 조건이 됩니다
- 변수 사용 전에는 is defined로 존재 여부를 확인하세요
- 복잡한 조건은 변수로 미리 계산하여 가독성을 높이세요
3. loop를 통한 반복 작업
김개발 씨에게 새로운 미션이 주어졌습니다. 서버에 10개의 패키지를 설치해야 하는데, 같은 태스크를 10번 복사해서 붙여넣기 해야 할까요?
이런 반복 작업을 효율적으로 처리하는 방법이 있습니다.
loop는 Ansible에서 동일한 태스크를 여러 번 반복 실행할 때 사용하는 기능입니다. 마치 공장의 컨베이어 벨트가 같은 작업을 여러 제품에 적용하는 것처럼, loop는 리스트의 각 항목에 대해 태스크를 반복 실행합니다.
Ansible 2.5부터 도입된 현대적인 반복 문법입니다.
다음 코드를 살펴봅시다.
- name: Install multiple packages
yum:
name: "{{ item }}"
state: present
loop:
- httpd
- mariadb-server
- php
- php-mysql
- name: Create multiple users
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
state: present
loop:
- { name: 'alice', groups: 'developers' }
- { name: 'bob', groups: 'operators' }
- name: Copy configuration files
copy:
src: "{{ item }}"
dest: "/etc/app/{{ item }}"
loop: "{{ config_files }}"
어느 날 김개발 씨는 신규 서버 셋업 작업을 하고 있었습니다. 설치해야 할 패키지가 무려 10개나 됐습니다.
처음에는 태스크를 복사해서 패키지 이름만 바꾸며 작성했습니다. "httpd 설치 태스크, mariadb 설치 태스크, php 설치 태스크..." 열 번째 태스크를 작성할 때쯤 김개발 씨는 지쳐버렸습니다.
"분명 더 좋은 방법이 있을 텐데..." 박시니어 씨가 김개발 씨의 플레이북을 보더니 고개를 저었습니다. "이렇게 반복되는 작업은 loop를 사용하면 됩니다.
코드가 10분의 1로 줄어들 거예요." 그렇다면 loop란 무엇일까요? 쉽게 비유하자면, loop는 마치 출석 부르기와 같습니다.
선생님이 명단을 보면서 한 명씩 이름을 부르듯이, Ansible도 리스트를 순회하면서 각 항목에 대해 태스크를 실행합니다. 명단에 30명이 있으면 30번 호명하는 것처럼, 리스트에 10개 항목이 있으면 태스크도 10번 실행됩니다.
loop의 핵심은 item 변수입니다. 반복이 실행될 때마다 현재 순서의 항목이 item 변수에 담깁니다.
첫 번째 반복에서는 첫 번째 항목이, 두 번째 반복에서는 두 번째 항목이 item에 할당됩니다. 태스크 안에서 {{ item }}으로 이 값을 사용할 수 있습니다.
단순한 문자열 리스트만 가능한 것은 아닙니다. 딕셔너리 리스트도 사용할 수 있습니다.
위 코드의 두 번째 예제처럼 각 항목이 name과 groups 키를 가진 딕셔너리일 때, {{ item.name }}과 {{ item.groups }}로 각각의 값에 접근합니다. 이 방식으로 여러 속성을 가진 복잡한 데이터도 처리할 수 있습니다.
리스트를 변수로 정의할 수도 있습니다. 플레이북 상단의 vars 섹션이나 별도의 변수 파일에 리스트를 정의해두고, loop에서 {{ config_files }}처럼 변수명으로 참조할 수 있습니다.
이렇게 하면 데이터와 로직을 분리하여 유지보수가 쉬워집니다. 실무에서 loop는 정말 다양하게 활용됩니다.
여러 사용자를 생성하거나, 여러 패키지를 설치하거나, 여러 설정 파일을 복사하거나, 여러 서비스를 시작하거나... 반복이 필요한 거의 모든 작업에 loop가 사용됩니다.
인프라 코드에서 반복 없이는 효율적인 자동화가 불가능하다고 해도 과언이 아닙니다. 주의할 점이 있습니다.
loop 안에서 너무 많은 항목을 처리하면 실행 시간이 길어질 수 있습니다. 패키지 설치처럼 네트워크 통신이 필요한 작업은 특히 그렇습니다.
이럴 때는 모듈의 name 파라미터에 리스트를 직접 전달하는 방식이 더 효율적입니다. 김개발 씨는 loop를 적용하여 100줄이 넘던 플레이북을 20줄로 줄였습니다.
실전 팁
💡 - 패키지 설치 시 loop보다 name에 리스트를 직접 전달하는 것이 빠릅니다
- 복잡한 데이터는 딕셔너리 리스트로 구성하세요
- 변수 파일에 리스트를 정의하면 재사용성이 높아집니다
4. with items와 loop 비교
김개발 씨가 인터넷에서 Ansible 예제를 검색하다 보니 with_items라는 문법을 자주 보게 됐습니다. 회사 플레이북에는 loop가 쓰여 있는데, 둘의 차이는 무엇일까요?
어떤 것을 사용해야 할까요?
with_items는 Ansible의 전통적인 반복 문법이고, loop는 Ansible 2.5에서 도입된 현대적인 문법입니다. 기본 기능은 동일하지만, loop가 더 일관되고 유연한 문법을 제공합니다.
새로 작성하는 코드에서는 loop 사용을 권장하며, with_items는 레거시 코드 이해를 위해 알아두면 좋습니다.
다음 코드를 살펴봅시다.
# 전통적인 with_items 방식 (레거시)
- name: Install packages (old style)
yum:
name: "{{ item }}"
state: present
with_items:
- httpd
- mariadb-server
# 현대적인 loop 방식 (권장)
- name: Install packages (new style)
yum:
name: "{{ item }}"
state: present
loop:
- httpd
- mariadb-server
# with_dict를 loop로 변환
- name: Create users (old style with_dict)
user:
name: "{{ item.key }}"
comment: "{{ item.value.comment }}"
with_dict: "{{ users }}"
# loop + dict2items 필터 (권장)
- name: Create users (new style)
user:
name: "{{ item.key }}"
comment: "{{ item.value.comment }}"
loop: "{{ users | dict2items }}"
김개발 씨는 신규 프로젝트의 플레이북을 작성하면서 궁금증이 생겼습니다. 회사의 오래된 플레이북에는 with_items가, 최근 작성된 플레이북에는 loop가 쓰여 있었습니다.
"둘 다 같은 일을 하는 것 같은데, 왜 두 가지 방식이 있는 거죠?" 박시니어 씨가 Ansible의 역사를 설명해주었습니다. "with_items는 오래전부터 있던 문법이에요.
하지만 with_file, with_sequence, with_dict 등 비슷한 키워드가 너무 많아져서 혼란스러웠죠. 그래서 Ansible 2.5부터 loop라는 통합된 문법이 도입됐습니다." 둘의 차이점을 자세히 살펴보겠습니다.
문법적 일관성 측면에서 loop가 우수합니다. with_* 계열은 with_items, with_dict, with_file, with_sequence 등 용도별로 다른 키워드를 사용해야 했습니다.
반면 loop는 하나의 키워드로 통일하고, 필터를 통해 다양한 데이터를 처리합니다. 기능적으로는 거의 동일합니다.
with_items와 loop는 단순 리스트 반복에서 완전히 같은 동작을 합니다. item 변수에 현재 항목이 담기는 것도 동일합니다.
기존에 with_items로 작성된 코드가 있다면 굳이 loop로 바꿀 필요는 없습니다. 변환이 필요한 경우도 있습니다.
with_dict를 loop로 변환할 때는 dict2items 필터를 사용합니다. with_fileglob은 lookup('fileglob', ...)을 loop와 함께 사용합니다.
이런 변환 패턴을 알아두면 레거시 코드를 현대화할 때 도움이 됩니다. loop_control이라는 강력한 기능도 있습니다.
loop에서만 사용할 수 있는 loop_control은 반복 변수명을 바꾸거나, 인덱스를 제공하거나, 출력을 조절하는 등의 고급 기능을 제공합니다. 복잡한 반복 로직에서 유용하게 활용됩니다.
그렇다면 어떤 것을 사용해야 할까요? 새로 작성하는 코드에서는 반드시 loop를 사용하세요. 더 현대적이고, 일관되며, 향후 Ansible 버전에서도 계속 지원됩니다.
with_* 문법은 deprecated 예정은 아니지만, 공식 문서에서도 loop 사용을 권장합니다. 기존 코드를 읽을 때는 with_items를 이해해야 합니다. 많은 레거시 플레이북과 인터넷의 예제가 여전히 with_* 문법을 사용하고 있습니다.
두 문법을 모두 알아야 어떤 코드든 이해하고 유지보수할 수 있습니다. 김개발 씨는 이제 새 코드는 loop로 작성하고, 오래된 코드를 읽을 때 with_items가 나와도 당황하지 않게 됐습니다.
실전 팁
💡 - 새 코드에서는 항상 loop를 사용하세요
- with_dict 변환 시 dict2items 필터를 활용하세요
- loop_control로 반복 변수명을 커스터마이징할 수 있습니다
5. 중첩 루프 활용
김개발 씨에게 복잡한 요구사항이 들어왔습니다. 3개의 서버 그룹 각각에 5가지 설정을 적용해야 합니다.
총 15가지 조합을 처리해야 하는데, 루프 안에 루프를 넣을 수 있을까요?
중첩 루프는 두 개 이상의 리스트를 조합하여 반복하는 기법입니다. 마치 구구단에서 1단부터 9단까지, 각 단에서 1부터 9까지 곱하는 것처럼, 바깥 루프의 각 항목에 대해 안쪽 루프가 전체 순회합니다.
Ansible에서는 loop와 필터, 또는 include_tasks를 활용하여 구현합니다.
다음 코드를 살펴봅시다.
# product 필터로 중첩 루프 구현
- name: Configure all combinations
debug:
msg: "Server: {{ item.0 }}, Config: {{ item.1 }}"
loop: "{{ servers | product(configs) | list }}"
vars:
servers: ['web1', 'web2', 'web3']
configs: ['nginx', 'ssl', 'firewall']
# subelements 필터로 중첩 구조 처리
- name: Create user directories
file:
path: "/home/{{ item.0.name }}/{{ item.1 }}"
state: directory
loop: "{{ users | subelements('directories') }}"
vars:
users:
- name: alice
directories: [docs, projects, backup]
- name: bob
directories: [work, personal]
# include_tasks로 동적 중첩 루프
- name: Process each server
include_tasks: configure_server.yml
loop: "{{ server_list }}"
loop_control:
loop_var: server
김개발 씨는 이번에 정말 골치 아픈 작업을 맡았습니다. 웹 서버 3대, 앱 서버 2대, DB 서버 2대에 각각 5가지 보안 설정을 적용해야 합니다.
단순 계산으로도 7 x 5 = 35개의 작업입니다. "루프 안에 루프를 넣어야 하는 건가?
그게 가능한가?" 박시니어 씨가 여러 가지 방법을 알려주었습니다. "Ansible에서 중첩 루프를 구현하는 방법은 여러 가지가 있어요.
상황에 따라 적절한 방법을 선택하면 됩니다." 첫 번째 방법은 product 필터입니다. product는 두 리스트의 모든 조합을 생성합니다.
마치 수학의 곱집합처럼, [A, B]와 [1, 2]를 product하면 [(A,1), (A,2), (B,1), (B,2)]가 됩니다. 위 코드의 첫 번째 예제에서 3개 서버와 3개 설정을 조합하면 9가지 경우가 생성됩니다.
product의 결과는 튜플 리스트입니다. item.0은 첫 번째 리스트의 항목을, item.1은 두 번째 리스트의 항목을 참조합니다.
숫자로 인덱싱하는 것이 조금 어색할 수 있지만, 여러 리스트를 조합할 때 유용합니다. 두 번째 방법은 subelements 필터입니다.
데이터가 이미 중첩 구조로 되어 있을 때 사용합니다. 예를 들어 각 사용자가 생성해야 할 디렉토리 목록을 가지고 있다면, subelements로 (사용자, 디렉토리) 쌍을 펼쳐서 처리할 수 있습니다.
subelements의 결과에서 item.0은 부모 객체 전체를, item.1은 자식 리스트의 개별 항목을 가리킵니다. 위 예제에서 alice의 docs 디렉토리를 처리할 때, item.0.name은 'alice'이고 item.1은 'docs'입니다.
세 번째 방법은 include_tasks입니다. 더 복잡한 중첩 로직이 필요할 때 사용합니다.
별도의 태스크 파일을 만들고 loop로 호출하면, 그 파일 안에서 또 다른 loop를 사용할 수 있습니다. 진정한 의미의 중첩 루프가 가능해집니다.
include_tasks를 사용할 때는 loop_control의 loop_var가 중요합니다. 바깥 루프와 안쪽 루프가 모두 item 변수를 사용하면 충돌이 발생합니다.
loop_var로 바깥 루프의 변수명을 바꿔주면 이 문제를 해결할 수 있습니다. 성능도 고려해야 합니다.
중첩 루프는 항목 수의 곱만큼 반복됩니다. 10 x 10이면 100번, 100 x 100이면 10,000번입니다.
네트워크 작업이 포함된 경우 실행 시간이 급격히 늘어날 수 있으니 주의가 필요합니다. 김개발 씨는 product 필터를 사용하여 35가지 조합을 깔끔하게 처리했습니다.
"이렇게 간결하게 표현할 수 있다니 놀랍네요!"
실전 팁
💡 - 두 리스트의 모든 조합은 product 필터로 생성합니다
- 중첩 데이터 구조는 subelements 필터로 펼칩니다
- 변수 충돌을 피하려면 loop_control의 loop_var를 사용하세요
6. 조건문과 반복문 조합
마지막으로 김개발 씨는 가장 복잡한 시나리오를 마주했습니다. 여러 서버에 여러 패키지를 설치하되, 각 패키지의 설치 여부를 조건에 따라 다르게 해야 합니다.
조건문과 반복문을 함께 사용할 수 있을까요?
Ansible에서 when과 loop를 함께 사용하면 반복의 각 항목에 대해 조건을 평가할 수 있습니다. 마치 쇼핑 목록을 보면서 "재고가 있는 것만 구매"하는 것처럼, 리스트를 순회하면서 조건에 맞는 항목만 처리합니다.
이 조합으로 매우 유연하고 강력한 자동화 로직을 구현할 수 있습니다.
다음 코드를 살펴봅시다.
# loop의 각 항목에 when 조건 적용
- name: Install packages conditionally
yum:
name: "{{ item.name }}"
state: present
loop:
- { name: 'httpd', install: true }
- { name: 'nginx', install: false }
- { name: 'php', install: true }
when: item.install
# 환경과 항목 조건을 조합
- name: Configure services per environment
template:
src: "{{ item.template }}"
dest: "{{ item.dest }}"
loop: "{{ service_configs }}"
when:
- item.env == current_env
- item.enabled | default(true)
# register와 loop, when 조합
- name: Check service status
command: systemctl is-active {{ item }}
register: service_status
loop: "{{ services }}"
ignore_errors: yes
- name: Restart failed services
service:
name: "{{ item.item }}"
state: restarted
loop: "{{ service_status.results }}"
when: item.rc != 0
김개발 씨는 Ansible 마스터가 되기 위한 마지막 관문에 도달했습니다. 지금까지 배운 조건문과 반복문을 조합하여 정말 복잡한 시나리오를 처리해야 합니다.
"각 서버 유형별로 설치할 패키지가 다르고, 환경에 따라 설정도 달라져야 하고... 이걸 어떻게 하나의 플레이북으로?" 박시니어 씨가 마지막 비법을 전수해주었습니다.
"when과 loop를 함께 쓰면 됩니다. 이 조합은 Ansible 자동화의 정수라고 할 수 있어요." 기본 원리는 간단합니다.
loop가 리스트를 순회할 때, 각 반복에서 when 조건이 평가됩니다. 조건이 참인 항목만 태스크가 실행되고, 거짓인 항목은 건너뜁니다.
위 코드의 첫 번째 예제에서 install이 false인 nginx는 설치되지 않습니다. 조건에서 item을 참조할 수 있습니다.
when: item.install처럼 현재 순회 중인 항목의 속성을 조건으로 사용할 수 있습니다. 이를 통해 데이터 기반의 선택적 실행이 가능해집니다.
여러 조건을 조합할 수도 있습니다. 두 번째 예제처럼 환경 변수와 항목의 속성을 동시에 확인할 수 있습니다.
리스트로 조건을 나열하면 AND 조건으로 처리됩니다. register와의 조합은 강력한 패턴입니다.
세 번째 예제를 보면, 먼저 loop로 여러 서비스의 상태를 확인하고 결과를 register에 저장합니다. 그 다음 태스크에서 저장된 결과를 loop로 순회하며, 실패한 서비스만 재시작합니다.
register된 결과의 구조를 이해하는 것이 중요합니다. loop와 함께 register를 사용하면 결과가 results 리스트에 담깁니다.
각 항목에는 원래 loop 항목이 item 키로 저장되어 있습니다. 따라서 item.item으로 원래 값에 접근합니다.
실무에서 이 패턴은 정말 유용합니다. 헬스 체크 후 실패한 서비스만 재시작하거나, 여러 서버에서 상태를 수집한 후 문제가 있는 서버만 처리하거나, 설정 파일을 검증한 후 유효한 것만 배포하는 등의 시나리오에 활용됩니다.
성능 최적화 팁도 있습니다. when 조건으로 일부 항목을 건너뛰더라도, Ansible은 "skipping" 메시지를 출력합니다.
항목이 매우 많고 대부분 건너뛰는 경우, 애초에 조건에 맞는 항목만 필터링하여 loop에 전달하는 것이 효율적입니다. 김개발 씨는 이제 조건문과 반복문을 자유자재로 조합할 수 있게 됐습니다.
어떤 복잡한 자동화 요구사항이 와도 당황하지 않습니다. "드디어 Ansible의 핵심을 이해한 것 같아요!" 박시니어 씨가 미소 지었습니다.
"축하해요. 이제 기본기는 완성됐어요.
앞으로 실전 경험을 쌓으면서 더 성장하게 될 겁니다."
실전 팁
💡 - when에서 item의 속성을 조건으로 활용하세요
- register + loop 결과는 results 리스트에 저장됩니다
- 대부분 건너뛰는 경우 selectattr 필터로 미리 필터링하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
vLLM 통합 완벽 가이드
대규모 언어 모델 추론을 획기적으로 가속화하는 vLLM의 설치부터 실전 서비스 구축까지 다룹니다. PagedAttention과 연속 배칭 기술로 GPU 메모리를 효율적으로 활용하는 방법을 배웁니다.
Web UI Demo 구축 완벽 가이드
Gradio를 활용하여 머신러닝 모델과 AI 서비스를 위한 웹 인터페이스를 구축하는 방법을 다룹니다. 코드 몇 줄만으로 전문적인 데모 페이지를 만들고 배포하는 과정을 초급자도 쉽게 따라할 수 있도록 설명합니다.
Sandboxing & Execution Control 완벽 가이드
AI 에이전트가 코드를 실행할 때 반드시 필요한 보안 기술인 샌드박싱과 실행 제어에 대해 알아봅니다. 격리된 환경에서 안전하게 코드를 실행하고, 악성 동작을 탐지하는 방법을 단계별로 설명합니다.
Voice Design then Clone 워크플로우 완벽 가이드
AI 음성 합성에서 일관된 캐릭터 음성을 만드는 Voice Design then Clone 워크플로우를 설명합니다. 참조 음성 생성부터 재사용 가능한 캐릭터 구축까지 실무 활용법을 다룹니다.
Tool Use 완벽 가이드 - Shell, Browser, DB 실전 활용
AI 에이전트가 외부 도구를 활용하여 셸 명령어 실행, 브라우저 자동화, 데이터베이스 접근 등을 수행하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 패턴과 베스트 프랙티스를 담았습니다.