Manchmal muß ich einen ganzen Verzeichnisbaum auf einen Rechner übertragen,
der mittels Ansible administriert wird. Leider gibt es keine Lösung
hierfür, die “supertoll” ist.
Dieser Artikel basiert auf Ansible-2.9.7, die Quelltexte befinden
sich auf Github.
Aufgabenstellung
Ich habe eine Ansible-Rolle (role), die diese Dateien auf dem
Zielrechner ausrollen soll:
uli@ulinuc:~/tmp/ansible-folder-copy$ ansible-playbook copy-one-by-one.yml --check --diff
PLAY [all] *******************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************
[WARNING]: Platform linux on host ansible-test is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [ansible-test]
TASK [copy-one-by-one-role : copy template.vhost] ********************************************************************************************************************************************************************************************
--- before
+++ after: /home/uli/tmp/ansible-folder-copy/roles/copy-one-by-one-role/files/rollout/apache2/vhosts.d/template.vhost
@@ -0,0 +1 @@
+Erste Version - template.vhost
changed: [ansible-test]
TASK [copy-one-by-one-role : copy template.conf] *********************************************************************************************************************************************************************************************
--- before
+++ after: /home/uli/tmp/ansible-folder-copy/roles/copy-one-by-one-role/files/rollout/apache2/conf.d/template.conf
@@ -0,0 +1 @@
+Erste Version - template.conf
changed: [ansible-test]
TASK [copy-one-by-one-role : copy 001.txt] ***************************************************************************************************************************************************************************************************
--- before
+++ after: /home/uli/tmp/ansible-folder-copy/roles/copy-one-by-one-role/files/rollout/data/with/deep/paths/001.txt
@@ -0,0 +1 @@
+Datei 001 - 1
changed: [ansible-test]
TASK [copy-one-by-one-role : copy 002.txt] ***************************************************************************************************************************************************************************************************
--- before
+++ after: /home/uli/tmp/ansible-folder-copy/roles/copy-one-by-one-role/files/rollout/data/with/deep/paths/002.txt
@@ -0,0 +1 @@
+Datei 002 - 2
...
Die Ausführung dauert sehr lange, leider nicht direkt abgestoppt.
Man sieht “schöne DIFFs”.
Stoppuhr – time ansible-playbook copy-one-by-one.yml --check --diff
* real 6m16.366s, user 2m11.332s, sys 1m18.876s
* real 6m26.726s, user 2m10.996s, sys 1m24.316s
* real 4m39.737s, user 1m19.788s, sys 0m51.504s
* real 4m34.403s, user 1m15.944s, sys 0m49.900s
* real 4m34.527s, user 1m16.412s, sys 0m49.548s
* real 4m35.456s, user 1m17.816s, sys 0m51.064s
Aufruf ohne —check —diff mit Komplettabgleich
Aufruf bei leerem Zielrechner, es müssen alle Dateien abgeglichen werden:
Die Ausführung dauert sehr lange. Es werden keinerlei Dateien hochgeladen.
Stoppuhr:
* real 5m4.665s, user 1m47.408s, sys 1m10.628s
* real 6m36.950s, user 2m11.236s, sys 1m19.168s
* real 4m27.372s, user 1m14.708s, sys 0m44.964s
Die Ausführung dauert relativ lange, die Ausgabe bleibt “hängen”.
Man sieht keine DIFFs.
Stoppuhr – time ansible-playbook copy-folder.yml --check --diff
* real 3m40.986s, user 0m56.912s, sys 0m34.692s
* real 3m30.098s, user 0m57.872s, sys 0m35.396s
* real 3m12.622s, user 0m48.276s, sys 0m28.536s
Aufruf ohne —check —diff mit Komplettabgleich
Aufruf bei leerem Zielrechner, es müssen alle Dateien abgeglichen werden:
Die Ausführung dauert sehr lange. Es werden keinerlei Dateien hochgeladen.
Stoppuhr:
* real 3m23.959s, user 0m51.380s, sys 0m28.668s
* real 3m17.905s, user 0m49.404s, sys 0m27.012s
* real 3m25.674s, user 0m53.100s, sys 0m29.912s
uli@ulinuc:~/tmp/ansible-folder-copy$ ansible-playbook synchronize-folder.yml --check --diff
PLAY [all] *******************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************
[WARNING]: Platform linux on host ansible-test is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [ansible-test]
TASK [synchronize-folder-role : Synchronize complete folder] *****************************************************************************************************************************************************************************
cd+++++++++ rollout/
cd+++++++++ rollout/apache2/
cd+++++++++ rollout/apache2/conf.d/
<f+++++++++ rollout/apache2/conf.d/template.conf
cd+++++++++ rollout/apache2/vhosts.d/
<f+++++++++ rollout/apache2/vhosts.d/template.vhost
...
Die Ausführung läuft sehr schnell durch.
Man sieht “kryptische DIFFs”.
Stoppuhr – time ansible-playbook synchronize-folder.yml --check --diff
* real 0m10.178s, user 0m4.208s, sys 0m0.664s
* real 0m7.990s, user 0m3.952s, sys 0m0.912s
* real 0m7.629s, user 0m3.748s, sys 0m0.724s
Aufruf ohne —check —diff mit Komplettabgleich
Aufruf bei leerem Zielrechner, es müssen alle Dateien abgeglichen werden:
Die Ausführung dauert relativ lange.
Man sieht “schöne DIFFs”. Leider sieht man auch blaue Warnmeldungen mit “skipping: …”
Stoppuhr – time ansible-playbook copy-filetree.yml --check --diff
* real 4m21.437s, user 1m9.868s, sys 0m47.288s
* real 4m26.132s, user 1m10.852s, sys 0m49.024s
* real 5m46.500s, user 1m45.084s, sys 1m7.800s
Aufruf ohne —check —diff mit Komplettabgleich
Aufruf bei leerem Zielrechner, es müssen alle Dateien abgeglichen werden:
Die Ausführung dauert sehr lange. Es werden keinerlei Dateien hochgeladen.
Stoppuhr:
* real 4m10.495s, user 1m7.376s, sys 0m42.172s
* real 4m24.945s, user 1m7.496s, sys 0m45.588s
* real 4m52.096s, user 1m23.396s, sys 0m56.076s
Für einzelne Dateien (bis max. 5) würde ich COPY-ONE-BY-ONE (=COPY-EINZELN) verwenden.
Für mehrere Dateien (grob bis 30) würde ich COPY-FILETREE verwenden und für sehr
viele Dateien SYNCHRONIZE-FOLDER (=SYNCHRONIZE-KOMPLETT).
Einfache Anwendung
Alle Konstrukte sind einfach in der Anwendung bis auf COPY-ONE-BY-ONE (=COPY-EINZELN).
Bei COPY-ONE-BY-ONE müssen alle Dateien einzeln im Ansible-Task aufgelistet werden.
In unserem Beispiel sind das über 100 Stück:
Fast alle Konstrukte sind sehr langsam, sie brauchen zwischen 4 und 8 Minuten für die Ausführung.
Die Streuung pro Ausführung ist enorm. Nur SYNCHRONIZE-FOLDER (SYNCHRONIZE-KOMPLETT) ist sehr viel schneller
und benötigt nur 10 Sekunden!
Aussagekräftige Ausgabe bei --check --diff
Fast alle Konstrukte liefern aussagekräftige Ausgaben bei ... --check --diff.
Die Ausgaben sehen dann grob so aus:
12345678
--- before: /tmp/copied-by-ansible/data/with/deep/paths/070.txt+++ after: /home/uli/git/public/ansible-folder-copy/files/rollout/data/with/deep/paths/070.txt@@ -1,5 +1 @@ Datei 070 - 70
--Ein paar neue Zeilen eingefuegt,-damit wir "--check --diff" schoen-zeigen koennen!
Graphisch:
Eine Ausnahme ist SYNCHRONIZE-FOLDER (SYNCHRONIZE-KOMPLETT).
Hier werden DIFFs mit kryptischen Zeichen angedeutet:
Auf einem farbfähigen Terminal erscheinen die Zusatzausgaben in blau und stechen etwas in’s Auge.
Sie können weitgehend unterdrückt werden mit dieser Änderung an “ansible.cfg”:
12345678
# messages. NOTE: the task header will still be shown regardless of whether or not the
# task is skipped.
#
-#display_skipped_hosts = True+display_skipped_hosts = False # By default, if a task in a playbook does not include a name: field then
# ansible-playbook will construct a header that includes the task's action but
Lange Pause bei den Fortschrittsausgaben
Fast alle Konstrukte sind sehr langsam. Die Wartezeit wird in der Regel verkürzt mit
Ausgaben der Art “Bearbeite Datei XYZ”. Nur COPY-FOLDER (COPY-KOMPLETT) gibt lediglich
eine Zeile “Bearbeite Verzeichnis XYZ” aus gefolgt von minutenlanger Pause.
Ungeduldige Anwender gehen von einem Aufhängen aus und brechen den Job ab!