使用Ansible过滤器获取属性值

时间:2016-09-09 19:34:24

标签: python json ansible ansible-playbook ansible-2.x

我正在尝试从JSON数据中获取属性值。

这是我的JSON数据:

{
   "user1": "{\n \"data\":[\n    {\n     \"secure\": [\n       {\n              \"key\": \"-----BEGIN  KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----\"\n       }\n      ],\n     \"owner\": \"shallake\",\n     \"position\": \"gl\"\n    }\n   ]\n}"
}

最初,我有无效的JSON数据,因此我使用to_jsonfrom_json将其转换为有效的JSON。上面的JSON数据是我得到的结果。

代码:

 - set_fact:
      user: "{{ lookup('file','filepath/myfile.json') | to_json }}"

 - set_fact:
      user1: "{{ user | from_json}}"

 - set_fact:
      user3: "{{ item }}"
   with_items: "{{ user1['data'] | map(attribute='position') | list }}"

在第三个set_fact中,我试图获取位置属性值。但是它显示了这样的错误:

  

字段'args'具有无效值,该值似乎包含未定义的变量。错误是:'item'未定义

     

“\”{\ n \\“data \\”:[\ n {\ n \\“secure \\”:[\ n {\ n \\“key \\”:\\“ - --- BEGINPRIVATE KEY ----- \ nMIIEowIBAAKCAQEAgOh + Afb0oQEnvHifHuzBwl + Tiu8LXoJXb / ii / eh \ ngYEP3 \ n ----- END PRIVATE KEY ----- \\“\ n} \ n],\ n \ \“owner \\”:\\“shalloke \\”,\ n \\“position \\”:\\“gl \\”\ n} \ n] \ n} \ n \ n \“”

那么如何使用Ansible循环从上面的JSON数据结果中获取位置值?

2 个答案:

答案 0 :(得分:0)

请检查filepath/myfile.json中的密钥是否跨越多行?我们需要在JSON中转义换行符。使用\n替换换行符。

支持user1是从JSON解析的地图。但是,filepath/myfile.json中的JSON可能无效。所以在第二个set_fact中,无法解析这个无效的JSON。因此,user1只是一个字符串。它不包含条目data

{
  "data":[
      {
      "secure": [
        {
                "key": "-----BEGIN  KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----"
        }
        ],
      "owner": "shallake",
      "position": "gl"
      }
    ]
}

How do I handle newlines in JSON?

答案 1 :(得分:0)

在将JSON格式的文件导入Ansible字典时,您应该使用from_json(非to_json)过滤器,或者根本不使用过滤器。

我指出了下面的错误,但首先是一个有效的例子:

  • myfile.json

    {
      "data": [
        {
          "secure": [
            {
              "key": "-----BEGIN  KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----"
            }
          ],
          "owner": "shallake",
          "position": "gl"
        }
      ]
    }
    
  • 剧本:

    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      tasks:
        - set_fact:
            data_from_json: "{{ lookup('file','./myfile.json') | from_json }}"
    
        - set_fact:
            position: "{{ item }}"
          with_items: "{{ data_from_json['data'] | map(attribute='position') | list }}"
    
        - name: Display extracted position
          debug:
            var: position
    
  • 结果(仅限相关任务):

    TASK [Display extracted position] *********************************************************************************************************
    ok: [localhost] => {
        "position": "gl"
    }
    

现在你的错误:

您的myfile.json不是正确的JSON文件。

您似乎查看了Ansible的日志,并将其从屏幕复制到文件中。正如您已经看到的那样,它将不是有效的JSON格式(它将包含转义引号和换行符,这将阻止导入它。)

如果要将Ansible字典复制到文件中,可以使用以下任务执行此操作(我假设此处的数据位于data_from_json变量中,就像我上面的示例playbook末尾一样) :

- local_action: copy content={{ data_from_json | to_nice_json }} dest=./myfile2.json

to_nice_json在这里是可选的,但它会产生与上面的myfile.json非常相似的输出(键的顺序可能会改变和缩进)。