Running an Ansible command in multiple docker containers
Solution 1:
Given the following example output from docker ps
:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e21761c9c44 busybox "top" 22 minutes ago Up 22 minutes agitated_yonath
7091d9c7cc56 nginx "nginx -g 'daemon off" 23 minutes ago Up 23 minutes 80/tcp, 443/tcp fervent_blackwell
This playbook will give you an idea of how to capture the data you need and how to run actions iterating on the provided list. It's a very simple example, and you'll have to adapt it to your needs. That's on purpose:
---
- hosts: localhost
gather_facts: no
tasks:
- name: gather list of containers
shell: docker ps | awk '/{{ item }}/{print $1}'
register: list_of_containers
with_items:
- busybox
#- name: debug
# debug: msg="{{ list_of_containers }}"
- name: run action in container(s)
docker_container:
name: temp-container
image: busybox
command: uptime
cleanup: yes
detach: yes
register: result_of_action
with_items:
- list_of_containers.results.stdout_lines
The interesting parts are:
Gather the list of containers in a given host (
localhost
in my example). I've used a plainshell
invocation to be able to useawk
to filter out the output. The result is stored in a register. Since the input is a list, this will have a direct consequence on how to retrieve the data back, more below. Uncomment thedebug
task in between to compare the data stored in the register with and without a list.Iterate over the register's results (container ID) and use the
docker_container
module to run an action (command
parameter). You can uselinks
andvolumes_from
in yourdocker_container
invocation. Check the on-line documentation of the module for the details.