gpt4 book ai didi

python - Ansible 和 jinja - 将双引号转义的 JSON 字符串发送到 AWS

转载 作者:行者123 更新时间:2023-12-05 02:06:59 25 4
gpt4 key购买 nike

我们需要将双引号转义的 JSON 字符串提供到 nodeJS 产品的 AWS secret 中。单引号内双引号格式不适用于该应用程序。结构化数据采用 dict-list-dict 格式。示例:

{
"data": "[{\"URL\": \"beta.test.net\", \"token\": \"beta-token\"}, {\"URL\": \"beta-prod.test.net\", \"token\": \"beta-prod-token\"}]"
}

我尝试了一些过滤器来让 ansible 和 jinja 获取 JSON 变量并将其转换为所需格式的字符串,但结果总是不太正确。 | to_json |字符串给出以下结果:

{
"data": "[{'URL': 'beta.test.net', 'token': 'beta-token'}, {'token': 'test-token', 'URL': 'beta-prod.test.net'}]"
}

当我尝试使用 replace 或 regex replace 时,似乎即使使用保护字符,我最终也会遇到 python 解析错误。这是一个仅使用带有重音符 '`' 转义符的替换的示例。

TASK [Update secret in AWS] ***************************************************************************************************
task path: path:27
The full traceback is:
Traceback (most recent call last):
File "/home/.local/lib/python3.5/site-packages/ansible/executor/task_executor.py", line 146, in run
res = self._execute()
File "/home/.local/lib/python3.5/site-packages/ansible/executor/task_executor.py", line 587, in _execute
self._task.post_validate(templar=templar)
File "/home/.local/lib/python3.5/site-packages/ansible/playbook/task.py", line 296, in post_validate
super(Task, self).post_validate(templar)
File "/home/.local/lib/python3.5/site-packages/ansible/playbook/base.py", line 431, in post_validate
value = templar.template(getattr(self, name))
File "/home/.local/lib/python3.5/site-packages/ansible/template/__init__.py", line 623, in template
disable_lookups=disable_lookups,
File "/home/.local/lib/python3.5/site-packages/ansible/template/__init__.py", line 578, in template
disable_lookups=disable_lookups,
File "/home/.local/lib/python3.5/site-packages/ansible/template/__init__.py", line 806, in do_template
data = _escape_backslashes(data, myenv)
File "/home/.local/lib/python3.5/site-packages/ansible/template/__init__.py", line 149, in _escape_backslashes
for token in jinja_env.lex(d2):
File "/home/.local/lib/python3.5/site-packages/jinja2/lexer.py", line 739, in tokeniter
name, filename)
jinja2.exceptions.TemplateSyntaxError: unexpected char '`' at 51
line 1
fatal: [beta-prod]: FAILED! => {
"msg": "Unexpected failure during module execution.",
"stdout": ""
}

使用正则表达式替换,我可以完全删除单引号并将其替换为“\”,但任何添加“\"”的尝试都将始终失败并出现上述解析错误。

这是调用 AWS secret 的可靠代码,我尝试提供了一些正确的格式:

    - name: Update secret in AWS
aws_secret:
name: '{{ aws_secret_name }}'
state: present
secret_type: 'string'
# secret: "{{ token_list_update | to_json | replace(\"'\",\"\") | string }}"
secret: '{{ token_list_update | to_json | string }}'
# secret: ' {"data": "{{ token_list | to_json | regex_replace(`"`,`\\"`) }}"}'

如有任何帮助,我们将不胜感激。我想到我需要编写自己的过滤器来处理这个问题。我确实询问过应用程序是否会接受单引号内双引号 JSON 字符串,但团队表示这是 Not Acceptable 。格式必须是双引号转义的 JSON 字符串。

最终编辑:

经过几天的工作,弄清楚了这一点。在每个步骤中,您都需要转换正确的类型以保留 JSON 格式。在进行更新时,每个列表元素都需要过滤到_json。示例:

  token_list: "{{ (token_list | default([]) + [_update]) | to_json }}"

_update 是一个辅助变量,它是一个 JMESPath 搜索

最终提交到 AWS:

    - name: Update secret in AWS
aws_secret:
name: "{{ aws_secret_name }}"
state: present
secret_type: "string"
secret: "{\"data\":{{ token_list | to_json}}}"

最佳答案

使用原生 jinja2 过滤器:tojson

https://jinja.palletsprojects.com/en/2.10.x/templates/#tojson

我正在使用它:

toto.json.j2:

{"hello" : "world"}
{{ lookup('template', './toto.json.j2') | to_json | tojson }}

这会产生:

"{\"hello\" : \"world\"}"

关于python - Ansible 和 jinja - 将双引号转义的 JSON 字符串发送到 AWS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62267491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com