为什么 to_nice_yaml 在 Jinja2 (Ansible) 的结果周围产生引号?

Why does to_nice_yaml produce quotes around the result in Jinja2 (Ansible)?

我有以下设置。

my_var 具有以下值。

  ansible_facts:
    discovered_interpreter_python: /usr/bin/python
  invocation:
    module_args:
      api_key: null
      api_version: v1
      ca_cert: null
      client_cert: null
      client_key: null
      context: null
      field_selectors: []
      host: null
      kind: Secret
      kubeconfig: null
      label_selectors: []
      password: null
      proxy: null
      username: null
      validate_certs: null
  resources:
  - apiVersion: v1
    data:
      a: blah
      b: blah
      c: blah
    kind: Secret
    metadata:
      name: my_name
    type: Opaque

我正在使用这样的模板在任务中使用它。

- name: "doh"
  k8s:
    state: present
    namespace: "doh"
    definition: "{{ lookup('template', 'template.j2') }}"

我的模板是这样的。

apiVersion: v1
data: "{{ my_var | json_query("resources[?metadata.name=='" + my_name + ".my_string." + some_var + "'].data") | first | to_nice_yaml }}"
kind: Secret
metadata:
  name: "blah"
type: Opaque

不幸的是我得到了这个结果。这是一个字符串,应该是普通的 yaml。

apiVersion: v1
data: "a: blah <-- quote, why?
b: blah
c: blah
" <-- quote, why?
kind: Secret
metadata:
  name: "blah"
type: Opaque

为什么在 Jinja2 中我的 yaml 周围会出现引号,我该如何避免?

在您的模板中,yaml 周围有引号:

data: "{{ ... | to_nice_yaml }}"

这些引用是您的模板的一部分,并将成为渲染输出的一部分。

我认为您混淆了 Ansible 语法和 jinja2 模板语法(可能基于文档中的 this gotcha)。

这个问题不适用于 jinja2 模板。不在 jinja2 分隔块({%{{ 等)内的所有内容都将转换为渲染值。

如果您不想要呈现值中​​的引号,只需将它们从模板中取出即可。

我有同样的问题,即使您不使用引号,to_nice_yaml 也会添加它们,因为在 yaml 中它们在技术上是一个字符串。