如何使用 Ansible 的 `json_query_filter` (JMESPath) 提取由短划线键入的 JSON 值?

How do I use Ansible's `json_query_filter` (JMESPath) to extract a JSON value keyed by a dash?

我正在使用 Ansible!

返回了一个很好的数据结构
- name: list ec2 instances
  ec2_instance_facts:
    region: '{{aws_primary_region}}'
    filters:
      "tag:organization-tag-1": "specific-value"
  register: instances

我想转换这些结果以提取 org-specific-tag2 的值。我可以做类似

的事情
- name: extract instance tags
  set_fact:
    instance_tags: '{{instances | json_query(query)}}'
  vars:
    query: "instances[*].tags"

获取标签作为数据结构:

        {
            "Name": "box-1138", 
            "organization-tag-1": "specific-value", 
            "organization-tag-2": "value being queried"
        }, 
        {
            "Name": "box-999", 
            "organization-tag-1": "specific-value", 
            "organization-tag-2": "value being queried 2"
        }

我可以在 with_items 中使用它并访问 item["organization-tag-2"]。这不是问题。但是,对我来说,将列表设置为 ["value being queried", "value being queried 2"] 开始会更优雅。 我只是想不通,因为标签中有一个破折号, 并且 JMESPath 文档中的语法指南......非常不透明。

如何在 JSON 查询过滤器中提取破折号

看看JMESPath grammar:

sub-expression    = expression "." ( identifier /
                                     multi-select-list /
                                     multi-select-hash /
                                     function-expression /
                                     "*" )
identifier        = unquoted-string / quoted-string
quoted-string     = quote 1*(unescaped-char / escaped-char) quote
quote             = %x22   ; Double quote: '"'

所以你应该没问题:

- name: extract instance tags
  set_fact:
    instance_tags: '{{instances | json_query(query)}}'
  vars:
    query: 'instances[*].tags."organization-tag-2"'