使用Ansib中的JINJA2从JSON中提取带有条件的嵌套dict值

2024-06-02 06:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从Ansible的cloudfront_facts中提取特定别名的CDN域名,输出如下(摘要):

{
  "cdn_facts": {
   "ansible_facts": {
    "cloudfront": {
      "summary": {
       "distributions": [
        {
          "Aliases": [
           "media.example.com"
          ],
          "DomainName": "a1b2c3d4e5f6g.cloudfront.net"
        },
        {
          "Aliases": [
           "example.com"
          ],
          "DomainName": "g7f6e5d4c3b2a.cloudfront.net"
        }
      ]
     }
    }
  }
}

换句话说,对于别名example.com,我想用g7f6e5d4c3b2a.cloudfront.net的值设置一个事实。在

我尝试了下面的方法来打印值,但这只是生成一个空列表。在

^{pr2}$

我甚至不知道如何调试它,因为cdn_facts.ansible_facts.cloudfront.summary.distributions生成一个dict数组,但是selectattr和{}没有生成任何内容。在


Tags: comnetexamplecdnansiblesummarydistributions域名
1条回答
网友
1楼 · 发布于 2024-06-02 06:33:00

您的数据中没有一个名为Aliases[0]的属性,所以这就是您的selectattr过滤器失败的原因。在

对于从深度嵌套的字典中提取数据,json_query过滤器通常比链接本地Jinja过滤器更好。例如,给定别名example.com,以下表达式将提取相应的DomainName属性:

cdn_facts.ansible_facts.cloudfront.summary.distributions[?Aliases[0] == `example.com`]|[0].DomainName

我们可以在这样的剧本中使用:

^{pr2}$

将输出:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => (item=media.example.com) => {
    "msg": "media.example.com -> a1b2c3d4e5f6g.cloudfront.net"
}
ok: [localhost] => (item=example.com) => {
    "msg": "example.com -> g7f6e5d4c3b2a.cloudfront.net"
}

json_query模块使用jmespath搜索语法。您可以通过将数据粘贴到https://jmespath.org处的文本框中,然后在其上方的字段中输入搜索表达式来尝试jmespath表达式。或者,您可以使用jpterm命令行工具。在

相关问题 更多 >