繁体   English   中英

使用Ansible,记住先前成功执行的命令的最佳方法是什么?

[英]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 本地语言)。

在处理程序中,使用copy模块和content参数将状态另存为/etc/ansible/facts.d下的JSON文件。

只要您通过常规的事实收集过程与主持人进行对战,就可以检索和访问该文件。

然后,您可以使用when条件控制任务(您需要在情况不存在时包括default过滤器)。

理想情况下,使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM