Loops 如何使用Ansible停止所有容器

Loops 如何使用Ansible停止所有容器,loops,ansible,containers,Loops,Ansible,Containers,作为第一步,我尝试停止所有正在运行的容器,然后移除它们 我知道我可以使用Anslible shell软件包并运行以下命令: docker container stop $(docker container ls -aq) 作为第二步,我可以对shell package执行相同的操作,并清理死掉的容器/图像/卷: docker system prune -a -f --volumes 我尝试过这样的方法(代码示例): 不幸的是,当容器为0时,这会引发一个我想要处理的错误 我可以通过添加以下内容

作为第一步,我尝试停止所有正在运行的容器,然后移除它们

我知道我可以使用Anslible shell软件包并运行以下命令:

docker container stop $(docker container ls -aq)
作为第二步,我可以对shell package执行相同的操作,并清理死掉的容器/图像/卷:

docker system prune -a -f --volumes
我尝试过这样的方法(代码示例):

不幸的是,当容器为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包来完成它,例如()。我能够提取包含所有信息的容器的复杂列表,但我无法找到获取容器Id或名称的方法

我的计划是在使用ID或名称后进行循环,并逐个停止它们

我设法提取了容器的数量(字符串格式),但我找不到一种方法将其转换为索引以便循环

代码示例:

- name: Stop all containers:
  shell: "docker container stop $(docker container ls -aq)"
  ignore_errors: yes
- 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
是否可以将返回的字符串转换为索引并遍历该索引,例如(伪代码样本):


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

- name: Debug dockerInfo
  debug:
    var: item
  loop: "{{ result.containers }}"
  when: result.containers | length != 0
顺便说一句,
debug
var
只接受一个变量名,要调试表达式,必须使用
msg

顺便说一句,对于
循环
关键字,您必须使用大括号计算表达式。

是的,您是对的。我想得太多了,无缘无故地试图从字典中提取索引。当一个简单的循环与名称将做的工作。例如:
msg:“{{item.Names[0]}”
。基于此字符串,我可以轻松停止容器。谢谢你的时间和努力。