首页 > 解决方案 > Ansible 读取嵌套的 json 值和匹配变量

问题描述

我在 Ansible 剧本中使用它:

- name: Gather info from Vcenter
  vmware_vm_info:
    hostname: "{{ result_item.vcenter }}"
    username: "{{ ansible_username }}"
    password: "{{ ansible_password }}"
    validate_certs: no
  register: vminfo
  loop: "{{ result.list }}"
  loop_control:
    loop_var: result_item

我循环浏览一个包含 VM 及其 Vcenter 列表的 csv。Ansible 任务的 json 输出如下:

{
  "results": [
    {
      "changed": false,
      "virtual_machines": [
        {
          "guest_name": "Server1",
          "guest_fullname": "SUSE Linux Enterprise 11 (64-bit)",
          "power_state": "poweredOn",
          },
        {
          "guest_name": "Server2",
          "guest_fullname": "FreeBSD Pre-11 versions (64-bit)",
          "power_state": "poweredOn",
        },

现在我需要在我的 csv 中查询 VM 的输出(guest_name 与 vmname 匹配),并使用 set_fact 来指示 csv 中的 VM 是已关闭还是已打开。接下来,我可以将其用作是否根据 VM 的当前状态关闭 VM 的条件。

当与 csv 中的 VM 名称匹配到 json 输出然后获得相应的电源状态时,我似乎无法让 json_query 工作。有任何想法吗?

CSV 文件:

vmname    vcenter  
Server1   Vcenter1  
Server2   Vcenter1

标签: jsonansiblejmespath

解决方案


Q:set_fact 表示CSV中的VM是关机还是开机。

答:例如

    - read_csv:
        path: servers.csv
        dialect: excel-tab
      register: result
    - set_fact:
        servers: "{{ result.list|map(attribute='vmname')|list }}"
    - set_fact:
        virtual_machines: "{{ virtual_machines|default([]) +
                              [dict(_servers|zip(_values))] }}"
      loop: "{{ vminfo.results }}"
      vars:
        _servers: "{{ servers|intersect(_dict.keys()|list) }}"
        _values: "{{ _servers|map('extract',_dict)|list }}"
        _dict: "{{ item.virtual_machines|
                   items2dict(key_name='guest_name', value_name='power_state') }}"
    - debug:
        var: virtual_machines

  virtual_machines:
  - Server1: poweredOn
    Server2: poweredOn

vminfo.results中缺少的服务器将被静默忽略。


问:将其作为是否关闭虚拟机电源的条件。

A:例如第一台主机中的Server1

    - debug:
        msg: "Host={{ _host }} VM={{ _vm }} is poweredOn"
      when: virtual_machines[_host][_vm] == 'poweredOn'
      vars:
        _host: 0
        _vm: Server1

  msg: Host=0 VM=Server1 is poweredOn

推荐阅读