Ansible jinja2 在 selectattr 中转义点键

2023-12-19

我目前正在尝试循环 k8s_facts 的子集。我的事实看起来是这样的:

{
  "resources": [
  { 
    "metadata": {
      "annotations": {
         "com.foo.bar/name": "foo",
         "com.foo.bar/foo-name": "baz"
       },
       "creationTimestamp": "2018-12-20T02:29:50Z",
       "name": "foo-bar"
    }
  },
  ...

我想过滤特定值com.foo.bar/foo-name钥匙。因为钥匙有., - and /,与 Jinja2 配合不佳selectattr功能。我尝试做类似的事情,但徒劳:

- debug:
    msg: "{{ item }}"
    loop: "{{ my_fact.resources | selectattr('metadata.annotations[\\'com.foo.bar/foo-name\\']', 'defined') | selectattr('metadata.annotations[\\'com.foo.bar/foo-name\\']', 'match', 'baz') | list }}"
  loop_control: 
    label: "{{ item.metadata.name }}"

执行前一个时,我收到此错误:

fatal: [<redacted>]: FAILED! => {"msg": "template error while templating string: expected token ',', got 'com'. String: {{ my_fact.resources | selectattr('metadata.annotations[\\\\'com.foo.bar/foo-name\\\\']', 'defined') | selectattr('metadata.annotations[\\\\'com.foo.bar/foo-name\\\\']', 'match', 'baz') | list }}"}

我的问题是,如何在 Jinja2 中转义包含点的复杂字符串?


当我在 ansible 中进入逃离地狱时,我倾向于利用yaml 折叠和文字块语法 https://yaml-multiline.info/。优点是它可以让你编写 jinja 块而不必用引号将它们括起来,这消除了一个引用级别,因此也消除了一个转义级别。

对于你的情况,我认为你可以使用json_query filter https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#json-query-filter而不是用管道输送一长串过滤器。

这是一个演示手册:

---
- name: Test var names with dots
  hosts: localhost
  gather_facts: false

  vars:
    my_fact: {
      "resources": [
        {
          "metadata": {
            "annotations": {
              "com.foo.bar/name": "foo",
              "com.foo.bar/foo-name": "baz"
            },
            "creationTimestamp": "2018-12-20T02:29:50Z",
            "name": "foo-bar"
          }
        },
        {
          "metadata": {
            "annotations": {
              "com.foo.bar/name": "toto",
              "com.foo.bar/foo-name": "titi"
            },
            "creationTimestamp": "2018-12-21T02:30:50Z",
            "name": "foo-bla"
          }
        },
        {
          "metadata": {
            "annotations": {
              "com.foo.bar/name": "johnsmith",
              "com.foo.bar/foo-name": "baz"
            },
            "creationTimestamp": "2018-12-22T02:31:50Z",
            "name": "foo-john"
          }
        }
      ]
    }

  tasks:
    - name: Show results where metadata.annotations."com.foo.bar/foo-name"=='baz'
      vars:
        query: >-
          [?(metadata.annotations."com.foo.bar/foo-name")=='baz']
      debug:
        msg: "{{ item }}"
      loop: "{{ my_fact.resources | json_query(query) }}"
      loop_control:
        label: "{{ item.metadata.name }}"

结果

PLAY [Test var names with dots] *******************************************************************************************************************************************************************************************

TASK [Show results where metadata.annotations."com.foo.bar/foo-name"=='baz'] **********************************************************************************************************************************************
ok: [localhost] => (item=foo-bar) => {
    "msg": {
        "metadata": {
            "annotations": {
                "com.foo.bar/foo-name": "baz",
                "com.foo.bar/name": "foo"
            },
            "creationTimestamp": "2018-12-20T02:29:50Z",
            "name": "foo-bar"
        }
    }
}
ok: [localhost] => (item=foo-john) => {
    "msg": {
        "metadata": {
            "annotations": {
                "com.foo.bar/foo-name": "baz",
                "com.foo.bar/name": "johnsmith"
            },
            "creationTimestamp": "2018-12-22T02:31:50Z",
            "name": "foo-john"
        }
    }
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ansible jinja2 在 selectattr 中转义点键 的相关文章

随机推荐

  • 像 jQuery 插件一样使用 GWT 小部件?

    我可以像 jQuery 插件一样使用 Google GWT 小部件吗 例如 Gwt a css selector mywidget some prefs 也许你正在寻找类似的东西GQuery http code google com p g
  • OpenCV 轮廓矩?

    什么是轮廓矩 有人可以用简单的非数学术语解释这一点吗 可能有一个例子吗 官方的解释是 对轮廓中所有像素进行积分 我不知道什么整合 轮廓矩可以用来做什么 黑色 0 白色 1 的黑白图像的 0 度矩 这只是像素的总和 即白色像素的数量 x 轴和
  • 为什么 C# 中的堆栈大小正好是 1 MB?

    如今的 PC 拥有大量物理 RAM 但 C 的堆栈大小对于 32 位进程仅为 1 MB 对于 64 位进程仅为 4 MB C 中的堆栈容量 https stackoverflow com questions 823724 stack cap
  • 在 Android Widget 上处理多个按钮点击

    I 看到这个话题 https stackoverflow com questions 2082998 how to implement a button on an android widget并实施IntentService正如所描述的
  • 持久 stty 设置?

    目前 我可以通过执行禁用终端输出挂起 恢复 功能 CTRL S和CTRL Q废话 stty ixon 不幸的是 这不是永久性的 我需要设置这个选项每次我发射xterm 是否有一个可以编辑的文件可以记住我的设置并在重新启动和重新启动时保持永久
  • 播放动画一次而不是循环三个.js

    我已将搅拌机 JSON 动画导出到 THREE js 中 一切正常 但我只想播放动画一次并停止而不是循环播放动画 老问题 但如果有人需要它 解决方案是设置animation setLoop THREE LoopOnce let objLoa
  • 在 bash 中生成虚拟文件

    我想在 bash 中生成虚拟文件 内容并不重要 如果是随机的那就太好了 但所有相同的字节也是可以接受的 我的第一次尝试是以下命令 rm dummy zip touch dummy zip x 0 while x lt 100000 do e
  • 为什么我不能在 if 语句内强制转换对象?

    我在这里没有看到这个确切的问题 这让我感到惊讶 以下内容将无法编译 public int compareTo Object o if this order lt Category o order return 1 else if this
  • 如何测试写入标准输出的代码?

    如何在 CUnit 中为打印到的函数编写测试stdout 验证其输出 要测试的示例函数 void print printf Hello world 它的单元测试应该以某种方式验证 Hello world 是否已打印到控制台 void tes
  • 如何在android firestore中根据不同的if条件实现多个order by?

    Android中如何实现多个order byFirestore基于不同的if条件 我想根据不同的字段值对我的 firestore 项目进行排序 像这样 Query query firestoredb collection items doc
  • Jenkins git 插件自签名证书

    我目前正在尝试让 Jenkins 构建托管在 GitHub 企业存储库中的项目 我们为 GitHub 服务器使用自签名证书 这会导致一些问题 我能够解决的大部分问题 git 命令行 获取 PEM 格式的证书并教 git 使用 config
  • 为什么 Spark 在本地模式下会失败并显示“无法获取广播_0 的广播_0_piece0”?

    我正在运行此代码片段来对点的 RDD 进行排序 对 RDD 进行排序并从给定点获取 K 最近的点 def getKNN sparkContext SparkContext k Int point2 Array Double pointsRD
  • 如何在 Android Studio 中禁用对项目的 C/C++ 支持?

    我时常会犯这样的错误 尝试在 Android Studio 项目中启用 C C 支持 我想我可能喜欢使用 C C 但我忘记了 至少在我的系统上 我从来没有能够让它工作过 即使在下载了 NDK 库之后也是如此 我已经四处寻找如何从项目中删除
  • 多项选择

    您好 我需要获取下拉框中选择的所有值 请参阅示例
  • Java 正则表达式解析任意数量的 Markdown 样式链接

    我正在尝试解析字符串以查找任何出现的 Markdown 样式链接 即 text link 我能够获取字符串中的第一个链接 但如果我有多个链接 我将无法访问其余链接 这是我尝试过的 你可以运行它ideone http ideone com B
  • 将 Javascript 正则表达式转换为 Java 语法

    我知道 regEx 在各种语言中都很常见 但我在编写 Java 语法时遇到了麻烦 我有一个用 JS 编码的正则表达式 if a zA Z test str 0 9 x21 x2F x3A x40 x5B x60 x7B x7E test s
  • “#pragma Once”是否有可能导致错误?

    我所有的头文件都使用包括警卫也杂注一次 pragma once ifndef FILE NAME H define FILE NAME H class foo foo interface endif FILE NAME H 我明白那个杂注一
  • Linq 的 Skip 和 Take 是否针对数组进行了优化? 【4.0版】

    从数组复制范围是一种常见的情况 C 通过多种方式支持此操作 例如使用 Array Copy 也可以通过 Linq 的 Skip 和 Take 组合来支持 从 NET 4 0 开始 Skip 和 Take 操作是否仍然会增加相当大的开销 或者
  • 在单词搜索拼图中将单词放置在表格网格中?

    我正在尝试创建一个由脚本生成的单词搜索谜题 文字应水平 垂直或对角放置 我可能需要设置是否允许它们仅向前或向后读取的选项 我有一系列单词 例如 苹果 香蕉 葡萄 柠檬 梨 需要放置在表中 我已经创建了表格 但我不知道如何将单词放入网格中 我
  • Ansible jinja2 在 selectattr 中转义点键

    我目前正在尝试循环 k8s facts 的子集 我的事实看起来是这样的 resources metadata annotations com foo bar name foo com foo bar foo name baz creatio