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