为什么 ansible 总是在模板中用单引号替换双引号?
why ansible always replaces double quotes with single quotes in templates?
我正在尝试使用 Ansible 模板生成 Dockerfiles - 请参阅 Ansible Galaxy 和 Github
中的角色源和模板
我需要生成一个标准的 Dockerfile 行,例如:
...
VOLUME ["/etc/postgresql/9.4"]
...
但是,当我将其放入输入文件时:
...
instruction: CMD
value: "[\"/etc/postgresql/{{postgresql_version}}\"]"
...
最终呈现如下:
...
VOLUME ['/etc/postgresql/9.4']
...
我失去了“(这使得 Dockerfiles 无用)
有什么帮助吗?我怎样才能说服 Jinja 不要用 ' 替换 " ?我试过 \" , |safe 过滤器,甚至 {% raw %} - 它一直在做!
更新:
以下是重现问题的方法:
从galaxy.ansible.com或Github获取peruncs.docker角色(link 上面给出了)
使用以下内容和 运行 写一个简单的剧本(比如 demo.yml):ansible-playbook -v demo.yml。 -v 选项将允许您查看生成的 Dockerfile 与损坏内容所在的临时目录,因此您可以检查它。生成 docker 镜像并不重要,只要尝试正确获取 Dockerfile 即可。
- name: Build docker image
hosts: localhost
vars:
- somevar: whatever
- image_tag: "blabla/booboo"
- docker_copy_files: []
- docker_file_content:
- instruction: CMD
value: '["/usr/bin/runit", "{{somevar}}"]'
roles:
- peruncs.docker
提前致谢!
Ansible 中的某些东西似乎将其识别为有效 Python,因此它被转换为 Python 列表,然后使用 Python 的 str()
进行序列化,这就是为什么您最终得到单引号值的原因。
解决此问题的一个简单方法是在值的开头添加一个 space,这似乎可以防止它被转换为 Python:
- name: Build docker image
hosts: localhost
vars:
- somevar: whatever
- image_tag: "blabla/booboo"
- docker_copy_files: []
- docker_file_content:
- instruction: CMD
value: ' ["/usr/bin/runit", "{{somevar}}"]'
roles:
- peruncs.docker
这导致:
CMD ["/usr/bin/runit", "whatever"]
我正在尝试使用 Ansible 模板生成 Dockerfiles - 请参阅 Ansible Galaxy 和 Github
中的角色源和模板我需要生成一个标准的 Dockerfile 行,例如:
...
VOLUME ["/etc/postgresql/9.4"]
...
但是,当我将其放入输入文件时:
...
instruction: CMD
value: "[\"/etc/postgresql/{{postgresql_version}}\"]"
...
最终呈现如下:
...
VOLUME ['/etc/postgresql/9.4']
...
我失去了“(这使得 Dockerfiles 无用)
有什么帮助吗?我怎样才能说服 Jinja 不要用 ' 替换 " ?我试过 \" , |safe 过滤器,甚至 {% raw %} - 它一直在做!
更新: 以下是重现问题的方法:
从galaxy.ansible.com或Github获取peruncs.docker角色(link 上面给出了) 使用以下内容和 运行 写一个简单的剧本(比如 demo.yml):ansible-playbook -v demo.yml。 -v 选项将允许您查看生成的 Dockerfile 与损坏内容所在的临时目录,因此您可以检查它。生成 docker 镜像并不重要,只要尝试正确获取 Dockerfile 即可。
- name: Build docker image
hosts: localhost
vars:
- somevar: whatever
- image_tag: "blabla/booboo"
- docker_copy_files: []
- docker_file_content:
- instruction: CMD
value: '["/usr/bin/runit", "{{somevar}}"]'
roles:
- peruncs.docker
提前致谢!
Ansible 中的某些东西似乎将其识别为有效 Python,因此它被转换为 Python 列表,然后使用 Python 的 str()
进行序列化,这就是为什么您最终得到单引号值的原因。
解决此问题的一个简单方法是在值的开头添加一个 space,这似乎可以防止它被转换为 Python:
- name: Build docker image
hosts: localhost
vars:
- somevar: whatever
- image_tag: "blabla/booboo"
- docker_copy_files: []
- docker_file_content:
- instruction: CMD
value: ' ["/usr/bin/runit", "{{somevar}}"]'
roles:
- peruncs.docker
这导致:
CMD ["/usr/bin/runit", "whatever"]