需要从 ansible json stdout 获取值并将它们放入列表中

kri*_*a m 1 ansible

鉴于此输入:

"stdout_lines": [  
            "{",  
            "    \"apiVersion\": \"v1\",",  
            "    \"items\": [",  
            "        {",  
            "            \"apiVersion\": \"v1\",",  
            "            \"kind\": \"Namespace\",",  
            "            \"metadata\": {",  
            "                \"annotations\": {",  
            "                    \"kubectl.kubernetes.io/last-applied-configuration\": \"{\\\"apiVersion\\\":\\\"v1\\\",\\\"kind\\\":\\\"Namespace\\\",\\\"metadata\\\":{\\\"annotations\\\":{},\\\"labels\\\":{\\\"istio-injection\\\":\\\"enabled\\\"},\\\"name\\\":\\\"test-rewards\\\"}}\\n\"",  
            "                },",  
            "                \"creationTimestamp\": \"2018-09-25T23:45:37Z\",",  
            "                \"labels\": {",  
            "                    \"istio-injection\": \"enabled\"",  
            "                },",  
            "                \"name\": \"test-rewards\",",  
            "                \"resourceVersion\": \"7399723\",",  
            "                \"selfLink\": \"/api/v1/namespaces/test-rewards\",",  
            "                \"uid\": \"1a8e3-c11d-11e8-9986-8acd436f34\"",  
            "            },",  
            "            \"spec\": {",  
            "                \"finalizers\": [",  
            "                    \"kubernetes\"",  
            "                ]",  
            "            },",  
            "            \"status\": {",  
            "                \"phase\": \"Active\"",  
            "            }",  
            "        },",  
            "        {",  
            "            \"apiVersion\": \"v1\",",  
            "            \"kind\": \"Namespace\",",  
            "            \"metadata\": {",  
            "                \"creationTimestamp\": \"2018-09-26T17:33:42Z\",",  
            "                \"labels\": {",  
            "                    \"istio-injection\": \"enabled\"",  
            "                },",  
            "                \"name\": \"inventory\",",  
            "                \"resourceVersion\": \"15021\",",  
            "                \"selfLink\": \"/api/v1/namespaces/customer-inventory\",",  
            "                \"uid\": \"4fd5bfb6-c1b2-11e8-9986-8a3fc36f34\"",  
            "            },",  
            "            \"spec\": {",  
            "                \"finalizers\": [",  
            "                    \"kubernetes\"",  
            "                ]",  
            "            },",  
            "            \"status\": {",  
            "                \"phase\": \"Active\"",  
            "            }",  
            "        },",  
Run Code Online (Sandbox Code Playgroud)

我试图迭代循环并获取“名称”的所有值并将它们保存在列表中。我有以下任务。但它不起作用

例如值:

\"name\": \"test-rewards\",",

\"name\": \"inventory\",",
Run Code Online (Sandbox Code Playgroud)

还有这个任务:

- name: Show object id  
  set_fact:  
    group_object_value: "{{ (namespaces.stdout_lines | from_json).items[].metadata.name }}"   
  with_items: "{{ namespaces.stdout }}" 
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

lar*_*sks 9

看起来您的 acommandshell任务的标准输出中有 JSON 数据。您想要使用该stdout属性,而不是stdout_lines; 前者是单个文本块,而后者是一个列表,每行输入一个项目。该from_json过滤器仅适用于简单的字符串变量,例如stdout属性。

一旦您对 JSON 数据进行反序列化,您就可以使用json_query过滤器来获取您想要的内容。例如,这个剧本:

---
- hosts: localhost
  gather_facts: false
  vars:
    namespaces:
      stdout: |
        {
          "apiVersion": "v1",
          "items": [
            {
              "apiVersion": "v1",
              "kind": "Namespace",
              "metadata": {
                "annotations": {
        "kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"labels\":{\"istio-injection\":\"enabled\"},\"name\":\"test-rewards\"}}\n"
                },
                "creationTimestamp": "2018-09-25T23:45:37Z",
                "labels": {
                  "istio-injection": "enabled"
                },
                "name": "test-rewards",
                "resourceVersion": "7399723",
                "selfLink": "/api/v1/namespaces/test-rewards",
                "uid": "1a8e3-c11d-11e8-9986-8acd436f34"
              },
              "spec": {
                "finalizers": [
                  "kubernetes"
                ]
              },
              "status": {
                "phase": "Active"
              }
            },
            {
              "apiVersion": "v1",
              "kind": "Namespace",
              "metadata": {
                "creationTimestamp": "2018-09-26T17:33:42Z",
                "labels": {
                  "istio-injection": "enabled"
                },
                "name": "inventory",
                "resourceVersion": "15021",
                "selfLink": "/api/v1/namespaces/customer-inventory",
                "uid": "4fd5bfb6-c1b2-11e8-9986-8a3fc36f34"
              },
              "spec": {
                "finalizers": [
                  "kubernetes"
                ]
              },
              "status": {
                "phase": "Active"
              }
            }
          ]
        }
  tasks:
    - debug:
        var: namespaces.stdout|from_json|json_query('items[].metadata.name')
Run Code Online (Sandbox Code Playgroud)

将产生以下输出:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "namespaces.stdout|from_json|json_query('items[].metadata.name')": [
        "test-rewards", 
        "inventory"
    ]
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您希望变量group_object_value包含这些值,您可以编写:

- set_fact:
    group_object_value: "{{ namespaces.stdout|from_json|json_query('items[].metadata.name') }}"
Run Code Online (Sandbox Code Playgroud)