为什么 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

提前致谢!

A​​nsible 中的某些东西似乎将其识别为有效 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"]