Ansible 使用“with_items”创建列表

De1*_*e1f 2 ansible

我想通过循环创建一个新列表。我创建了一个这样的任务。安塞布尔2.9.10

- name: "Generate list"
  set_fact:
    dst: "{{dst_list | default([])}} + [ '{{ item[0] }}' ]" 
  with_items:
    - "{{failed_connections}}"
- debug: var=dst


"failed_connections": [
    [
        "1.1.1.1", 
        8888
    ], 
    [
        "1.1.1.1", 
        8080
    ], 
    [
        "2.2.2.2", 
        8888
    ], 
    [
        "2.2.2.2", 
        8080
    ], 
    [
        "2.2.2.2", 
        443
    ]
]
Run Code Online (Sandbox Code Playgroud)

我最终只得到列表中的最后一项。

TASK [access-consul-kv : Generate list] 

*********************************************************************************************
ok: [127.0.0.1] => (item=[u'1.1.1.1', 8888])
ok: [127.0.0.1] => (item=[u'1.1.1.1', 8080])
ok: [127.0.0.1] => (item=[u'2.2.2.2', 8888])
ok: [127.0.0.1] => (item=[u'2.2.2.2', 8080])
ok: [127.0.0.1] => (item=[u'2.2.2.2', 443])

TASK [access-consul-kv : debug] *****************************************************************************************************ok: [127.0.0.1] => {
    "dst": [
        "2.2.2.2"
    ]
}
Run Code Online (Sandbox Code Playgroud)

如何获取所有地址的列表,最好是唯一地址的列表?

lar*_*sks 6

在你的任务中:

- name: "Generate list"
  set_fact:
    dst: "{{dst_list | default([])}} + [ '{{ item[0] }}' ]" 
  with_items:
    - "{{failed_connections}}"
Run Code Online (Sandbox Code Playgroud)

您设置dst为+某个值的值dst_list。由于您从未定义dst_list,因此您总是从表达式中获取值default([]),因此您的set_fact任务实际上如下所示:

set_fact:
  dst: [ '{{ item[0] }}' ]
Run Code Online (Sandbox Code Playgroud)

如果要附加到列表,则需要使用在表达式set_fact内设置的变量的名称set_fact,如下所示:

set_fact:
  dst: "{{ dst|default([]) + [ item[0] ] }}"
Run Code Online (Sandbox Code Playgroud)

请注意,我们在这里只需要一组{{...}}标记。

default我经常会通过使用vars键设置默认值来避免使用过滤器,如下所示:

- name: "Generate list"
  set_fact:
    dst: "{{ dst + [ item[0] ] }}"
  with_items:
    - "{{failed_connections}}"
  vars:
    dst: []
Run Code Online (Sandbox Code Playgroud)

我发现这使得表达更简单一些。