Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Ansible筛选器获取属性值_Python_Json_Ansible_Ansible Playbook_Ansible 2.x - Fatal编程技术网

Python 使用Ansible筛选器获取属性值

Python 使用Ansible筛选器获取属性值,python,json,ansible,ansible-playbook,ansible-2.x,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\": \"sha

我试图从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数据,所以我使用
到\u JSON
从\u JSON
将其转换为有效的JSON。上面的JSON数据就是我得到的结果

代码:

在第三个
集合\u fact
中,我试图获取位置属性值。但它显示了这样一个错误:

字段“args”的值无效,似乎包含未定义的变量。错误是:“项”未定义

“\”{\n\\“数据\\”:[\n{\n\\“安全\\”:[\n{\n\\“密钥\\”:\“----开始私钥----BEGINPRIVATE密钥----nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwl+TIU8LXOJOJXB/ii/eh\ngYEP3\n----END私钥---\\\”\n}\n}\n\\“所有者\\”:\\\“shalloke\\”,\n\\“位置\\:“gl\\”\n\n\n\n


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

请检查
filepath/myfile.JSON
中的键是否跨越多行?我们需要在JSON中避免换行。使用
\n
替换换行符

支持将
user1
作为从JSON解析的映射。但是,
filepath/myfile.JSON
中的JSON可能无效。因此,在第二个
集合\u fact
中,无法解析这个无效的JSON。因此,
user1
只是一个字符串。而且它不包含条目
数据

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

将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
    
  • 结果(仅限相关任务):


现在你的错误是:

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

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

如果您想将Ansible字典复制到一个文件中,可以使用以下任务(我假设数据位于
data\u from\u json
变量中,如上面示例playbook的末尾所示):


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

这是我从我的代码集中得到的结果\u事实:user1:“{user | from_json}”,我试图得到“位置”json数据结果的属性值。我已经尝试过了,现在我将我的数据转换为如下“\”{\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”----BEGINPRIVATE key----------\\nMIIeowibaakcaqueagoh+Afb0oQEnvHifHuzBwl+Tiu8lXbojXb/ii/eh\\ngYEP3\\n--------------END私钥------\\\\\\\\\\\\\\\n\\n],\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ansible@jake我不知道你想要什么。你可以通过
“{{user2['data']|map(attribute='position')|list}}}”
获取位置列表。我这样做是为了单独获取“position”属性。但它显示为失败!=>{“failed”:true,“msg”:“字段'args'有一个无效值,它似乎包含一个未定义的变量。错误是:'unicode object'没有属性'data'\n如何使用ANSIBLE not with python处理:第6行第61列(char 110)处的无效控制字符”在ansible中,由于json数据的安全键值中有空格,所以会出现此错误。
---
- 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"
}
- local_action: copy content={{ data_from_json | to_nice_json }} dest=./myfile2.json