我使用Ansible从防火墙获得一些信息,它以JSON的形式返回输出。如果防火墙安装了多个包,它将返回字典列表。如果只有一个包,则返回一个字典。假设只安装了一个包,那么它将返回一个字典--如何将此字典作为一个项添加到一个新列表中?因此,新列表中只有一个元素。
简单地说,如何将字典作为一项添加到新列表中?
在安装单个包时,可以在这里访问字典。
(output.stdout | from_json).result.system.packages.entry多包
"packages": {
"entry": [
{
"name": "package-1",
"version": "1.1.0",
"info": "installed"
},
{
"name": "package-2",
"version": "1.0.0",
"info": "installed"
}
]
}单包
"packages": {
"entry": {
"name": "package-1",
"version": "1.1.0",
"info": "installed"
}
}编辑
- name: "Set fact"
set_fact:
result: "{{ (output.stdout | from_json).result.system.packages.entry }}"
- name: "debug"
debug:
msg:
- "{{ result | type_debug }}"
- "{{ result }}"
!! RESULT !!
"msg": [
"dict",
{
"name": "package-1",
"version": "1.1.0",
"installed": "yes"
}
]
- name: "Set fact"
set_fact:
result: []
- name: append dict to list
set_fact:
result = "{{ [(output.stdout | from_json).result.system.packages.entry] }}"
- name: "debug"
debug:
msg:
- "{{ result | type_debug }}"
- "{{ result }}"
!! RESULT !!
"msg": [
"list",
[]
] ```发布于 2022-06-04 10:47:32
可以用YAML中的流序定义空列表:
packages: []要将元素添加到该列表中,只需在列表定义中输入该元素:
package: foo
packages: "{{ [package] }}"对于不止一个,添加一个逗号:
package1: foo
package2: foo
packages: "{{ [package1, package2] }}"所以,在你的例子中:
packages: "{{ [(output.stdout | from_json).result.system.packages.entry] }}"这就是说,正如@Zeitounator所指出的,一个更好的办法可能是对所有病例进行相同的处理,并且总是将您的结果包含在列表中。
当packages.entry已经是一个列表时,这确实会创建一个列表列表,但是这种情况可以通过扁平列表来处理,然后Ansible将过滤器添加到Jinja。
所以,你的结局是:
packages: >-
{{
[
(output.stdout | from_json).result
.system
.packages
.entry
]
| flatten
}}https://stackoverflow.com/questions/72498918
复制相似问题