json - 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
解决方案
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
推荐阅读
- swift - 用于过滤具有特定条件的大型数组的 Swift 4 编程
- php - 循环遍历xml并将数据存储到MySQL表中
- webdriver-io - 引诱报告未显示带有 webdriverio 和 cucumber 的类别部分
- filtering - DataGridFilter 中的 Sonata Admin 高级过滤器自定义
- java - 如何将给定的字符串解析为对象字符串映射的字符串映射?
- java - VisualVM jstatd 远程连接
- html - svg 链接在插入视觉作曲家切换标记时不起作用
- kubernetes - Kubernetes ssh 进入不在本地工作的节点
- html - 是否有必要从谷歌字体中选择字体样式?
- amazon-web-services - 重新启动 AWS RDS Aurora 主/写入器也会重新启动读取器?