Ansible 错误:模板化字符串时出现模板错误:预期标记“打印语句结束”,得到“字符串”

Dha*_*ade 0 ansible kubernetes kubectl

kubectl get -n istio-system secret istio-ca -ogo-template='{{index .data "tls.crt"}}' | base64 -d > ca.pem
Run Code Online (Sandbox Code Playgroud)

如何在 ansible playbook 中运行上述命令?

我尝试按如下方式使用它:

- name: Apply secret istio-ca
  shell: kubectl get -n istio-system secret istio-ca -ogo-template='{{index .data "tls.crt"}}' | base64 -d > ca.pem
  register: sout
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误,如下所示:

fatal: [172.31.20.135]: FAILED! => {"msg": "template error while templating string: expected token 'end of print statement', got 'string'. String: kubectl get -n istio-system secret istio-ca -ogo-template='{{index .data \"tls.crt\"}}' | base64 -d > ca.pem"}
Run Code Online (Sandbox Code Playgroud)

mda*_*iel 5

我发誓这个问题已经被回答了一千次,但是我无法立即在数千个相同的错误中找到 golang/helm/kubectl 的具体错误

问题是 jinja2 使用{{作为其转义语法,但 golang 文本模板使用{{作为其转义语法,并且因为 ansible 不知道您指的是 golang 版本,所以它尝试评估您的 go-template,就好像它是 jinja2 和 kaboom 一样

有两种解决这种情况的方法:{% raw %}和/{% endraw %}或具有解析为内部 golang 表达式的外部 jinja2 表达式

- debug:
    msg: kubectl get {% raw %}-ogo-template={{ awesome }}{% endraw %}
- debug:
    msg: kubectl get -ogo-template={{"{{"}} awesome {{"}}"}}
Run Code Online (Sandbox Code Playgroud)