0

我有以下设置。

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 周围会出现引号,我该如何避免?

4

2 回答 2

3

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

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

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

我认为您将 Ansible 语法与 jinja2 模板语法混淆了(可能基于文档中的这个问题)。

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

如果您不想在渲染值中使用引号,只需将它们从模板中取出即可。

于 2020-05-08T18:23:27.197 回答
0

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

于 2021-03-19T11:56:03.743 回答