2017-04-16 72 views
0

我有一个Ansible操作手册在一组服务器中安装可变数量的应用程序。安装的应用程序,一些顺序任务必须运行,并且因为可能有多个应用程序,我遍历他们with_items:Ansible处理器读取本地事实

我也以这样一种方式,如果三个任务都登记在一个地域的实际情况的任何变化在应用程序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' 

而且finaly我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" } 

回答

0

true/false(在任务结果changed变量注册,在item.changed因此也)是布尔值不是字符串,所以你可以用这种方式在处理程序中定义你的条件:

when: myapps_toberestarted_{{ item.appName }} 

Wi th == 'true'你将它与一个总是给出否定结果的字符串进行比较。

+0

你说得对,谢谢。现在它按预期工作。实际上,我还添加了一个默认设置,以避免其他应用程序未被修改的错误,因此,本地事实未设置**'when:myapps_toberestarted _ {{item.appName}} |默认([])'**这可以防止像这样的错误:'在评估条件'var时出错是未定义的' – felichas