Ansible 인벤토리·Playbook과 멱등성
Ansible은 대상과 원하는 상태를 작업으로 표현해 반복 운영을 돕습니다. 사전 검사와 실제 결과의 차이를 이해해야 합니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 인벤토리·변수·모듈·결과·handler의 실행 관계를 설명한다.
- 멱등한 파일 작업의 첫 적용과 재적용 결과를 비교한다.
- check mode·diff·실제 실행의 범위와 예외를 구분한다.
01inventory에서 연결 플러그인과 모듈 실행까지
- Control Node는 에서 호스트·그룹과 연결 변수를 읽고 의 hosts 패턴으로 대상을 고른다.
- SSH연결 플러그인이 SSH·WinRM·PSRP·네트워크 CLI 등 적절한 경로를 준비한다.
- 대상별 실행 환경일반 모듈은 대상에서 코드로 실행되어 결과 자료를 반환할 수 있지만 네트워크 장비·에 같은 조건을 무조건 적용하지 않는다.
- agentlessagentless는 상주 전용 에이전트를 요구하지 않는 일반 구조를 말한다.
- 의 별칭과 실제 접속 주소는 다를 수 있다.
- 그룹 변수와 호스트 변수, 변수 등은 정해진 우선순위로 합쳐지므로 CLI의 -u가 모든 ansible_user 설정보다 항상 우선한다고 가정하지 않는다.
- ping 모듈은 ping이 아니라 연결·인증·필요 런타임에서 모듈 실행과 반환이 가능한지 보는 기능이다.
- SSH·과 SSH 키 배포가 한 줄로 자동 생성되지는 않는다.
[web]
web1 ansible_host=192.0.2.11
web2 ansible_host=192.0.2.12
[web:vars]
ansible_user=automation교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
02play·task·module·facts의 YAML 계층
- 는 대상과 공통 실행 조건을 선언하고 tasks는 순서대로 실행할 작업 목록이다.
- 각 는 이름과 모듈, 모듈 인자를 가진다.
- YAML 구조·자료형들여쓰기와 자료형이 계층을 결정하며 설명용 name 문자열이 조금 다르다고 동작 의미가 바뀌는 것은 아니다.
- 기본 fact 수집기본 fact 수집은 배포판·인터페이스 같은 정보를 가져와 조건과 템플릿에 사용할 수 있게 한다.
- gather_facts: false는 그 자동 단계를 생략한다.
- 는 태스크 결과를 해당 호스트의 변수에 저장한다.
- 결과 객체의 필드command 결과에서 stdout은 문자열, stdout_lines는 줄 목록이며 rc와 stderr는 별도 필드다.
- 결과 변수 전달아래 조회는 df의 출력을 저장하고 다음 태스크가 그 자료를 표시한다.
- changed_when: falsechanged_when: false는 읽기 동작을 변경으로 집계하지 않게 할 뿐 명령 실행을 생략하거나 실패를 성공으로 바꾸지 않는다.
- collectioncollection까지 포함한 FQCN을 사용하면 어떤 모듈을 쓰는지 더 명확해진다.
- name: Inspect filesystem
hosts: web
gather_facts: false
tasks:
- name: Read filesystem usage
ansible.builtin.command:
argv: [df, -h, --, /]
register: disk_result
changed_when: false
- name: Show lines
ansible.builtin.debug:
var: disk_result.stdout_lines교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
03멱등 모듈이 현재 상태와 원하는 상태를 비교한다
- 디렉터리 상태 선언file 모듈의 : directory는 해당 디렉터리가 존재하고 지정한 소유권·권한을 갖도록 요구한다.
- 없다면 만들고 다르면 바꾸며 이미 맞으면 변경 없음으로 보고한다.
- 현재 상태의 재검사이전 실행 이력을 기억해서 두 번째부터 전체 태스크를 건너뛰는 방식이 아니다.
- 같은 코드라도 외부에서 권한이 바뀌면 다음 실행에서 다시 교정할 수 있다.
- playbookcommand와 shell은 임의 프로그램을 실행하므로 명령 자체가 반복 안전하지 않으면 전체 playbook도 그렇지 않다.
- creates·removescreates·removes는 경로 존재 조건으로 실행을 제한하는 보조 수단이고 changed_when은 보고를 바꾸는 조건이다.
- 단순 mkdir가 이미 존재한다고 실패한 결과를 성공이라고 부르지 않는다.
- 멱등 적용 예제아래는 전용 실습 경로와 관리 계정의 파일 권한 변경을 가정한 선언이다.
- name: Maintain study directory
ansible.builtin.file:
path: /srv/study
state: directory
owner: automation
group: automation
mode: "0750"교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
SSH 인증 실패와 반복 mkdir 실패를 멱등 모듈로 구별하기
의 UNREACHABLE·FAILED·CHANGED가 발생한 처리 단계를 비교하고 원하는 디렉터리 상태로 작업을 표현한다.
실습 구성과 전제
- 사진은 대상에 command 모듈을 실행한 사례다. 아래에서는 대상 그룹·경로를 lab과 /tmp/-lab으로 재구성한다.
- 관리 대상에 검증한 SSH 접속과 파일 모듈 실행 환경이 준비되어 있어야 한다. 화면의 삭제 명령은 재실행하지 않는다.
원격 작업 전에 연결이 성립했는지 읽는다
- 첫 화면의 UNREACHABLE과 Permission denied는 SSH 인증 단계의 실패다. 원하는 mkdir 작업이 실행되어 실패한 것이 아니다.
- changed=false도 디렉터리 상태를 검사해 이미 정상이었다는 뜻이 아니라, 이 사례에서는 원격 작업까지 도달하지 못했다는 결과와 함께 읽어야 한다.
bashansible-inventory -i inventory --graph ansible lab -i inventory -m ansible.builtin.ping연결과 모듈 실행 준비를 확인하는 예시다. ping은 ping이 아니다.
원본 크기로 보기 ↗- inventory와 -u 사용자를 지정한 command 실행이 UNREACHABLE로 끝난다.
- 메시지는 Permission denied이며 changed=false가 함께 표시된다.
확인 기준의 주소·사용자·인증 키와 수동 SSH 접속 조건을 대조한다. module 인자를 바꿔도 앞단 인증 실패는 해결되지 않는다.
명령 실행 성공과 원하는 상태의 달성을 구별한다
- 다음 화면의 mkdir는 이미 존재하는 디렉터리 때문에 rc=1로 실패한다. 필요한 상태가 이미 있어도 명령은 매번 생성 연산을 시도한다.
- 화면의 별도 삭제 명령은 rc=0과 CHANGED로 나타난다. 이를 반복 생성 문제의 필수 해결책으로 삼지 않고, 처음부터 원하는 디렉터리 상태를 표현하는 것이 적절하다.
원본 크기로 보기 ↗- mkdir 결과에 File exists, rc=1, FAILED가 표시된다.
- 다른 삭제 작업은 rc=0과 CHANGED로 나와 상태 변경과 명령 종료 결과를 각각 보여 준다.
확인 기준command 모듈의 CHANGED는 작업이 업무적으로 올바른 상태를 만들었다는 자동 검증이 아니다. 결과의 의미를 해당 명령과 연결한다.
file 모듈로 상태를 선언하고 재실행 결과를 비교한다
- file 모듈의 : directory는 경로가 디렉터리인지와 요청한 속성을 비교한다. 없으면 만들고, 이미 조건을 만족하면 불필요한 변경을 하지 않는 구조다.
- 재구성 playbook을 같은 대상에 두 번 적용한다면 첫 변경 이후 두 번째는 해당 의 changed가 줄어드는지 확인한다. 이는 실제 사진의 결과가 아니라 준비한 환경에서 검증할 기대 동작이다.
yaml- name: Ensure the lab directory exists hosts: lab gather_facts: false tasks: - name: Keep the directory at the desired mode ansible.builtin.file: path: /tmp/ansible-lab state: directory mode: "0750"대상과 경로를 재구성한 playbook이다. 와 접속 신뢰 설정을 먼저 준비한다.
확인 기준두 번째에도 changed가 반복되면 권한·소유자·다른 작업의 변경·경로 종류를 확인한다. check 모드와 실제 실행을 구분한다.
실습에서 확인한 동작 원리
- UNREACHABLE은 연결 경계, FAILED는 작업 실패, CHANGED는 변경 판정이므로 처리 위치를 구분한다.
- 은 같은 명령을 반복하는 것이 아니라 현재 상태와 원하는 상태를 비교하는 방식에서 얻는다.
설정·출력 추가로 확인하기 24장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 10장
원본 크기로 보기 ↗- 「inventory 생성 실습」 문맥에 삽입된 원본 설정·관리 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「권한 상승」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「Managed Node(rocky - 201)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「Managed Node(rocky - 201)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「inventory 생성 실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「inventory 생성 실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「inventory 생성 실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「inventory 생성 실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「inventory 생성 실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「ansible 명령어 단축 (with ansible.cfg) + command 모듈」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 3장
원본 크기로 보기 ↗- 「Ansible 네트워크 실습 환경」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「ansible 네트워크 ver」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「ansible 네트워크 ver」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Ansible 인벤토리·Playbook과 멱등성 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 03 1장
원본 크기로 보기 ↗- 학습 원본 · Ansible 원격 관리 환경 설정의 Win 원격제어 세팅에 수록된 화면·도식이다.
실습 화면 묶음 04 1장
원본 크기로 보기 ↗- 학습 원본 · Ansible 원격 관리 환경 설정의 Win 원격제어 세팅에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
원본 크기로 보기 ↗- 학습 원본 · Ansible 원격 관리 환경 설정의 ansible-galaxy 설치에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
원본 크기로 보기 ↗- 수업 원본 자료 · 자동화 제어 서버와 네트워크 장비 연결. 원문에서 「ANSIBLE 네트워크 장치 연결 실습」에 배치된 그림 또는 화면이다.
실습 화면 묶음 07 7장
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과. 원문에서 「HTTP + SSL (인증서) WIN10 에서 인증서 생성」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과. 원문에서 「HTTP + SSL (인증서) WIN10 에서 인증서 생성」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과. 원문에서 「HTTP + SSL (인증서) WIN10 에서 인증서 생성」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과. 원문에서 「HTTP + SSL (인증서) WIN10 에서 인증서 생성」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과. 원문에서 「우분투 ansible로 window 원격 제어하기」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과. 원문에서 「우분투 ansible로 window 원격 제어하기」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · WinRM 리스너·방화벽·인증서와 원격 제어 결과.
동작·명령 참고 문서
04template·notify·handler가 설정 변경을 재시작과 연결한다
- copy는 준비된 파일을 배포하고 은 Jinja 변수를 평가한 결과를 파일로 만든다.
- Changed와 알림 예약파일이 실제로 달라져 changed가 되면 notify가 실행을 예약할 수 있다.
- 중복 알림의 병합여러 태스크가 같은 를 알리더라도 일반적인 처리 구간에서 한 번만 실행하도록 중복을 모은다.
- 이미 같은 설정이면 매번 서비스를 재시작하지 않는 이유가 여기 있다.
- 선택·실행 시점는 이름 또는 listen 관계로 알림을 받고 보통 태스크 구간 끝에 처리된다.
- 실패 경로와 force_handlers, flush_handlers 사용 여부에 따라 실행 시점이 달라질 수 있다.
- 템플릿 문법템플릿 문법이 맞아도 생성된 애플리케이션 설정이 유효한지는 프로그램의 검사 기능으로 확인해야 한다.
- 사용자 입력사용자 입력을 그대로 임의 설정 구문으로 섞기보다 변수의 허용 범위와 인용을 정한다.
- 첫 적용과 재적용다음 도식의 첫 적용은 내용이 달라 changed와 notify가 생기고, 같은 내용을 재적용하면 ok가 되어 이 작업의 새 알림이 생기지 않는 사례다.
- Changed_when의 영향changed_when을 잘못 지정하면 실제 변경을 숨기거나 불필요한 를 실행시킬 수 있으므로 보고 상태와 실제 부작용을 함께 해석한다.
- 원하는 내용 비교대상 변수로 계산한 설정과 현재 파일을 비교한다.
- changed 결과파일을 갱신했다는 모듈 결과를 돌려준다.
- notify 등록변경 결과에 따라 실행할 를 알린다.
- 서비스 반영지원되는 재읽기 등의 작업을 실행한다.
- 재적용 비교다음 실행에서는 같은 내용이면 파일을 바꾸지 않는다.
tasks:
- name: Deploy nginx configuration
ansible.builtin.template:
src: study.conf.j2
dest: /etc/nginx/conf.d/study.conf
mode: "0644"
notify: Reload nginx
handlers:
- name: Reload nginx
ansible.builtin.service:
name: nginx
state: reloaded교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
설명과 함께 보는 보조 도식
설정 파일 변경과 handler 알림
모듈이 파일 내용 비교를 지원하고 정상 실행되는 대표 사례다.
원하는 내용 비교
대상 변수로 계산한 설정과 현재 파일을 비교한다.
- 첫 적용
- 내용 다름
전체 단계를 한 번에 읽기
- 01
원하는 내용 비교
대상 변수로 계산한 설정과 현재 파일을 비교한다.
- 첫 적용
- 내용 다름
- 02
changed 결과
파일을 갱신했다는 모듈 결과를 돌려준다.
- 작업 상태
- changed
- 03
notify 등록
변경 결과에 따라 실행할 handler를 알린다.
- 실행 시점
- 일반적으로 정해진 handler 단계
- 04
서비스 반영
지원되는 재읽기 등의 작업을 실행한다.
- 확인
- 문법·실제 응답
- 05
재적용 비교
다음 실행에서는 같은 내용이면 파일을 바꾸지 않는다.
- 결과
- ok, 이 작업의 새 알림 없음
05SSH 인증과 become, 조건·반복·배치
- SSH·become-k는 SSH 비밀번호를 묻고 -K는 become 비밀번호를 묻는다.
- become실제 권한 상승은 -b나 become: true로 켜며 정책이 해당 실행을 허용해야 한다.
- 정확한 암호를 입력하는 것과 실행 권한을 부여받는 것은 다르다.
- 일반 모듈일반 모듈은 임시 모듈과 인터프리터를 실행하므로 sudoers에 마지막 명령 하나만 열어 둔 방식과 호환되지 않을 수 있다.
- whenwhen은 조건에 따라 태스크를 건너뛰고 loop는 여러 항목에 같은 모듈을 적용한다.
- serialforks는 여러 호스트 작업의 병렬 실행 자원, serial은 호스트를 배치로 나누는 단위, throttle은 특정 작업의 동시 실행 제한이다.
- 순차 배포와 가용성모든 노드의 웹 서비스를 한꺼번에 재시작하는 대신 작은 배치로 진행하는 구조를 표현할 수 있지만 실제 가용성은 백엔드 상태와 연결 배제까지 함께 설계해야 한다.
06실행 결과와 changed·failed 판정은 다른 층이다
- 모듈 반환모듈은 실행 후 자료와 상태를 반환하며 command 계열은 rc·stdout·stderr 등을 제공한다. 모든 모듈이 같은 필드를 반환하는 것은 아니므로 모듈 계약에 맞춰 읽는다.
- 실패 재정의failed_when은 반환 결과를 실패로 볼 조건을 정한다. 0이 아닌 코드가 단순한 조회 결과를 뜻하는 프로그램이라면 그 규약에 맞춰 실패 범위를 정의할 수 있다.
- 목록 조건의 ANDfailed_when에 조건을 YAML 목록으로 적으면 암묵적 AND로 결합한다. 어느 하나만 참이어도 실패시키려면 하나의 표현식에서 or를 명시해야 한다.
- 변경 보고의 경계changed_when: false는 변경 보고와 알림 판단을 바꾸지만 이미 실행한 명령을 되돌리거나 실행을 막지 않는다. 실제 과 changed 표시를 동일시하지 않는다.
- 접속 실패의 층UNREACHABLE은 정상 모듈 실행 결과를 받기 전의 연결 문제 등으로 발생한다. rc가 있는 일반 실패와 같지 않으며 ignore_errors만으로 모든 종류를 계속 진행시킬 수는 없다.
07조건 목록을 잘못 묶으면 실패를 놓친다
- 가상 반환어떤 조회 작업의 결과가 rc=2, stderr="permission denied"라고 가정한다. 여기서는 rc!=0 또는 stderr에 FATAL이 있으면 실패시킨다는 업무 규칙을 정했다.
- 첫 조건rc!=0은 2!=0이므로 참이다. 그 자체로 의도한 실패 조건을 만족한다.
- 둘째 조건"FATAL" in stderr는 거짓이다. permission denied는 FATAL이라는 부분 문자열을 포함하지 않기 때문이다.
- 목록의 결과두 조건을 목록으로 쓰면 참 AND 거짓은 거짓이 되어 이 경우를 실패로 판정하지 못한다. 코드가 한 줄씩 보기 좋다고 논리 연산까지 OR로 바뀌지는 않는다.
- 명시적 OR한 표현식으로 rc!=0 or "FATAL" in stderr를 쓰면 참 OR 거짓은 참이 되어 의도대로 실패한다. 문자열 탐지는 프로그램의 안정된 규약이 있을 때만 추가한다.
| A: rc!=0 | B: FATAL 포함 | 목록 AND | 명시적 OR |
|---|---|---|---|
| 참 | 거짓 | 거짓 | 참 |
| 거짓 | 참 | 거짓 | 참 |
| 참 | 참 | 참 | 참 |
| 거짓 | 거짓 | 거짓 | 거짓 |
# 이미 register: probe로 결과를 받은 태스크의 조건 예시
failed_when: probe.rc != 0 or "FATAL" in probe.stderr
changed_when: false가상 반환값의 판정식. 독립 실행 Playbook이 아니며 실제 원격 작업을 실행하지 않았다.
08알림 누락·건너뜀·호스트별 부분 결과 읽기
- 와 변경설정 파일이 실제로 바뀌었는데 changed_when을 거짓으로 덮으면 필요한 알림이 빠질 수 있다. changed 수를 줄이는 것이 성공적인 의 목표가 아니다.
- 실패 후 앞서 변경 알림을 받았더라도 뒤 태스크 실패 때문에 해당 호스트의 가 실행되지 않을 수 있다. force_handlers도 접속 불가 같은 모든 장애를 해결하는 것은 아니다.
- check mode 제한check mode에서 모듈이 지원하지 않는 작업은 예측이 제한되거나 건너뛸 수 있다. check 실행의 ok 개수만으로 실제 적용과 재시작 성공을 보장하지 않는다.
- 호스트별 진행한 호스트의 실패와 다른 호스트의 완료는 함께 존재할 수 있다. recap을 대상별로 읽고 serial 배치·중단 조건에 따라 어느 호스트까지 변경됐는지 보존한다.
- rescue의 의미rescue는 실패 시 후속 처리 경로를 제공하지만 이전 태스크의 변경을 자동 롤백하는 DB 이 아니다. 보상 작업과 현재 상태 검증을 명시해야 한다.
09check·diff·recap이 말해 주는 것과 말하지 않는 것
- check·YAML--syntax-check는 YAML·playbook의 해석을 검사하며 대상 연결과 프로그램 정상 응답을 보장하지 않는다.
- Check mode 지원 범위--check는 지원 모듈의 변경 예측을 제공하지만 모든 작업을 완전하게 모의 실행하지 않는다.
- 지원하지 않는 작업이나 이전 태스크 결과에 의존하는 조건은 실제 실행과 다를 수 있다.
- 실제 실행되는 예외check_mode: false인 태스크는 check 실행에서도 실제 실행될 수 있다.
- diff--diff는 변경 내용을 드러내므로 비밀 파일의 내용도 출력될 수 있고 no_log 같은 제한 역시 의도에 맞게 구성한다.
- ok·changed태스크의 ok는 성공·변경 없음, changed는 성공·변경 보고, failed는 실행 실패, unreachable은 연결 불가, skipped는 조건 등에 따른 생략이다.
- recap·ok마지막 recap의 ok에는 changed 성공도 포함되어 ok=3 changed=1은 네 개가 아니라 성공한 세 작업 중 한 작업이 변경됐다는 뜻이다.
- failedignored·rescued가 있으면 failed=0만으로 문제가 해결됐다고 단정할 수 없다.
- 결과 집계와 실제 서비스 동작을 분리해서 읽는다.
| 구성·관찰 대상 | 확인하는 값 | 구분할 문제 |
|---|---|---|
| 인벤토리·변수 | 대상·그룹·최종 값 | 정상 실행이나 잘못된 대상 |
| 모듈 결과 | ok·changed·FAILED | 상태 판정과 실제 부작용 |
| notify·실행 시점·실패 정책 | 반영이 생략되거나 중복되는지 | |
| 검사·diff | 지원·override·비밀 출력 | 예측과 실제 변경의 차이 |
ansible-playbook -i inventory.ini study.yml --syntax-check
ansible-playbook -i inventory.ini study.yml --list-hosts
ansible-playbook -i inventory.ini study.yml --limit web1 --check
# 실제 실행 전 모듈의 check_mode 지원과 예외 태스크를 읽는다.교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
10재사용과 운영 통제
- ·role변수·템플릿··role을 이용하면 반복 구성을 구조화할 수 있다.
- 비밀값비밀값은 일반 인벤토리와 코드에서 분리하며, Vault로 암호화했더라도 복호화 비밀과 실행 로그 관리가 필요하다.
- 대상·변수 우선순위대상 그룹과 변수 우선순위를 이해하지 못하면 의도하지 않은 설정이 적용될 수 있다.
- 변경 범위변경 범위를 작은 그룹으로 나누고 연결 장애나 중간 실패에 대한 중단·복구 기준을 정한다.
- 예상 차이와 서비스 검증실행 전 예상 차이와 실행 후 서비스 상태를 함께 남겨야 재현 가능한 운영 기록이 된다.
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
Ansible 실패·변경·handler의 조건
Defining failure·Defining changed와 Handlers and failure 절의 YAML을 비교한다. 명령 결과, failed 판정, changed 보고와 실제 변경이 서로 다른 층임을 읽는 자료다.
- failed_when 목록이 암묵적 AND가 되는 조건
- changed_when이 부작용을 취소하지 않는 이유
- 후속 실패가 실행에 미치는 영향
이해했는지 확인하기
- 대상 목록과 연결 사용자·권한 상승을 확인한다.
- 모듈의 멱등성과 check mode 지원 범위를 확인한다.
- 작업 결과와 실제 서비스 상태를 따로 검증한다.
