首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字典作为项添加到空列表中

将字典作为项添加到空列表中
EN

Stack Overflow用户
提问于 2022-06-04 10:16:22
回答 1查看 141关注 0票数 2

我使用Ansible从防火墙获得一些信息,它以JSON的形式返回输出。如果防火墙安装了多个包,它将返回字典列表。如果只有一个包,则返回一个字典。假设只安装了一个包,那么它将返回一个字典--如何将此字典作为一个项添加到一个新列表中?因此,新列表中只有一个元素。

简单地说,如何将字典作为一项添加到新列表中?

在安装单个包时,可以在这里访问字典。

代码语言:javascript
复制
(output.stdout | from_json).result.system.packages.entry

多包

代码语言:javascript
复制
"packages": {
    "entry": [
        {
            "name": "package-1",
            "version": "1.1.0",
            "info": "installed"
        },
        {
            "name": "package-2",
            "version": "1.0.0",
            "info": "installed"
        }
    ]
}

单包

代码语言:javascript
复制
"packages": {
    "entry": {
        "name": "package-1",
        "version": "1.1.0",
        "info": "installed"
    }
}

编辑

代码语言:javascript
复制
- 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",
        []
    ] ```
EN

回答 1

Stack Overflow用户

发布于 2022-06-04 10:47:32

可以用YAML中的流序定义空列表:

代码语言:javascript
复制
packages: []

要将元素添加到该列表中,只需在列表定义中输入该元素:

代码语言:javascript
复制
package: foo
packages: "{{ [package] }}"

对于不止一个,添加一个逗号:

代码语言:javascript
复制
package1: foo
package2: foo
packages: "{{ [package1, package2] }}"

所以,在你的例子中:

代码语言:javascript
复制
packages: "{{ [(output.stdout | from_json).result.system.packages.entry] }}"

这就是说,正如@Zeitounator所指出的,一个更好的办法可能是对所有病例进行相同的处理,并且总是将您的结果包含在列表中。

packages.entry已经是一个列表时,这确实会创建一个列表列表,但是这种情况可以通过扁平列表来处理,然后Ansible将过滤器添加到Jinja。

所以,你的结局是:

代码语言:javascript
复制
packages: >-
  {{ 
    [
      (output.stdout | from_json).result
        .system
        .packages
        .entry
    ] 
    | flatten
  }}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72498918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档