何时在 Ansible 中使用 from_json 过滤器?

2024-02-17

我什么时候应该使用from_json filter https://docs.ansible.com/ansible/playbooks_filters.html#filters-for-formatting-data在安西布尔?

我发现使用它有时有效果,有时没有效果。

请考虑以下示例,它说明了我所得到的不一致之处。

Included in reverse order are: the questions - expected result - actual result - the playbook - the data. The data is taken from this question https://stackoverflow.com/q/41261680/2947502 and the playbook is based on this answer https://stackoverflow.com/a/41262712/2947502.

  • 问题:

    为什么要存储左侧部分(之前json_query) 将以下表达式放入变量中,然后使用json_query变量上的值会导致表达式的计算结果不同吗?

    "{{ lookup('file','test.json') | json_query(query) }}"
    

    为什么添加from_json过滤器改变结果(但如果处理变量则不会改变):

    "{{ lookup('file','test.json') | from_json | json_query(query) }}"
    
  • 预期结果:

    最后四项任务应该给出相同的结果。或者,最后两个任务应该给出与前两个任务相同的结果。

  • 实际结果(仅最后四个任务):

    一项任务结果不同。

    TASK [This query is run against lookup value with from_json stored in a variable] ***
    ok: [localhost] => {
        "msg": [
            678
        ]
    }
    
    TASK [This query is run against lookup value without from_json stored in a variable] ***
    ok: [localhost] => {
        "msg": [
            678
        ]
    }
    
    TASK [This query is run directly against lookup value with from_json] **********
    ok: [localhost] => {
        "msg": [
            678
        ]
    }
    
    TASK [This query is run directly against lookup value without from_json - the result is empty - why?] ***
    ok: [localhost] => {
        "msg": ""
    }
    
  • 剧本:

    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      tasks:   
        - set_fact:
            from_lookup_with_from_json: "{{ lookup('file','test.json') | from_json }}"
    
        - set_fact:
            from_lookup_without_from_json: "{{ lookup('file','test.json') }}"
    
        - name: Save the lookup value stored in a variable in a file for comparison
          copy: content="{{ from_lookup_with_from_json }}" dest=./from_lookup_with_from_json.txt
    
        - name: Save the lookup value stored in a variable in a file for comparison (they are the same)
          copy: content="{{ from_lookup_without_from_json }}" dest=./from_lookup_without_from_json.txt
    
        - name: This query is run against lookup value with from_json stored in a variable
          debug: msg="{{ from_lookup_with_from_json | json_query(query) }}"
          vars:
            query: "Foods[].{id: Id, for: (Tags[?Key=='For'].Value)[0]} | [?for=='Tigger'].id"
    
        - name: This query is run against lookup value without from_json stored in a variable
          debug: msg="{{ from_lookup_without_from_json | json_query(query) }}"
          vars:
            query: "Foods[].{id: Id, for: (Tags[?Key=='For'].Value)[0]} | [?for=='Tigger'].id"
    
        - name: This query is run directly against lookup value with from_json
          debug: msg="{{ lookup('file','test.json') | from_json | json_query(query) }}"
          vars:
            query: "Foods[].{id: Id, for: (Tags[?Key=='For'].Value)[0]} | [?for=='Tigger'].id"
    
        - name: This query is run directly against lookup value without from_json - the result is empty - why?
          debug: msg="{{ lookup('file','test.json') | json_query(query) }}"
          vars:
            query: "Foods[].{id: Id, for: (Tags[?Key=='For'].Value)[0]} | [?for=='Tigger'].id"
    
  • 数据 (test.json):

    { "Foods" :
      [ { "Id": 456
        , "Tags":
          [ {"Key":"For", "Value":"Heffalump"}
          , {"Key":"Purpose", "Value":"Food"}
          ]
        }
      , { "Id": 678
        , "Tags":
          [ {"Key":"For", "Value":"Tigger"}
          , {"Key":"Purpose", "Value":"Food"}
          ]
        }
      , { "Id": 911
        , "Tags":
          [ {"Key":"For", "Value":"Roo"}
          , {"Key":"Purpose", "Value":"Food"}
          ]
        }
      ]
    }
    

json_query需要 Python 对象(dict)作为输入,如果你用字符串提供它,它会给出空字符串作为结果。

由于 Ansible 模板引擎的棘手工作,您会得到不同的结果。
我绝对应该在我的网站上写一篇关于它的文章......

在评估 jijna2 表达式之后,Ansible 尝试将复杂类型转换为 Python 对象(例如 dict 或 list)。看我的other https://stackoverflow.com/a/41147661/2795592 answer.

在你的情况下:

1.

- set_fact:
    from_lookup_with_from_json: "{{ lookup('file','test.json') | from_json }}"

from_lookup_with_from_json是一个字典,因为您手动将 JSON 字符串从文件转换为字典from_json filter.

2.

- set_fact:
    from_lookup_without_from_json: "{{ lookup('file','test.json') }}"

from_lookup_with_from_json变成 dict,因为当 jinja2 表达式以以下结尾时 Ansible 会转换它}}. So from_json实际上是不必要的the last链式过滤器。

3.

  debug: msg="{{ lookup('file','test.json') | from_json | json_query(query) }}"

同样,您可以在此处手动转换 JSON 字符串。所以json_query获取 dict 作为输入。

4.

  debug: msg="{{ lookup('file','test.json') | json_query(query) }}"

在这种情况下,您将 JSON 字符串(而不是字典)作为输入提供给json_query筛选。由于所有事情都发生在一个 jinja2 表达式内,因此 Ansible 不会尝试转换两者之间的任何内容。

您还可以通过以下方式使用变量获取空字符串结果:

- set_fact:
    from_lookup_force_string: "{{ lookup('file','test.json') | string }}"

在这种情况下from_lookup_force_string不会被 Ansible 临时引擎转换,并且json_query会给你空的答复。

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

何时在 Ansible 中使用 from_json 过滤器? 的相关文章

随机推荐

  • 如何使用 $location 服务对 angularjs 控制器进行单元测试

    我正在尝试创建一个简单的单元测试来测试我的显示功能 我收到以下错误 TypeError Object has no method show 这好像是 rootScope不是控制器的范围吗 这是我的控制器 function Opponents
  • 减慢线程速度的最佳方法?使用 Sleep() 可以吗?

    我编写了一个 C 库 它执行一些非常繁重的 CPU 工作 所有数学和计算 如果留给它自己的设备 将很容易消耗 100 的所有可用 CPU 资源 它也是多线程的 以达到可用逻辑的数量 机器上的核心 因此 我在使用该库的软件应该调用的主计算循环
  • 按值返回副本而不是移动

    为什么这个程序调用复制构造函数而不是移动构造函数 class Qwe public int x 0 Qwe int x x x Qwe const Qwe q cout lt lt copy ctor n Qwe Qwe q cout lt
  • Joi 验证器只有键之一

    我正在开发一个 api 它应该允许多个参数 但对于其中三个参数 我只想允许其中一个 每个键的值更容易 但我想知道 Joi 是否也允许它 或者我应该在我的服务器中添加额外的验证逻辑 简而言之 对于钥匙a b or c我想让任何具有以上三个以上
  • 使用视频作为 div 的背景

    我想在 CSS3 中使用视频作为背景 我知道没有背景视频属性 但是是否可以执行此行为 使用全尺寸视频标签不会给出想要的结果 因为需要在视频上显示内容 它必须是非 JS 如果不可能 那么我需要在服务器端进行更改 并给出视频的屏幕截图 我需要视
  • 调用未定义函数 str_limit()

    调用未定义函数 str limit laravel 6x 这是我的代码 帮帮我 dt Description dt dd str limit product 500 dd 在版本 5 8 中 str 助手已被删除 您必须使用照亮 支持 St
  • 如何使用 yii2 -bootstrap 扩展将模态添加到 yii2 中的导航栏?

    我正在尝试将模态放在我的 yii2 项目的导航栏中 我正在使用 yii2 bootstrap 扩展 我的导航代码 NavBar begin brandLabel gt My Company brandUrl gt Yii app gt ho
  • Android Studio 不断拒绝解析 com.android.support:appcompat-v7:29.0.1

    我已经提到过this http ttps stackoverflow com questions 52997370 线程 但它不能解决我的问题 我不断收到错误 ERROR Failed to resolve com android supp
  • 如何从 Jenkins 2.0 管道脚本读取属性文件

    我正在尝试编写一个管道脚本与 Jenkins 2 0 一起使用来复制我们现有的构建 这个原始构建使用 envInject 插件来读取 Java 属性文件 但我看不到如何从管道 Groovy 脚本中执行此操作 我用 Google 搜索并找到了
  • 标签和类替换标题 (

    ,

    ...) 标签

    我希望将标签从所见即所得编辑器替换为 目前我正在使用以下代码来实现此目的 content preg replace

  • jQuery的load函数在本地不起作用

    当窗口宽度小于 600px 时 我必须在现有 div 中加载 HTML 文件 代码是 div div 我已经在我的网站上测试了这段代码并且它可以工作 但也许我做错了什么才能使其在本地工作 有没有理由load函数不能在本地运行
  • 在 Eclipse RCP 应用程序中在哪里存储“全局”数据?

    我是 Eclipse RCP 的初学者 我正在尝试为自己构建一个应用程序来尝试一下 我对如何实际处理模型对象感到困惑 我能找到的例子都不能解决我遇到的问题 所以我怀疑我的处理方式是错误的 假设我需要使用保存经过身份验证的用户信息的类来初始化
  • 如何用IPC::Open2过滤大量数据?

    我的任务是使用外部实用程序 addr2line 从 perl 脚本中过滤一些数据 数据量相当大 我需要打印大量数据stdin程序并读回大量数据 来自stdout程序到我的脚本中 现在我这样做IPC Open2 但我不混合阅读和写作 这合法吗
  • 设置控件Parent属性和使用Controls.Add()之间的区别?

    更具体地说 这些陈述是 ownerControl GroupBox1 Controls Remove childControl ownerControl Controls Add childControl 相当于 childControl
  • 在本地主机上托管 git 服务器

    我的公司没有中央 git 服务器 也不允许我使用 BitBucket 等 无论如何我可以使用我的本地主机作为remote 编辑 我在 Windows 机器上 本地目录的工作方式与远程存储库 URL 类似 因此只要您是唯一使用该存储库的人 基
  • shell 脚本错误期待“do”

    bin sh while true do echo WTF done 这给出了语法错误 语法错误 意外的文件结尾 需要 do 我也尝试过 bin sh while do echo WTF done 我怀疑行结尾 Try hexdump C
  • iOS 模拟器应用程序的终端命令行调试?

    是否可以在 Mac OS X 下的终端命令行中使用 GDB 或 LLDB 来调试在 iOS 模拟器上运行的应用程序 例如 不是从 Xcode 的 GUI 或控制台内部 而是使用外部命令行或进程 如果是这样 怎么办 您需要在模拟器的 Spri
  • MVC-错误消息

    我正在创建 MVC Web 应用程序 我应该在 MVC 模型 视图 控制器 的哪一部分保存错误消息 这些消息可能会出现在出现问题的地方并且用户应该阅读它们 目前情况 Model function f data error Error mes
  • 为 C# MVC ASP.NET 应用程序创建的默认数据库在哪里?

    我在引导程序上使用登录 注册脚本安装了新的 MVC ASP NET 应用程序 它工作正常 但我不知道该应用程序的默认数据库在哪里 我的 App Data 文件夹是空的 有人可以告诉我表单注册的数据保存在哪里吗 这将存储在 Visual St
  • 何时在 Ansible 中使用 from_json 过滤器?

    我什么时候应该使用from json filter https docs ansible com ansible playbooks filters html filters for formatting data在安西布尔 我发现使用它有