Ansible处理程序读取本地事实

时间:2017-04-16 00:14:45

标签: ansible ansible-facts ansible-handlers

我有一个Ansible手册,可以在一组服务器中安装可变数量的应用程序。要安装应用程序,必须运行许多顺序任务,并且由于可能有多个应用程序,因此我使用with_items:

循环它们。

我还注册了本地事实的任何更改,如果在应用程序A上执行了三个任务,则会标记应用程序A.

我遇到了处理程序的问题。它应该读取这些本地事实并重新启动任何已标记的应用程序,但我无法实现此目的。我的处理程序只是跳过,但调试显示带有标志的本地事实。

我的剧本与此类似:

---
- name: Ensure the application's jar file exists
  copy:
    src: '{{ item.appName }}/{{ item.jarName }}'
    dest: '{{ AppsRootFolder }}/{{ item.appName }}/{{ item.jarName }}'
  register: task
  with_items: '{{ deployApp }}'
  notify: Restart application

- name: Registering App for later restart
  set_fact:
    myapps_toberestarted_{{ item.item.appName }}: "{{ item.changed }}"
  with_items: "{{ task.results }}"
  when: "{{ item.changed }}"

- name: Ensure the application's conf file exists
  template:
    src: '{{ item.confName }}.j2'
    dest: '{{ AppsRootFolder }}/{{ item.appName }}/{{ item.confName }}'
  register: task
  with_items: '{{ deployApp }}'
  notify: Restart application

- name: Registering App for later restart
  set_fact:
    myapps_toberestarted_{{ item.item.appName }}: "{{ item.changed }}"
  with_items: "{{ task.results }}"
  when: "{{ item.changed }}"

处理程序我需要帮助,如下所示。它正在跳过"重启应用程序"任务:

- name: Restart application
  debug: var=myapps_toberestarted_{{ item.appName }}
  with_items: "{{ deployApp }}"
  when: myapps_toberestarted_{{ item.appName }} == 'true'

最后我的group_vars

AppsRootFolder: /opt/Apps
deployApp:
  - { appName: "API", jarName: "api.jar", confName: "api.conf" } 
  - { appName: "Demo", jarName: "demo.jar", confName: "demo.conf" } 
  - { appName: "Another", jarName: "another.jar", confName: "another.conf" } 

1 个答案:

答案 0 :(得分:0)

true / false(在任务结果&{39; changed变量中注册,因此也在item.changed中)是布尔值而不是字符串,因此您可以定义条件在处理程序中这样:

when: myapps_toberestarted_{{ item.appName }}

使用== 'true',您将其与字符串进行比较,该字符串将始终显示否定结果。