我有一本剧本,其中一个任务收集有关在特定主机上运行 docker 容器的信息。
- name: Gather info
hosts: "{{ hosts }}"
gather_facts: no
tasks:
- name: Check all running containers
become: yes
command: docker ps --format "{{ \.Names }}"
register: dkr_ps
- debug: msg="{{dkr_ps}}"
但不知何故,由命令模块运行的 docker cmd 仍然存在,并抛出以下错误:
TemplateSyntaxError: unexpected char u'\\' at 23
line 1
我想我没有正确逃脱?
答案1
您有两个相互冲突的模板:命令所需的模板docker
和 Ansible 中使用的 Jinja2 模板。 Jinja2 正在尝试解释{{ .Names }}
哪个无效;这就是错误消息的来源。
一般经验法则是通过将模板符号转换为有效的 Jinja2 表达式来转义 Docker 模板:
command: docker ps --format "{{ '{{' }} .Names {{ '}}' }}"
答案2
转义引号和大括号
- command: 'docker ps --format \"\{\{ .Names \}\}\"'
先测试一下。例如
- command: 'echo docker ps --format \"\{\{ .Names \}\}\"'
register: result
- debug:
var: result.cmd|join(' ')
给出
result.cmd|join(' '): echo docker ps --format "{{ .Names }}"
答案3
答案4
最近添加的docker_pspytoccaz.docker Galaxy 集合中的模块提供了一个很好的解决方案,其中包含字典列表作为输出。