我可以在一次剧本执行中使用同一个Ansible处理程序两次吗?

我可以在一次剧本执行中使用同一个Ansible处理程序两次吗?,ansible,ansible-2.x,Ansible,Ansible 2.x,我试图创建一个文件来表示脚本/命令的执行已经完成 我知道我们应该避免使用脚本/命令,但在这里我不能 所以为了防止重新执行,我创建了一个文件来表示它已经被执行了 这适用于后一项任务,但不适用于前一项任务 我想知道同一个处理器是否可以使用两次 任务 - set_fact: donefile=nodesource_setup - name: Ensure node install script executed shell: ~/tmp/nodesource_setup.sh >>

我试图创建一个文件来表示脚本/命令的执行已经完成

我知道我们应该避免使用脚本/命令,但在这里我不能

所以为了防止重新执行,我创建了一个文件来表示它已经被执行了

这适用于后一项任务,但不适用于前一项任务

我想知道同一个处理器是否可以使用两次

任务

- set_fact: donefile=nodesource_setup

- name: Ensure node install script executed
  shell: ~/tmp/nodesource_setup.sh >> ~/tmp/nodesource_setup.log
  args:
    creates: ~/tmp/{{ donefile }}.done # Cannot one line this
  notify: Done

- set_fact: donefile=ensure-npm-does-not-use-unicode

- name: Ensure npm does not use unicode
  command: npm config set unicode false
  args:
    creates: ~/tmp/{{ donefile }}.done
  notify: Done
处理程序

- name: Done
  copy:
    content: "done"
    dest: ~/tmp/{{ donefile }}.done
    force: no

处理程序是运行一次的任务:

  • 运行所有其他任务后(默认)
  • meta:flush_handlers
    任务上(重置“notify”标志,如果处理程序再次收到通知,它将再次运行)

代码的问题是,在执行
Done
处理程序时,
donefile
变量的最后一个值为
donefile=确保npm不使用unicode


您可以添加任务:

- meta: flush_handlers
在更改
donefile
的值之前,将运行给定值的处理程序。唯一的问题是它没有多大意义——它可以是一个常规任务,而不是处理程序

处理程序存在的理由是防止它被多次执行,即使有多个任务可能会请求它


如果要运行一次,您可以只运行一次常规任务,或者在条件下运行一次任务。

处理程序是一个运行一次的任务:

  • 运行所有其他任务后(默认)
  • meta:flush_handlers
    任务上(重置“notify”标志,如果处理程序再次收到通知,它将再次运行)

代码的问题是,在执行
Done
处理程序时,
donefile
变量的最后一个值为
donefile=确保npm不使用unicode


您可以添加任务:

- meta: flush_handlers
在更改
donefile
的值之前,将运行给定值的处理程序。唯一的问题是它没有多大意义——它可以是一个常规任务,而不是处理程序

处理程序存在的理由是防止它被多次执行,即使有多个任务可能会请求它


如果您想运行一次,您可以只运行一个常规任务或一个带有
条件的任务。

-meta:flush\u handlers。。是很棒的thx,做了我想要的。伟大的洞察力。与普通任务相比,我更喜欢琐碎通知任务的处理程序,因为它减少了处理程序不启动时执行的任务数量,处理程序被调用了两次,因此您要保存的唯一内容是playbook代码中的四行,这将使将来使用“fire only one”方法中使用的处理程序的用户感到困惑。如果你是唯一一个管理这个剧本的人,那么这可能没什么大不了的。如果你有可能把这件事交给运营团队(或者最好是退休!),我建议你坚持这两项任务,而不是处理程序加元解决方案。-元:刷新处理程序。。是很棒的thx,做了我想要的。伟大的洞察力。与普通任务相比,我更喜欢琐碎通知任务的处理程序,因为它减少了处理程序不启动时执行的任务数量,处理程序被调用了两次,因此您要保存的唯一内容是playbook代码中的四行,这将使将来使用“fire only one”方法中使用的处理程序的用户感到困惑。如果你是唯一一个管理这个剧本的人,那么这可能没什么大不了的。如果你有可能把这件事交给一个运营团队(或者最好是退休!),我建议你坚持这两个任务,而不是处理程序加元解决方案。