使用Ansible重新启动多个Docker容器

时间:2020-04-22 15:37:28

标签: docker docker-compose ansible ansible-inventory

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

获取当前正在运行的容器,并通过某个循环逐个重新启动全部或其中一些容器。

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

1 个答案:

答案 0 :(得分:2)

Docker解释

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

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_container ansible模块:

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

最终版playbook.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}}"