代码之家  ›  专栏  ›  技术社区  ›  codec

设置事实创建包含项的列表

  •  0
  • codec  · 技术社区  · 7 年前

    我的任务是调用一个a p i并在一个varaible中注册o/p;

    - 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 }}'
    

    OLDYEngulyIsAccess关键字:

    "old_existing_access_keys_sl.results": [
     {
                "json": [
                    {
                        "accountId": 12345, 
                        "id": 70825621, 
                        "username": "xyz-11"
                    }
                ]
    },
    {
                "json": [
                    {
                        "accountId": 12345, 
                        "id": 70825621, 
                        "username": "abc-12"
                    }
                ]
    }
    

    我想列出 id 用于进一步处理的尝试了以下任务,但这不起作用:

    - name: Create a list of account ids
      set_fact: 
        admin_usernames = "{{ item.json[0].id | list }}"
      with_items: old_existing_access_keys_sl.results
    

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

        - name: create a list
          set_fact:
             foo: "{% set foo = [] %}{% for i in old_existing_access_keys_sl.results %}{{ foo.append(i) }}{% endfor %}"
    

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

    
    TASK [result] *****************************************************************************************************************************************
    ok: [localhost] => {
        "foo": ""
    }
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   larsks    7 年前

    给定示例数据,可以使用 json_query 过滤器,如下所示:

    ---
    - 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')
    

    这将输出:

    TASK [debug] **********************************************************************************************************************************************************************************
    ok: [localhost] => {
        "old_existing_access_keys_sl|json_query('results[*].json[0].id')": [
            70825621, 
            70825621
        ]
    }
    

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

        - set_fact:
            admin_ids: "{{ old_existing_access_keys_sl|json_query('results[*].json[0].id') }}"
    

    更新

    对于字典列表,只需更改 json_查询 表达式:

    - debug:
        var: "old_existing_access_keys_sl|json_query('results[*].json[0].{id: id, username: username}')"
    

    有关详细信息,请参见 jmespath website 用于文档和示例。