如何将字典查找与When条件和with_items结合使用

时间:2019-08-31 11:05:10

标签: ansible ansible-facts

我需要以下Pre-reboot task for node servers任务的正确语法的帮助。

我有多个EC2实例,它们的 tag:Name 等于 webapp1,webapp2,webapp3和intranet1,intranet2。 我试图创建一个通用任务,以便在修补和重新启动每个服务器之前停止每个服务器上的节点服务。

在下面的任务中,我基本上想实现字典的查找,以在时为每个服务器获取app_nameapp_folder(并将其传递给stop-node-services.yml)。 EC2实例的tag:Name nodeapps 名称匹配,例如webappintranet(来自vars)。

注意::以下name_tag条件中的变量when包含实例的标签:名称,该名称来自剧本中的ec2_instance_facts模块: name_tag: "{{ ec2_facts.instances[0].tags.Name }}"

        nodeapps:
          webapp:
            app_name: webapp55
            app_folder: applications/webapp123
          intranet:
            app_name: intranet66
            app_folder: applications/intranet234


# Pre-reboot task for node servers
- include: stop-node-services.yml 
  with_items:
    - { name : "{{ item.value.app_name }}", folder : "{{ item.value.app_folder }}" }
  loop: "{{ lookup('dict', nodeapps) }}"
  when:  
    - name_tag is regex("{{ item.key }}\d")


### This is whats in the stop-node-services.yml ###
- name: restart service 
  become: true
  become_user: ubuntu
  shell: sudo sv stop . 
  args:
    chdir: /var/hubdoc/{{ item.folder }}

- debug:
    msg: "The '{{ item.name }}' on {{ inventory_hostname }} - service stopped"```

1 个答案:

答案 0 :(得分:0)

以下语法对我有用。在此处发布答案以使他人受益:

- include: stop-node-services.yml name={{ item.value.app_name }} folder={{ item.value.app_folder }}
  when: tags is regex("{{ item.key }}\d")
  loop: "{{ lookup('dict', nodeapps) }}"


### This is whats in the stop-node-services.yml ###
- name: stop service 
  become: true
  become_user: ubuntu
  shell: sudo sv stop . 
  args:
    chdir: /var/hubdoc/{{ folder }}

- debug:
    msg: "The '{{ name }}' on {{ inventory_hostname }} - service stopped"