在 Jinja2 模板中循环 Ansible 变量数组以创建嵌套字典
Loop over Ansible variable array in Jinja2 template to create nested dictionary
这是输出。
"result.containers":[
{
"Image":"ca.docker/webproxy:1.0.0",
"Names":[
"/customer1"
]
},
{
"Image":"docker.local/egacustomer:1.0.1",
"Names":[
"/webproxy"
]
}
]
我正在尝试使用 jinja2 创建嵌套字典。
我正在尝试使用 results.container 和 setfact.
实现以下目标
"containerlist": "[webproxy:
name: customer1,
egacustomer:
name: webproxy]"
这是我的 jinja2 代码。
- set_fact:
containerlist: |
[
{% for item in result.containers %}
{{ item.Image | regex_replace('.*?/(.*?):.*', '\1') }}:
'name': {{ item.Names | regex_replace("^/", "") }},
{% endfor %}
这会引发错误。有人可以用正确的 Jinja2 帮助我 Code.Any 帮助将不胜感激
"containerlist": "[\n\1:\n 'name': ['/customer'],\n\1:\n 'name': ['/webproxy'],\n,\n]\n"
对于你想要做的事情,我会规范化使用 Ansible 循环任务,而不是尝试使用 Jinja {% for ... %}
循环。例如,这些任务...
- set_fact:
container_list: >-
{{
container_list + [{
item.Image.split('/')[-1].split(':')[0]:
item.Names[0][1:]
}]
}}
loop: "{{ result.containers }}"
vars:
container_list: []
- debug:
var: container_list
在 set_fact
任务中,我们循环 result.containers
,对于循环的每次迭代,我们将 container_list
重新定义为“container_list
的当前内容+ 一本新词典。
以上产生以下输出:
TASK [set_fact] ****************************************************************
ok: [localhost] => (item={'Image': 'ca.docker/webproxy:1.0.0', 'Names': ['/customer1']})
ok: [localhost] => (item={'Image': 'docker.local/egacustomer:1.0.1', 'Names': ['/webproxy']})
TASK [debug] *******************************************************************
ok: [localhost] => {
"container_list": [
{
"webproxy": "customer1"
},
{
"egacustomer": "webproxy"
}
]
}
这是输出。
"result.containers":[
{
"Image":"ca.docker/webproxy:1.0.0",
"Names":[
"/customer1"
]
},
{
"Image":"docker.local/egacustomer:1.0.1",
"Names":[
"/webproxy"
]
}
]
我正在尝试使用 jinja2 创建嵌套字典。 我正在尝试使用 results.container 和 setfact.
实现以下目标"containerlist": "[webproxy:
name: customer1,
egacustomer:
name: webproxy]"
这是我的 jinja2 代码。
- set_fact:
containerlist: |
[
{% for item in result.containers %}
{{ item.Image | regex_replace('.*?/(.*?):.*', '\1') }}:
'name': {{ item.Names | regex_replace("^/", "") }},
{% endfor %}
这会引发错误。有人可以用正确的 Jinja2 帮助我 Code.Any 帮助将不胜感激
"containerlist": "[\n\1:\n 'name': ['/customer'],\n\1:\n 'name': ['/webproxy'],\n,\n]\n"
对于你想要做的事情,我会规范化使用 Ansible 循环任务,而不是尝试使用 Jinja {% for ... %}
循环。例如,这些任务...
- set_fact:
container_list: >-
{{
container_list + [{
item.Image.split('/')[-1].split(':')[0]:
item.Names[0][1:]
}]
}}
loop: "{{ result.containers }}"
vars:
container_list: []
- debug:
var: container_list
在 set_fact
任务中,我们循环 result.containers
,对于循环的每次迭代,我们将 container_list
重新定义为“container_list
的当前内容+ 一本新词典。
以上产生以下输出:
TASK [set_fact] ****************************************************************
ok: [localhost] => (item={'Image': 'ca.docker/webproxy:1.0.0', 'Names': ['/customer1']})
ok: [localhost] => (item={'Image': 'docker.local/egacustomer:1.0.1', 'Names': ['/webproxy']})
TASK [debug] *******************************************************************
ok: [localhost] => {
"container_list": [
{
"webproxy": "customer1"
},
{
"egacustomer": "webproxy"
}
]
}