【问题标题】:Need to get the values from ansible json stdout and put them in to a list需要从 ansible json stdout 中获取值并将它们放入列表中
【发布时间】:2019-04-12 10:03:49
【问题描述】:

鉴于此输入:

"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\"",  
            "            }",  
            "        },",  

我正在尝试遍历循环并获取“名称”的所有值并将它们保存在一个列表中。我有以下任务。但它不起作用

例如值:

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

\"name\": \"inventory\",",

还有这个任务:

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

有人可以帮忙吗?

【问题讨论】:

  • 请不要张贴图片的文字。发布文本本身,格式正确。发布图片会降低您的问题的可访问性,并使他人更难复制和粘贴数据以帮助您解决问题。如果您嵌入的图片从托管站点中删除,这也会使您的问题对未来可能有同样问题的人没有多大用处。
  • 我已编辑问题以正确格式化代码。问下一个问题时,请花点时间阅读输入问题时提供的一些帮助;这将解释格式化代码示例的各种选项。

标签: ansible


【解决方案1】:

您在 commandshell 任务的标准输出中似乎有 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')

将产生以下输出:

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

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

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

【讨论】:

  • 完美。非常感谢@larsks
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2021-11-23
  • 2019-06-20
相关资源
最近更新 更多