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

时间:2017-01-15 16:43:38

标签: ansible ansible-2.x

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

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

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

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

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

任务..

- 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

1 个答案:

答案 0 :(得分:2)

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

  • 运行所有其他任务后(默认)
  • on functionName($your, $variables, $here); 任务(“notify”标志被重置,如果再次通知处理程序,它将再次运行)

您的代码存在的问题是,在执行meta: flush_handlers处理程序时,您的Done变量的最后一个值为donefile

您可以添加任务:

donefile=ensure-npm-does-not-use-unicode
在更改- meta: flush_handlers 的值之前

,以便对于给定值,将运行处理程序。唯一的问题是它没有多大意义 - 它可以是常规任务而不是处理程序。

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

如果您想运行一次,您可以使用常规任务或donefile条件下的任务。