使用Ansible过滤器获取属性值

2024-10-03 15:30:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从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数据是我得到的结果。在

代码:

^{pr2}$

在第三个set_fact中,我试图获得position属性值。但它显示了这样一个错误:

the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'item' is undefined

"\"{\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数据结果中获取位置值呢?在


Tags: to数据keyjsondata属性isposition
2条回答

将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变量中,就像在上面我的示例剧本的末尾一样):

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

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

请检查一下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?

相关问题 更多 >