为什么ansible总是用模板中的单引号替换双引号?

Hri*_*nov 8 jinja2 ansible docker

我正在尝试使用Ansible模板生成Dockerfiles - 请参阅Ansible Galaxy和Github中的角色源和模板

我需要创建一个标准的Dockerfile行,如:

...
VOLUME ["/etc/postgresql/9.4"]
...
Run Code Online (Sandbox Code Playgroud)

但是,当我把它放在输入文件中时:

...
instruction: CMD
value: "[\"/etc/postgresql/{{postgresql_version}}\"]"
...
Run Code Online (Sandbox Code Playgroud)

最终渲染如下:

...
VOLUME ['/etc/postgresql/9.4']
...
Run Code Online (Sandbox Code Playgroud)

我失去了"(这使得Dockerfiles无用)

有帮助吗?我如何说服Jinja不要用'with'代替?我试过 ',安全过滤器,甚至{%raw%} - 它只是继续这样做!

更新: 以下是如何重现该问题:

galaxy.ansible.com或Github 获取peruncs.docker角色(上面给出链接)用下面的内容写一个简单的playbook(比如demo.yml)并运行:ansible-playbook -v demo.yml.该-v选项将允许您查看temp目录,其中产生的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
Run Code Online (Sandbox Code Playgroud)

提前致谢!

lar*_*sks 12

Ansible中的某些内容似乎认为它是有效的Python,因此它会被转换为Python列表,然后使用Python进行序列化str(),这就是为什么你最终得到单引号值的原因.

解决这个问题的一个简单方法是在值的开头粘贴一个空格,这似乎阻止它转换为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
Run Code Online (Sandbox Code Playgroud)

这导致:

CMD  ["/usr/bin/runit", "whatever"] 
Run Code Online (Sandbox Code Playgroud)