我在Ansible手册中有以下角色来确定Packer的已安装版本,如果它与本地变量的版本不匹配,则有条件地安装它:
---
# detect packer version
- name: determine packer version
shell: /usr/local/bin/packer -v || true
register: packer_installed_version
- name: install packer cli tools
unarchive:
src: https://releases.hashicorp.com/packer/{{ packer_version }}/packer_{{ packer_version }}_linux_amd64.zip
dest: /usr/local/bin
copy: no
when: packer_installed_version.stdout != packer_version
问题/烦恼是Ansible将此步骤标记为“已更改”:
我想收集这个事实,而不会将某些事情标记为已更改,以便我可以在我的剧本执行结束时可靠地知道,如果事实上有任何改变。
有没有更好的方法来解决我正在做的事情?
答案 0 :(得分:21)
来自Ansible docs:
覆盖版本1.3中新增的更改结果。
当shell /命令或其他模块运行时,它通常会报告 “改变”状态取决于它是否认为它影响了机器状态。
有时您会根据返回代码或输出知道它 没有做任何改变,并希望覆盖“改变”的结果 这样它不会出现在报告输出中或不会导致 处理人员:
tasks:
- shell: /usr/bin/billybass --mode="take me to the river"
register: bass_result
changed_when: "bass_result.rc != 2"
# this will never report 'changed' status
- shell: wall 'beep'
changed_when: False
在您的情况下,您需要:
---
# detect packer version
- name: determine packer version
shell: /usr/local/bin/packer -v || true
register: packer_installed_version
changed_when: False
- name: install packer cli tools
unarchive:
src: https://releases.hashicorp.com/packer/{{ packer_version }}/packer_{{ packer_version }}_linux_amd64.zip
dest: /usr/local/bin
copy: no
when: packer_installed_version.stdout != packer_version