Ansible Playbook - Docker Container ermitteln und verarbeiten

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 }}"