[英]With Ansible what is the best way of remembering a command has executed successfully previously?
使用命令模块 ,如果命令创建了文件,则可以检查该文件是否存在。 如果这样做,将阻止命令再次执行。
- command: touch ~/myfile
args:
creates: ~/myfile
但是,如果该命令未创建文件,则在重新运行时它将再次执行。
为了避免再次执行,我在更改时创建了一些随机文件(通知),如下所示:
- command: dothisonceonly # this does not create a file
args:
creates: ~/somefile
notify: done
然后处理程序:
- name: done
command: touch ~/somefile
这种方法有效,但是有点难看。 任何人都可以放弃最佳实践吗? 也许设置一些事实? 也许是全新的方法?
理想情况下,使用Ansible,请检查第一个命令已更改的状态,而不是使用文件作为代理。 原因是检查某事物的实际状态会提供更好的不变性,因为每次通过都会对其进行测试。
如果有理由不使用该方法。 然后注册命令的结果,并使用它而不是通知程序来触发文件的创建。
- command: dothisonceonly # this does not create a file
creates: ~/somefile
register: result
- file:
path: ~/somefile
state: touch
when: result|succeeded
如果您想看看这里发生了什么,请添加:
- debug: var=result
注意通知者,它们在播放结束时运行。 这意味着,如果通知程序是由任务触发的,但是随后播放无法完成,则通知程序将不会运行。 相反,有Ansible选项可以使通知程序运行,即使未由任务触发也是如此。
这是我基于@techraf的答案的实际实现
- command: echo 'phew'
register: itworks
notify: Done itworks
when: ansible_local.itworks | d(0) == 0
和处理程序:
- name: Done itworks
copy:
content: '{{ itworks }}'
dest: /etc/ansible/facts.d/itworks.fact
文件:
http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d
谢谢@techraf,这很有效,并且可以保留事实。
编辑
在@techraf的注释中应用了默认值逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.