
내 Ansible 플레이북에는 다음이 있습니다.
- name: "A: Check to see if we need to run task B"
[... implementation omitted, not relevant ...]
register: task_a_result
check_mode: no # even run in check mode
changed_when: no # this only reads/checks stuff
- name: "B: Write x to file"
shell: "echo {{ my_var|quote }} > /path/to/file"
when: task_a_result.stdout_lines[0].startswith('ABCDEF')
changed_when: yes # when run, it always changes the state
그래요~ 아니다B를 검사 모드로 실행하고 싶지만(따라서 no check_mode: no
)보고서비검사 모드에서 실행되었다면 변경된 것으로 간주됩니다. 나는 이 행동을 원한다. 왜냐하면비검사 모드로 실행할 때 놀라움을 원하지 않습니다.. 그러나 changed_when: yes
스스로 조건을 설정하고 설정했음에도 불구하고 Ansible은 계속해서 다음과 같은 작업을 표시합니다.건너뛰었습니다따라서변하지 않은나에게:
skipping: [myhost] => changed=false msg: skipped, running in check mode
(위는 확인 모드이고, 일반 비점검 모드에서는 '변경됨'으로 보고됩니다.)
잘못 해석되어 부적절하게 종료된 버그 보고서를 발견했습니다.14950, 하지만 그것에 대해서는 더 이상 언급할 수 없습니다.
제가 기본적인 것을 간과하고 있는 걸까요? 다른 모듈은 일반적으로 Ansible에서 "변경되었을 것입니다" 상태를 완벽하게 보고하지만 이것이 쉘/명령에서도 가능합니까?
Ansible 2.7.12 및 2.8.2를 사용하면 동일한 결과가 나타납니다.
나는 명령 자체에서 다음과 같은 불쾌한 해킹을 피하고 싶습니다.
- name: "B: Write x to file"
shell: "echo {{ my_var|quote }} {{ '>' if task_a_result.stdout_lines[0].startswith('ABCDEF') else '' }} /path/to/file"
when: task_a_result.stdout_lines[0].startswith('ABCDEF')
changed_when: yes
그리고 네, 복사/템플릿 모듈을 사용하여 파일에 쓸 수 있다는 것을 알고 있지만 그렇게 할 수는 없습니다.덮어쓰기예를 들어 echo 1234 > /sys/module/zfs/parameters/zfs_arc_max
복사/템플릿이 보이는 파일을 대체하려고 시도하고 커널 매개변수 설정이 그렇게 작동하지 않기 때문입니다. 아니요, 이 커널 모듈 매개변수는 Linux의 sysctl을 통해 노출되지 않습니다.
답변1
나는 이것이 다소 오래된 것이라는 것을 알고 있지만 이 문제에 대한 해결책을 찾고 있습니다. 나는 또한 명령 모듈을 OP로 사용하는 놀라움에 지쳤습니다.
체크 모드에서 다른 명령을 실행하도록 'command' 부분을 변경하면 어떻게 될까요? 그리고 검사 모드에서도 항상 작업을 실행합니다.
참고: 불평하기 전에 이것이 나쁜 예라는 것을 알고 있습니다. '명령' 모듈에 '생성' 옵션이 있다는 것을 알고 있습니다. 이것은 단지 예를 들기 위한 것입니다.
이것은 지금까지 내 솔루션입니다.
- name: Get some info
stat: {path: /tmp/somefile}
register: file_info
- name: Run the command conditionally
command:
"{{ 'true' if (file_info['stat']['exists'] or ansible_check_mode)
else 'touch /tmp/somefile' }}"
changed_when: not file_info['stat']['exists']
check_mode: false
작동하지만 부풀어 오른다.
더 나은 해결책이 있는지 알려주십시오.
답변2
나에게도 비슷한 필요가 있습니다. 검사 모드에서 실행되지 않을 때 놀라지 않도록 명령이 실행되는지 확인하고 싶습니다.
해결 방법으로 변경 사항이 있음을 보고하는 디버그 작업을 추가하고 명령 작업의 when 조건을 사용하여 디버그 작업에 변경된_when을 설정했습니다.
- name: "Report pending change"
debug:
msg: "Change pending"
changed_when: task_a_result.stdout_lines[0].startswith('ABCDEF')
when: ansible_check_mode|bool