Ansible Playbook - Docker Container ermitteln und verarbeiten

Scheinbar gibt es kein natives Modul zum auflisten oder ermitteln von definierten Docker Containern. Deshalb hier ein einfaches Playbook:
- hosts: all
gather_facts: False
connection: local
tasks:
- name: get all containers
# raw schützt davor, dass Ansible die {{ variablen }} mit Jinja2 interpretiert!
shell: '{% raw %}docker ps -a --format "{{ .ID }};{{ .Names }};{{ .Image }};{{ .Status }}"{% endraw %}'
register: docker_ps_raw
# Kompatibilität für ältere Ansible Versionen, sonst könnte man auch mittels | default() im set_fact arbeiten
- name: set default dict
set_fact:
containers: []
containers_by_id: {}
containers_by_name: {}
# Ausgabe der rohen Rückgabe des Shell-Befehls
# - debug:
# var: docker_ps_raw
- name: iterate over containers to set facts
set_fact:
# listen werden mit + zusammengeführt
containers: "{{ containers + [d] }}"
# dicts mittels Combine updaten
containers_by_id: "{{ containers_by_id | combine({_id: d}) }}"
containers_by_name: "{{ containers_by_name | combine({_name: d}) }}"
vars:
# der einfacheren Übersicht halber in einzelne Variablen ausgelagert
_id: "{{ item.split(';')[0] }}"
_name: "{{ item.split(';')[1] }}"
_image: "{{ item.split(';')[2] }}"
_status: "{{ item.split(';')[3] }}"
_up: "{{ _status.startswith('Up') | ternary(True, False) }}"
d: '{"id": "{{ _id}}", "name": "{{ _name }}", "image": "{{ _image }}", "status": "{{ _status }}", "up": "{{ _up }}"}'
# Iteration über die Ausgabezeilen von docker ps
loop: "{{ docker_ps_raw.stdout_lines }}"
- debug:
var: containers
- debug:
var: containers_by_id
- debug:
var: containers_by_name
Beispielausgabe
TASK [debug] ****************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"containers": [
{
"id": "8ace8fe44c8a",
"image": "linuxserver/grocy",
"name": "grocy",
"status": "Up 7 weeks",
"up": "True"
},
{
"id": "844ff087b21d",
"image": "257fd58747c5",
"name": "pihole",
"status": "Exited (0) 5 days ago",
"up": "False"
}
]
}
TASK [debug] ****************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"containers_by_id": {
"844ff087b21d": {
"id": "844ff087b21d",
"image": "257fd58747c5",
"name": "pihole",
"status": "Exited (0) 5 days ago",
"up": "False"
},
"8ace8fe44c8a": {
"id": "8ace8fe44c8a",
"image": "linuxserver/grocy",
"name": "grocy",
"status": "Up 7 weeks",
"up": "True"
}
}
}
TASK [debug] ****************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"containers_by_name": {
"grocy": {
"id": "8ace8fe44c8a",
"image": "linuxserver/grocy",
"name": "grocy",
"status": "Up 7 weeks",
"up": "True"
},
"pihole": {
"id": "844ff087b21d",
"image": "257fd58747c5",
"name": "pihole",
"status": "Exited (0) 5 days ago",
"up": "False"
}
}
}
Verwendung
Kurze Erklärung der Variablen:
containers - enthält alle Container in einer Liste
containers_by_id - ein Dict mit Zugriff über die Container-ID
containers_by_name - ein Dict mit Zugriff über den Container-Name
Zugriffe können zum Beispiel folgenderweise erfolgen:
- name: my ansible task
shell: "do_something {{ containers_by_name['grocy'] }}"
when: "'grocy' in containers_by_name}}"
- name: my ansible task
shell: "do_something {{ item['name'] }}"
loop: "{{ containers }}"