작업 검증: 체크 모드와 diff 모드
작업 검증: 체크 모드와 diff 모드 (Validating tasks: check mode and diff mode)
플레이북이나 롤을 만들거나 수정할 때, 실제로 실행하기 전에 "이 작업이 정확히 뭘 할까?"를 미리 알고 싶을 때가 많아요. Ansible은 이때 쓰는 두 가지 실행 모드를 제공합니다. 시스템을 실제로 변경하지 않고 시뮬레이션하는 체크 모드와, 변경 전후를 비교해서 보여주는 diff 모드죠. 이 둘을 함께 쓰면 더 정밀하게 플레이북을 검증할 수 있습니다.
출처: 문서
본문
Ansible은 작업을 검증하는 두 가지 실행 모드를 제공해요: 체크 모드(check mode)와 diff 모드(diff mode)입니다. 이 모드들은 따로 또는 함께 사용할 수 있어요. 플레이북이나 롤을 만들거나 편집할 때 그게 무엇을 할지 알고 싶을 때 유용합니다. 체크 모드에서 Ansible은 원격 시스템을 전혀 변경하지 않고 실행해요. 체크 모드를 지원하는 모듈은 변경했을 "것"을 보고하고, 지원하지 않는 모듈은 아무것도 보고하지도 실행하지도 않습니다. diff 모드에서 Ansible은 변경 전후(before-and-after) 비교를 제공해요. diff 모드를 지원하는 모듈은 상세 정보를 표시합니다. 체크 모드와 diff 모드를 결합하면 플레이북이나 롤을 상세하게 검증할 수 있습니다.
체크 모드 사용하기 (Using check mode)
체크 모드는 단순한 시뮬레이션이에요. 등록된 변수(이전 작업의 결과)를 기반으로 하는 조건부를 사용하는 작업에는 출력을 생성하지 않습니다. 다만 한 번에 한 노드씩 실행하는 구성 관리 플레이북을 검증하는 데는 훌륭합니다. 플레이북을 체크 모드로 실행하려면:
ansible-playbook foo.yml --check
작업에 체크 모드 강제하기 또는 막기 (Enforcing or preventing check mode on tasks)
버전 2.2에서 추가되었어요.
플레이북을 --check로 실행하든 안 하든, 특정 작업을 항상 체크 모드로 실행하거나 절대 실행하지 않도록 하려면 그 작업에 check_mode 옵션을 추가하면 됩니다:
--check없이 플레이북을 호출해도 해당 작업을 항상 체크 모드로 실행하려면check_mode: true로 설정하세요.--check로 플레이북을 호출해도 해당 작업을 항상 일반 모드로 실행해 시스템을 변경하려면check_mode: false로 설정하세요.
예를 들면:
tasks:
- name: This task will always make changes to the system
ansible.builtin.command: /something/to/run --even-in-check-mode
check_mode: false
- name: This task will never make changes to the system
ansible.builtin.lineinfile:
line: "important config"
dest: /path/to/myconfig.conf
state: present
check_mode: true
register: changes_to_important_config
check_mode: true로 단일 작업을 실행하는 것은 Ansible 모듈을 테스트할 때 유용해요 — 모듈 자체를 테스트하거나 모듈이 변경을 만드는 조건을 테스트하는 데 말이죠. 이 작업들에 변수를 등록(Register)하면 잠재적인 변경에 대한 더 많은 정보를 얻을 수 있습니다.
참고 (Note)
2.2 버전 이전에는
check_mode: false에 해당하는 것만 존재했어요. 그 표기는always_run: true였습니다.
체크 모드에서 작업 건너뛰기 또는 오류 무시하기 (Skipping tasks or ignoring errors in check mode)
버전 2.1에서 추가되었어요.
체크 모드로 Ansible을 실행할 때 특정 작업을 건너뛰거나 그 작업의 오류를 무시하고 싶다면, 체크 모드로 실행될 때 True로 설정되는 불리언 매직 변수 ansible_check_mode를 사용하면 됩니다. 예를 들면:
tasks:
- name: This task will be skipped in check mode
ansible.builtin.git:
repo: ssh://[email protected]/mylogin/hello.git
dest: /home/mylogin/hello
when: not ansible_check_mode
- name: This task will ignore errors in check mode
ansible.builtin.git:
repo: ssh://[email protected]/mylogin/hello.git
dest: /home/mylogin/hello
ignore_errors: "{{ ansible_check_mode }}"
diff 모드 사용하기 (Using diff mode)
ansible-playbook의 --diff 옵션은 단독으로 또는 --check와 함께 사용할 수 있어요. diff 모드로 실행하면 diff 모드를 지원하는 모듈이 만들어진 변경 사항이나, --check와 함께 쓴 경우 만들어졌을 변경 사항을 보고합니다. diff 모드는 파일을 다루는 모듈(예: template 모듈)에서 가장 흔하지만, 다른 모듈도 '전후' 정보를 보여줄 수 있어요(예: user 모듈).
diff 모드는 출력량이 많기 때문에 한 번에 한 호스트를 확인할 때 가장 좋습니다. 예를 들면:
ansible-playbook foo.yml --check --diff --limit foo.example.com
버전 2.4에서 추가되었어요.
작업에서 diff 모드 강제하기 또는 막기 (Enforcing or preventing diff mode on tasks)
--diff 옵션은 민감한 정보를 드러낼 수 있으므로, diff: false를 지정해 특정 작업에서 이를 비활성화할 수 있어요. 예를 들면:
tasks:
- name: This task will not report a diff when the file changes
ansible.builtin.template:
src: secret.conf.j2
dest: /etc/secret.conf
owner: root
group: root
mode: '0600'
diff: false
더 알아보기 (Learn more)
- 체크 모드에서 사용하는 조건부(
when, 등록 변수)는 "조건문(playbooks_conditionals)" 페이지에서 더 자세히 배울 수 있어요.