如何遍历列表变量来填写Ansible任务的选项?

时间:2016-06-01 17:56:59

标签: ansible yaml ansible-playbook

说我开始使用Docker Container,并有一个应用列表,包括端口信息,如下所示:

my_apps:
  - name: App1
    ports:
      - "2000:2000"
  - name: App2
    ports:
      - "2001:2001"

在以下任务中,是否有一种简单的方法可以将所有应用程序的上述变量中​​的所有端口提取到下面的ports选项中?

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

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

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

- vars:
  list_of_ports:
    - 2000:2000
    - 2001:2001

...然后在你的游戏中:

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

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

答案 1 :(得分:1)

您可以使用set_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 }}"

答案 2 :(得分:1)

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

my_apps | map(attribute='ports') | list

或在你的任务中:

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