【问题标题】:How to stop all containers with Ansible如何使用 Ansible 停止所有容器
【发布时间】:2019-10-19 03:06:31
【问题描述】:

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

我知道我可以使用 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

【问题讨论】:

    标签: loops ansible containers


    【解决方案1】:

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

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

    顺便说一句,debugvar 只接受一个变量名,要调试表达式,您必须改用 msg。 BTW2,对于 loop 关键字,您必须使用花括号来计算表达式。

    【讨论】:

    • 是的,你是对的。我想多了,我试图无缘无故地从字典中提取索引。当带有名称的简单循环将完成工作时。例如:msg: "{{ item.Names[0] }}"。基于这个字符串,我可以轻松地停止容器。感谢您的时间和精力。
    猜你喜欢
    • 2016-02-21
    • 2018-01-03
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多