Docker Container via Volume finden

2019-09-22 - christian - docker, ansible

Hat acme.sh neue Zertifikate erzeugt welche anschließend mit Ansible auf die jeweiligen Server Systeme verteilt werden, müssen neben normalen systemd Services auch Docker Container neu gestartet werden, welche die Zertifikate via Volume eingebunden haben.

# install jq as a dependency on the remote system
-
    name: Install jq
    package:
        name: jq
        state: present

# do a inspect on all docker containers,
# search with jq in the JSON for all
# containers which using a volume path starting with /etc/letsencrypt
-
    name: Find container which are using certificates
    shell: "docker inspect $(docker ps --format \"{{'{{'}}.ID{{'}}'}}\") | jq '[ .[] | { name: .Name, mounts: [ .Mounts[].Source ] } | select(.mounts | any(startswith(\"/etc/letsencrypt/\"))).name ]'"
    register: certcontainersresult

# deserialize the json for ansible
# use an empty array if the string is empty
-
    name: Parse docker inspect output
    set_fact:
        certcontainers: "{{('[]' if certcontainersresult.stdout == '' else certcontainersresult.stdout) | from_json}}"

# loop through all containers and restart them
-
    name: Restart all containers which using one of the certs
    docker_container:
        name: "{{item}}"
        state: "started"
        restart: yes
    loop: "{{certcontainers|default([])}}"

Der docker inspect Befehl liefert JSON, welches mit dem sehr praktischen Tool jq durchsucht werden kann. Als Ergebnis dieses Befehls erhält man ein einfaches JSON Array mit allen Container Namen welche Lets Encrypt Zertifikate verwenden:

[
  "/container01",
  "/container02"
]

Der JSON String kann anschließend von Ansible deserialisiert werden und in der loop Anweisung zum Container Neustart verwendet werden.


go back Creative Commons License
serverless.industries Image by Carl Lender (CC BY 2.0)