AWX persistenten Ordner in Container einbinden

Ich verwende den AWX Ansible Tower unter anderem um von Netzwerkgeräten Konfigurationsbackups zu machen. Da die Daten in den Containern nicht persistent sind mappe ich mir einen Ordner in den awx_tasks Container um meine Backups zu speichern.

Meine AWX Installation liegt unter /opt/awx, alle Beispiele beziehen sich auf diesen Ordner.

Zuerst erstellen wir einen neuen Ordner unter /opt/awx

mkdir /opt/awx/data

Anpassen der docker-compose.yml Datei

Im Task image: ansible/awx fügen wir unter volumes: unser neues Mapping hinzu z.B.

- "/opt/awx/data:/var/lib/awx/data:rw"

Gleichzeitig füge ich noch eine weitere Environment Variable hinzu, ich möchte nicht jedes mal den kompletten Pfad in meine Playbooks einbauen. Dies ist unter environment: durchzuführen.

DATA: '/var/lib/awx/data'

Mein Task sieht im ganzen jetzt so aus:

task:
  image: ansible/awx:17.0.1
  container_name: awx_task
  depends_on:
    - redis
    - web
    - postgres
  command: /usr/bin/launch_awx_task.sh
  hostname: awx
  user: root
  restart: unless-stopped
  volumes:
    - supervisor-socket:/var/run/supervisor
    - rsyslog-socket:/var/run/awx-rsyslog/
    - rsyslog-config:/var/lib/awx/rsyslog/
    - "/opt/awx/awxcompose/SECRET_KEY:/etc/tower/SECRET_KEY"
    - "/opt/awx/awxcompose/environment.sh:/etc/tower/conf.d/environment.sh"
    - "/opt/awx/awxcompose/credentials.py:/etc/tower/conf.d/credentials.py"
    - "/opt/awx/awxcompose/redis_socket:/var/run/redis/:rw"
    - "/opt/awx/projects:/var/lib/awx/projects:rw"
    - "/opt/awx/data:/var/lib/awx/data:rw"
  dns:
    - 10.1.2.3
    - 10.1.2.4
  environment:
    AWX_SKIP_MIGRATIONS: "1"
    http_proxy: http://10.1.2.3:8080
    https_proxy: http://10.1.2.3:8080
    DATA: '/var/lib/awx/data'
    no_proxy:
    SUPERVISOR_WEB_CONFIG_PATH: '/etc/supervisord.conf'

Anschließend stoppe ich die Container mit docker-compose …

docker-compose stop

… und starte diese neu …

docker-compose up -d --force-recreate

Die Docker sollten jetzt alle wieder gestartet sein:

root@awx01:/opt/awx/awxcompose# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
ac55a5883c1d        ansible/awx:17.0.1   "/usr/bin/tini -- /u…"   About an hour ago   Up About an hour    8052/tcp                 awx_task
d650acf33395        ansible/awx:17.0.1   "/usr/bin/tini -- /b…"   About an hour ago   Up About an hour    0.0.0.0:8052->8052/tcp   awx_web
547b661bb8cb        postgres:12          "docker-entrypoint.s…"   About an hour ago   Up About an hour    5432/tcp                 awx_postgres
0b397c854f33        redis                "docker-entrypoint.s…"   About an hour ago   Up About an hour    6379/tcp                 awx_redis

Um zu überprüfen ob die Änderung erfolgreich war gehen wir in die bash des Containers awx_task:

docker exec -it $(docker ps | grep awx_task | awk '{ print $1; }') bash

Die Environment Variable sollte den korrekten Ordner innerhalb des Containers ausgeben.

bash-4.4# echo $DATA
/var/lib/awx/data

Testweise legen wir eine Datei mit touch an und verlassen den Container.

bash-4.4# touch /var/lib/awx/data/test.txt
bash-4.4# exit

Die Datei sollte im „realen“ Dateisystem auffindbar sein unter /opt/awx/data

root@awx01:/opt/awx/awxcompose# ls -la /opt/awx/data/
total 10
drwxr-xr-x 3 root root 4096 Feb 1 13:45 .
drwxr-xr-x 6 root root 4096 Feb 1 13:08 ..
-rw-r--r-- 1 root root 0 Feb 1 13:45 test.txt

In meinen Playbooks baue ich das meistens so ein:

---
- hosts: all
  gather_facts: False
  vars:
    host: "{{ ansible_host }}"
    root_dir: "{{ lookup('env','DATA') }}"
    ansible_connection: network_cli
    ansible_network_os: ios
    ansible_user: "{{ lookup('env','ANSIBLE_NET_USERNAME') }}"
    ansible_ssh_pass: "{{ lookup('env','ANSIBLE_NET_PASSWORD') }}"

  tasks:

    # Backup for IOS devices
    - name: Get the config from Cisco IOS device
      ios_command:
        commands:
          - show run
      register: config

    # Create backup folder
    - name: Create backup folder if not exist ...
      file:
        path: "{{ root_dir }}/backups"
        state: directory

    # Store config
    - name: Store config to backup folder
      copy:
        content: "{{ config.stdout[0] }}"
        dest: "{{ root_dir }}/backups/{{ inventory_hostname }}.txt"
        force: yes

Viel Spaß 🙂

2 Kommentare

  1. Ich habe ein gewisses Problem mit meiner yaml Datei.

    Ich möchte von Cisco über AWX die Config local auf dem Server wo ansible / AWX installiert ist sicher und später auf ein TFTP Server transferieren, da ich noch kein TFTP Server hab.

    Leider bekomm ich das nicht so hin er, erzeugt das Backup aber leider in einem ganz anderen Ordner.
    /var/lib/docker/overlay2/4543njkl26b34l2g6kjg3j456/diff/home/meinebackups
    oder
    /var/lib/docker/overlay2/4543njkl26b34l2g6kjg3j456/merged/home/meinebackups
    an was könnte dieses Problem liegen

    1. Hallo Joachim,
      ich kenne leider dein Playbook nicht, aber Du kannst die Ausgabe so wie ich es gemacht habe mit copy zu einem Pfad schreiben lassen.

      – name: Store config to backup folder
      copy:
      content: „{{ config.stdout[0] }}“
      dest: „{{ root_dir }}/backups/{{ inventory_hostname }}.txt“
      force: yes

      Gruß

      Max

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.