如何使用Ansible的`json_query_filter`(JMESPath)来提取由破折号键入的JSON值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Ansible的`json_query_filter`(JMESPath)来提取由破折号键入的JSON值?相关的知识,希望对你有一定的参考价值。

我正在和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"'

以上是关于如何使用Ansible的`json_query_filter`(JMESPath)来提取由破折号键入的JSON值?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速学习Ansible使用

Elastic:如何使用 Ansible自动化部署 Elastic Stack -Security

Ansible:如何配置没有 ssh 密钥的跳转主机?

如何在库存文件中使用ansible-vault加密密码?

如何使用 ansible 推送带有 SSH 密钥身份验证的剧本

如何将ansible与两因素身份验证一起使用?