json_query 使用正则表达式获取随机键的值

问题描述 投票:0回答:1

我遇到了一种情况,我正在编写一个用于更改虚拟机属性的剧本,并且我获得的输入来自输出以下内容的自动化,然后将其传入

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')]) }}"
ansible ansible-2.x json-query
1个回答
0
投票

您可以使用过滤器

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
任务的结果。

© www.soinside.com 2019 - 2024. All rights reserved.