如何遍历列表变量以填写Ansible任务';什么是选择?

如何遍历列表变量以填写Ansible任务';什么是选择?,ansible,yaml,ansible-playbook,Ansible,Yaml,Ansible Playbook,假设我正在启动一个Docker容器,并有一个应用程序列表,包括如下端口信息: my_apps: - name: App1 ports: - "2000:2000" - name: App2 ports: - "2001:2001" 在下面的任务中,是否有一种简单的方法可以将所有应用程序的所有端口从上述变量提取到下面的端口选项中 - My Docker Container docker_container: name: ubunty

假设我正在启动一个Docker容器,并有一个应用程序列表,包括如下端口信息:

my_apps:
  - name: App1
    ports:
      - "2000:2000"
  - name: App2
    ports:
      - "2001:2001"
在下面的任务中,是否有一种简单的方法可以将所有应用程序的所有端口从上述变量提取到下面的端口选项中

- My Docker Container
  docker_container:
   name: ubunty
   image: ubuntu
   ports:
     - "2000:2000" 
     - "2001:2001" 

目前,我有另一个列表用于所有端口,但为了添加另一个端口,我必须将其添加到两个列表中,这变得很麻烦。我希望有另一种方法。

您可以执行以下操作:

- vars:
  list_of_ports:
    - 2000:2000
    - 2001:2001
…然后在你的剧本中:

- name: App1
    ports: {{ list_of_ports }}
- name: App2
    ports: {{ list_of_ports }}

上述内容在语法上可能不完全正确,但它足够接近您的想法。

您可以使用
set\u fact
创建一个新变量,并为每个变量添加端口值。然后用它来调用您的容器

tasks:
  - name: Initialize ports
    set_fact: ports=[]

  - name: Collect ports from apps
    set_fact: ports="{{ports}} + {{item.ports}}"
    with_items: "{{ my_apps }}"
然后使用ports变量调用容器

  - My Docker Container
    docker_container:
    name: ubunty
    image: ubuntu
    ports: "{{ ports }}"

以下是一个使用jinja过滤器的解决方案,可将应用程序列表缩减为端口列表:

my_apps | map(attribute='ports') | list
或者在您的任务中:

- My Docker Container
  docker_container:
    name: ubunty
    image: ubuntu
    ports: "{{ my_apps | map(attribute='ports') | list }}"

还有另一种方法,你可以使用Jinja2,我自己也是Jinja2的noob,但我知道可以用它来完成。每个应用程序不一定都有所有的端口。那么我想你被卡住了。