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ß