我遇到了一种情况,我正在编写一个用于更改虚拟机属性的剧本,并且我获得的输入来自输出以下内容的自动化,然后将其传入
extra_vars
:
{
"vmvars": {
"v_ads1as_operating_system": "Linux",
"v_mdjx2d_vm_name": "myvm123",
"v_srsj4d_mount_point": "tmp"
}
}
可以看到,
vmvars
中的键,字符串v_<something>
并不一致,可以是任何东西。密钥的剩余字符串例如_operating_system
保持不变。
我知道密钥应该是唯一的。好吧,它是独一无二的,遗憾的是其中一些是随机的。 现在为了获得值,我尝试了以下方法,但是它们似乎都不起作用。不是正则表达式专家。有人可以帮忙吗?
---
- hosts: localhost
tasks:
- name: Get os_type from input
set_fact:
os_type: "{{ vmvars[item] | json_query(['*operating_system']) }}"
loop: "{{ vmvars.keys() | list }}"
我尝试过的更多查询。
- set_fact:
os_type: "{{ vmvars[item] | json_query(vmvars['*operating_system']) }}"
- set_fact:
os_type: "{{ vmvars[item] | json_query([?contains(item,'operating_system')]) }}"
dict2items
来制作,从像这样的字典
foo: bar
baz: qux
标准化列表:
- key: foo
value: bar
- key: baz
value: qux
结果列表更容易过滤,因为您现在可以对值应用过滤器,而不是对键应用过滤器,这往往更复杂。
selectattr
来定位包含 _operating_system
的键并获取其值。
给定任务:
- set_fact:
os_type: >-
{{
(
vmvars | dict2items | selectattr(
'key', 'contains', '_operating_system'
)
).0.value
}}
vars:
vmvars:
v_ads1as_operating_system: Linux
v_mdjx2d_vm_name: myvm123
v_srsj4d_mount_point: tmp
Ansible 会产生:
ok: [localhost] => changed=false
ansible_facts:
os_type: Linux
注意:上面的输出是使用选项
-v
运行剧本时生成的,除了其他有用信息外,还显示了 set_fact
任务的结果。