首页 > 解决方案 > ansible 将 JSON 作为字符串传递而不引用它

问题描述

我遇到了这个特别痛苦的 Ansible 任务:

  1. 从文件中读取 JSON。
  2. 将 JSON 作为字符串传递给 helm,但不引用它。
- name: deploy release
  community.kubernetes.helm:
    name: my_release
    chart_ref: ./charts/my_chart
    release_namespace: "{{namespace}}"
    state: "{{state}}"
    release_values:
          x: "{{ lookup('file', './stuff.json') }}"

我希望 helm values 文件看起来像:

x: |
  { "hello": "world" }

我在以下查找中遇到的问题{{ lookup('file', './stuff.json') }}是 ansible 会将其解释为 dict 并将 dict 传递给 helm。这不起作用,因为我需要一个字符串。helm values 文件中的输出如下所示:

x:
  hello: world

然后我尝试了{{ lookup('file', './stuff.json') | quote}}。Ansible 将一个字符串传递给 helm,但该字符串有一个引号。当我尝试在部署中读取 JSON 时,出现解析错误。这是输出的样子:

x: '{ "hello": "world" }'

我什至按照这里{{ lookup('file', './stuff.json') | to_json }}的建议尝试过,但也失败了。

标签: jsonansible

解决方案


使用{{ lookup('file', './stuff.json') | string }}将强制 Ansible 在不添加引号的情况下将其评估为字符串。

使用过滤器来操作使用此过滤器的数据中有几个示例。

过滤器的文档可以在Jinja2文档中找到。文档指出过滤器将:

如果还没有,请制作一个字符串 unicode。这样,标记字符串就不会转换回 unicode。

我不是特别确定为什么这可以纠正问题,但确实如此。


推荐阅读