我想通过循环创建一个新列表。我创建了一个这样的任务。安塞布尔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)
如何获取所有地址的列表,最好是唯一地址的列表?
在你的任务中:
- 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)
我发现这使得表达更简单一些。
| 归档时间: |
|
| 查看次数: |
6910 次 |
| 最近记录: |