如何从Ansible动态重启所有Docker容器?我的意思是我知道一种可以在变量中定义容器并遍历它们的方式,但是我想要实现的是-
获取当前正在运行的容器,并通过某个循环逐个重新启动全部或其中一些容器。
如何使用Ansible实现这一目标?
答案 0 :(得分:2)
检索所有正在运行的容器的名称/图像:
docker container ls -a --format '{{.Names}} {{.Image}}'
借助docket container
选项,您还可以将--filter ancestor=image_name
命令的输出过滤为特定的图像名称:
docker container ls -a --filter ancestor=alpine --format '{{.Names}} {{.Image}}'
首先,我将一些过滤器定义为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}}"