如何使用Ansible停止所有容器

时间:2019-10-19 03:06:31

标签: loops ansible containers

我试图首先停止所有正在运行的容器,然后将其删除。

我知道我可以使用Anslible shell包并运行以下命令来完成它:

docker container stop $(docker container ls -aq)

第二步,我可以对shell包做同样的事情,并清理死的容器/图像/卷:

docker system prune -a -f --volumes

我已经尝试过这样的事情(代码示例):

- name: Stop all containers:
  shell: "docker container stop $(docker container ls -aq)"
  ignore_errors: yes

不幸的是,当容器为0时,这引发了我要处理的错误。

我可以通过添加以下内容来改善它:

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: result

- name: Stop all containers
  shell: "docker container stop $(docker container ls -aq)"
  when: result.host_info.Containers != 0

我想通过纯粹使用Ansible软件包来做到这一点(docker_host_info)。我能够提取包含容器在内的复杂列表,其中包含所有信息,但是找不到找到容器ID或名称的方法。

我的计划是在ID或名称之后循环播放,并一一停止。

我设法提取了一些容器(字符串格式),但是我找不到将其转换为索引的方法,所以我可以循环遍历。

代码示例:

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: result

- name: Debug dockerInfo
  debug:
    var: result.containers 
    # var: result.host_info.Containers
    # loop: "{{ result.host_info.Containers }}"
    # loop: "{{ range(0, 4)|list }}"
  when: result.host_info.Containers != 0

是否可以将返回的字符串转换为索引并通过该索引进行迭代,例如(伪造的代码示例):

- name: Debug dockerInfo
  debug:
    var: "{{ result.containers[item].Id }}
  loop: result.host_info.Containers
  when: result.host_info.Containers != 0

1 个答案:

答案 0 :(得分:1)

result.containers是一个列表,因此您可以直接对其进行迭代:

- name: Debug dockerInfo
  debug:
    var: item
  loop: "{{ result.containers }}"
  when: result.containers | length != 0

顺便说一句,var中的debug仅采用变量名,要调试表达式,您必须改用msg。 BTW2,对于loop关键字,您必须使用花括号来计算表达式。