ansible 列出 docker 容器

ansible 列出 docker 容器

我有一本剧本,其中一个任务收集有关在特定主机上运行 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

也可以使用 shell 命令来运行以下命令: sudo docker container ls -a

另一个想法:

    - name: docker container ls -a
      tags: container_ls
      become: True
      shell:
        "docker container ls -a"
      register: container_info

    - name: docker container ls -a result
      tags: container_ls
      debug:
        msg: "{{container_info.stdout_lines}}"

在此输入图像描述

答案4

最近添加的docker_pspytoccaz.docker Galaxy 集合中的模块提供了一个很好的解决方案,其中包含字典列表作为输出。

相关内容