작업 검증: 체크 모드와 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)" 페이지에서 더 자세히 배울 수 있어요.