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

How to combine dictionary lookup with When condition and with_items

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

我有多个 EC2 实例 tag:Name 等于 webapp1、webapp2、webapp3 和 intranet1、intranet2。 我正在尝试创建一个通用任务来停止每台服务器上的节点服务,然后再修补并重新启动每台服务器。

在下面的任务中,我基本上是在尝试实现字典查找,以便在 app_name 和每个服务器的 app_folder(并将其传递给 stop-node-services.yml)时 tag:Name of EC2 instancenodeapps key 名称相匹配,例如webappintranet(来自变量)。

注:下面when条件中的变量name_tag包含ec2_instance_facts模块的Instance的tag:Name在剧本中更进一步: 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"```

以下语法对我有用。在这里发布答案以供其他人受益:

- 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"