首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不可读嵌套json值和匹配变量

不可读嵌套json值和匹配变量
EN

Stack Overflow用户
提问于 2021-06-17 18:26:48
回答 2查看 289关注 0票数 2

我正在把它用在一本不可信的剧本里:

代码语言:javascript
复制
- 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

我循环通过一个csv,其中有一个VM和他们的中心列表。Ansible任务的json输出如下:

代码语言:javascript
复制
{
  "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是poweredOff还是poweredOn。接下来,根据VM的当前状态,我可以使用它作为是否关闭VM的条件。

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

CSV文件:

代码语言:javascript
复制
vmname    vcenter  
Server1   Vcenter1  
Server2   Vcenter1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-18 01:46:16

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

例如:例如

代码语言:javascript
复制
    - 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

给出

代码语言:javascript
复制
  virtual_machines:
  - Server1: poweredOn
    Server2: poweredOn

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

问:“将其用作是否关闭VM的条件。

例如,第一个主机中的Server1

代码语言:javascript
复制
    - debug:
        msg: "Host={{ _host }} VM={{ _vm }} is poweredOn"
      when: virtual_machines[_host][_vm] == 'poweredOn'
      vars:
        _host: 0
        _vm: Server1

给出

代码语言:javascript
复制
  msg: Host=0 VM=Server1 is poweredOn
票数 1
EN

Stack Overflow用户

发布于 2021-06-17 20:31:30

我想,从您的示例来看,您确实有一个TSV,因此一个选项卡分隔值,而不是CSV,它表示逗号分隔的值。

基于此,read_csv模块和dialect: excel-tab将帮助您读取TSV。

然后,您需要使用滤波投影来根据TSV文件中的数据查询JSON。

您还需要使用使投影变平来消除由resultsvirtual_machines中的列表创建的双重列表。

结果的JMESPath查询的一个例子是,Server1的结果是:

代码语言:javascript
复制
results[].virtual_machines[?
  guest_name == `Server1`
]|[]|[0].power_state

然后,我们在一本剧本里写了这一切,结果是:

代码语言:javascript
复制
- hosts: localhost
  gather_facts: no

  tasks:
    - read_csv:
        path: servers.csv
        dialect: excel-tab
      register: servers
   
    - debug:
        msg: >-
          For {{ item.vmname }}, the state is {{ 
            vminfo | 
            json_query(
              'results[].virtual_machines[?
                guest_name == `' ~ item.vmname ~ '`
              ]|[]|[0].power_state'
            ) 
          }}
      loop: "{{ servers.list }}"
      loop_control:
        label: "{{ item.vmname }}"
      vars:
        vminfo:
          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

这就产生了重述:

代码语言:javascript
复制
PLAY [localhost] **************************************************************************************************

TASK [read_csv] ***************************************************************************************************
ok: [localhost]

TASK [debug] ******************************************************************************************************
ok: [localhost] => (item=Server1) => 
  msg: For Server1, the state is poweredOn
ok: [localhost] => (item=Server2) => 
  msg: For Server2, the state is poweredOn

PLAY RECAP ********************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68024730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档