首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >set_fact创建一个包含项的列表

set_fact创建一个包含项的列表
EN

Stack Overflow用户
提问于 2019-04-08 18:37:19
回答 1查看 1.7K关注 0票数 0

我有一个任务,它调用一个API,我在一个变量中注册了o/p;

代码语言:javascript
复制
- name: Get Object storage account ID
  uri:
    url: 'https://api.softlayer.com/rest/v3.1/SoftLayer_Network_Storage_Hub_Cleversafe_Account/getAllObjects.json?objectFilter={"username":{"operation":"{{ item }}"}}'
    method: GET
    user: abxc
    password: 66c94c447a6ed8a0cf058774fe38
    validate_certs: no
  register: old_existing_access_keys_sl
  with_items: '{{ info["personal"].sl_cos_accounts }}'

old_existing_access_keys_sl持有:

代码语言:javascript
复制
"old_existing_access_keys_sl.results": [
 {
            "json": [
                {
                    "accountId": 12345, 
                    "id": 70825621, 
                    "username": "xyz-11"
                }
            ]
},
{
            "json": [
                {
                    "accountId": 12345, 
                    "id": 70825621, 
                    "username": "abc-12"
                }
            ]
}

我想列出一个用于进一步处理的id的列表,尝试了以下任务,但这没有奏效:

代码语言:javascript
复制
- name: Create a list of account ids
  set_fact: 
    admin_usernames = "{{ item.json[0].id | list }}"
  with_items: old_existing_access_keys_sl.results

我不确定这是否可能。我也试过这个:

代码语言:javascript
复制
    - name: create a list
      set_fact:
         foo: "{% set foo = [] %}{% for i in old_existing_access_keys_sl.results %}{{ foo.append(i) }}{% endfor %}"

foo总是以空白和字符串的形式出现:

代码语言:javascript
复制
TASK [result] *****************************************************************************************************************************************
ok: [localhost] => {
    "foo": ""
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-08 19:03:13

给定示例数据,可以使用json_query筛选器提取ids列表,如下所示:

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false
  vars:
    old_existing_access_keys_sl:
      results:
        [
          {
            "json": [
              {
                "accountId": 12345,
                "id": 70825621,
                "username": "xyz-11"
              }
            ]
          },
          {
            "json": [
              {
                "accountId": 12345,
                "id": 70825621,
                "username": "abc-12"
              }
            ]
          }
        ]
  tasks:
    - debug:
        var: old_existing_access_keys_sl|json_query('results[*].json[0].id')

这将产生以下结果:

代码语言:javascript
复制
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "old_existing_access_keys_sl|json_query('results[*].json[0].id')": [
        70825621, 
        70825621
    ]
}

如果要将这些内容存储在新变量中,可以用debug替换该set_fact任务。

代码语言:javascript
复制
    - set_fact:
        admin_ids: "{{ old_existing_access_keys_sl|json_query('results[*].json[0].id') }}"

更新

对于字典列表,只需更改json_query表达式:

代码语言:javascript
复制
- debug:
    var: "old_existing_access_keys_sl|json_query('results[*].json[0].{id: id, username: username}')"

有关更多信息,请参见jmespath网站获得文档和示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55579781

复制
相关文章

相似问题

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