Ansible 使用 'with_items' 创建列表

标签 ansible

我想通过循环创建一个新列表。我创建了一个这样的任务。 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
    ]
]

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

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

我怎样才能得到所有地址的列表,最好只有唯一的地址?

最佳答案

在你的任务中:

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

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

set_fact:
  dst: [ '{{ item[0] }}' ]

如果你想附加到一个列表,你需要在 set_fact 表达式中使用你通过 set_fact 设置的变量名,像这样:

set_fact:
  dst: "{{ dst|default([]) + [ item[0] ] }}"

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

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

- name: "Generate list"
  set_fact:
    dst: "{{ dst + [ item[0] ] }}"
  with_items:
    - "{{failed_connections}}"
  vars:
    dst: []

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

关于Ansible 使用 'with_items' 创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63901346/

相关文章:

ansible - 比较多个主机的 ansible 注册变量

Ansible ec2 : "boto required for this module"

ansible - 在模板文件中迭代时的多个组

ansible - 如何并行运行多个ansible play?

loops - 在 Ansible 中使用 with_dict 循环遍历注册变量

ansible - 如何在 Ansible 中取消服务的屏蔽?

ansible - 在 Ansible 中检查已安装的 yum 包/rpm 版本并使用它的最佳方法

ansible - 我可以根据 ansible 详细级别将 ansible no_log 设置为默认值吗?

vagrant - Vagrant 中的单独的可配置资源手册

Ansible:合并已多次使用的项目变量