Ansible在解析JSON以获取正确的UUID以启动VM时遇到问题

时间:2017-10-26 13:02:33

标签: json parsing ansible

制作API GET cal我得到以下JSON结构:

{
  "metadata": {
    "grand_total_entities": 231,
    "total_entities": 0,
    "count": 231
  },
  "entities": [
   {
      "allow_live_migrate": true,
      "gpus_assigned": false,
      "ha_priority": 0,
      "memory_mb": 1024,
      "name": "test-ansible2",
      "num_cores_per_vcpu": 2,
      "num_vcpus": 1,
      "power_state": "off",
      "timezone": "UTC",
      "uuid": "e1aff9d4-c834-4515-8c08-235d1674a47b",
      "vm_features": {
        "AGENT_VM": false
      },
      "vm_logical_timestamp": 1
    },
   {
      "allow_live_migrate": true,
      "gpus_assigned": false,
      "ha_priority": 0,
      "memory_mb": 1024,
      "name": "test-ansible1",
      "num_cores_per_vcpu": 1,
      "num_vcpus": 1,
      "power_state": "off",
      "timezone": "UTC",
      "uuid": "4b3b315e-f313-43bb-941b-03c298937b4d",
      "vm_features": {
        "AGENT_VM": false
      },
      "vm_logical_timestamp": 1
    },
   {
      "allow_live_migrate": true,
      "gpus_assigned": false,
      "ha_priority": 0,
      "memory_mb": 4096,
      "name": "test",
      "num_cores_per_vcpu": 1,
      "num_vcpus": 2,
      "power_state": "off",
      "timezone": "UTC",
      "uuid": "fbe9a1ac-cf45-4efa-9d65-b3257548a9f4",
      "vm_features": {
        "AGENT_VM": false
      },
      "vm_logical_timestamp": 17
    },
   ]
}

在我的Ansible剧本中,我注册了一个包含此内容的变量。 我需要获得一个UUID列表“test-ansible1”和“test-ansible2”,但我很难找到最好的方法。 请注意,我有另一个变量,其中包含我需要查找UUID的名称列表。

需要使用这些UUID为与特定名称对应的所有UUID发出poweron命令。

你们会怎么做?

我采取了一些方法,但我似乎无法得到我想要的东西所以我更喜欢不受影响的意见。

P.S。:这就是Nutanix AHV作为API获取所有vms的回报。在我看来,我无法获得特定的VM JSON信息,只能获取所有VM。

感谢。

1 个答案:

答案 0 :(得分:1)

以下是一些Jinja2魔法:

             old_index     value
new_index
      DF1            0        a0
                     1        a1
                     2        a2
                     3        a3
      DF2            0        b0
                     1        b1
                     2        b2
                     3        b3
      DF3            0        c0
                     1        c1
                     2        c2
                     3        c3

说明:

  1. - debug: msg: "{{ mynames | map('extract', dict(test_json | json_query('entities[].[name,uuid]'))) | list }}" vars: mynames: - test-ansible1 - test-ansible2 将原始json数据减少为元素列表,这些元素是两个项目的列表 - 名称值和uuid值:

    test_json | json_query('entities[].[name,uuid]')

    顺便说一句,您可以使用http://jmespath.org/来测试查询语句。

  2. [ [ "test-ansible2", "e1aff9d4-c834-4515-8c08-235d1674a47b" ], [ "test-ansible1", "4b3b315e-f313-43bb-941b-03c298937b4d" ], [ "test", "fbe9a1ac-cf45-4efa-9d65-b3257548a9f4" ] ] 应用于此类结构时(" touples"列表)生成字典:

    dict(...)
  3. 然后我们将{ "test": "fbe9a1ac-cf45-4efa-9d65-b3257548a9f4", "test-ansible1": "4b3b315e-f313-43bb-941b-03c298937b4d", "test-ansible2": "e1aff9d4-c834-4515-8c08-235d1674a47b" } 过滤器应用为per documentation,仅获取必需的元素:

    extract