首页 > 解决方案 > 使用 Ansible 重启多个 Docker 容器

问题描述

如何从 Ansible 动态重启所有 docker 容器?我的意思是我知道一种方法,我可以在变量中定义我的容器并循环它们,但我想要实现的是 -

获取当前正在运行的容器,并通过某个循环一一重启所有或部分容器。

如何使用 Ansible 实现这一目标?

标签: dockerdocker-composeansibleansible-inventory

解决方案


码头工人解释

检索所有正在运行的容器的名称/图像:

docker container ls -a --format '{{.Names}} {{.Image}}'

由于以下选项,您还可以将命令的输出过滤为docket container特定的图像名称--filter ancestor=image_name

docker container ls -a --filter ancestor=alpine --format '{{.Names}} {{.Image}}'

Ansible 集成:

首先,我将一些过滤器定义为 Ansible 变量:

  vars:
    - image_v1: '--filter ancestor=my_image:v1'
    - image_v2: '--filter ancestor=my_image:v2'

他们我将docker container在一个专门的任务中执行命令并将命令输出保存到 Ansible 变量中:

 - name: Get images name
   command: docker container ls -a {{ image_v1 }} {{ image_v2 }} --format "{{ '{{' }}.Names {{ '}}' }} {{ '{{' }}.Image {{ '}}' }}"
   register: docker_images

最后,我将对其进行迭代并将其用于docker_containeransible 模块:

- name: Restart images
  docker_container:
    name: "{{ item.split(' ')[0]}}"
    image: "{{ item.split(' ')[1]}}"
    state: started
    restart: yes
  loop: "{{ docker_images.stdout_lines}}"

最终剧本.yml

---
- hosts: localhost
  gather_facts: no
  vars:
    - image_v1: '--filter ancestor=my_image:v1'
    - image_v2: '--filter ancestor=my_image:v2'
  tasks:
    - name: Get images name
      command: docker container ls -a {{ image_v1 }} {{ image_v2 }} --format "{{ '{{' }}.Names {{ '}}' }} {{ '{{' }}.Image {{ '}}' }}"
      register: docker_images

    - name: Restart images
      docker_container:
        name: "{{ item.split(' ')[0]}}"
        image: "{{ item.split(' ')[1]}}"
        state: started
        restart: yes
      loop: "{{ docker_images.stdout_lines}}"

推荐阅读