Kann Ansible unarchive dazu gebracht werden, Änderungszeiten für statische Ordner zu schreiben?

Lesezeit: 7 Minuten

halfers Benutzer-Avatar
halber

Ich schreibe einen Build-Prozess für eine WordPress-Installation mit Ansible. Es hat im Moment kein Build-System auf Anwendungsebene, und ich habe mich für Ansible entschieden, damit es sich sauber in Server-Build-Skripte integrieren lässt, sodass ich auf Knopfdruck einen funktionierenden Server aufrufen kann.

Die meisten meiner WordPress-Plugins werden mit installiert unarchive Funktion, die auf versionierte Plugin-Builds auf dem offiziellen Installationsserver von wordpress.org verweist. Ich habe nur bei einem davon ein Problem festgestellt, nämlich dass es immer als “geändert” markiert wird, obwohl die Dateien genau gleich sind.

Nach Prüfung des Zustands ls -Rl Vorher und nachher bemerkte ich, dass dieses Plugin (WordPress HTTPS) das einzige ist, das interne Unterverzeichnisse verwendet, und bei jeder Dekomprimierung wird die Änderungszeit von Ordnern angestoßen.

Es kann hilfreich sein zu wissen, dass dies ein Projekt-Build-Skript ist, mit a connection von local. Ich vermute daher, dass SSH nicht verwendet wird.

Hier ein Ausschnitt aus meinem Playbook:

- name: Install the W3 Total Cache plugin
  unarchive: >
    src=https://downloads.wordpress.org/plugin/w3-total-cache.0.9.4.1.zip
    dest=wp-content/plugins
    copy=no

- name: Install the WP DB Manager plugin
  unarchive: >
    src=https://downloads.wordpress.org/plugin/wp-dbmanager.2.78.1.zip
    dest=wp-content/plugins
    copy=no

# @todo Since this has internal sub-folders, need to work out
# how to preserve timestamps of the original folders rather than
# re-writing them, which forces Ansible to record a change of
# server state.
- name: Install the WordPress HTTPS plugin
  unarchive: >
    src=https://downloads.wordpress.org/plugin/wordpress-https.3.3.6.zip
    dest=wp-content/plugins
    copy=no

Eine hackige Methode, dies zu beheben, ist die Verwendung ls -R vorher und nachher, Verwenden von Optionen zum Einschließen von Dateigrößen, aber nicht von Zeitstempeln, und dann md5sum diese Ausgabe. Ich könnte es dann als geändert markieren, wenn sich die Prüfsumme ändert. Es würde funktionieren, ist aber nicht sehr elegant (und ich möchte das für alle Plugins tun, um die Konsistenz zu gewährleisten).

Ein anderer Ansatz besteht darin, die Aufgabe abzubrechen, wenn eine Plugin-Datei bereits vorhanden ist, aber das würde zu Problemen führen, wenn ich die Plugin-Versionsnummer auf die neueste Kopie erhöhe.

Daher suche ich idealerweise nach einem Schalter, an dem ich mich präsentieren kann unarchive zu sagen, dass ich den Ordner mal aus der Zip-Datei modifizieren möchte, nicht aus der Playbook-Laufzeit. Ist es möglich?


Update: Ein Kommentator fragte, ob sich der Dateiinhalt in irgendeiner Weise geändert haben könnte. Um festzustellen, ob dies der Fall ist, habe ich dieses Skript geschrieben, das eine Prüfsumme für (1) alle Dateiinhalte und (2) alle Datei-/Verzeichniszeitstempel erstellt:

#!/bin/bash

# Save pwd and then change dir to root location
STARTDIR=`pwd`
cd `dirname $0`/../..

# Clear collation file
echo > /tmp/wp-checksum

# List all files recursively
find wp-content/plugins/wordpress-https/ -type f | while read file
do
    #echo $file
    cat $file >> /tmp/wp-checksum
done

# Get checksum of file contents
sha1sum /tmp/wp-checksum

# Get checksum of file sizes
ls -Rl wp-content/plugins/wordpress-https/ | sha1sum

# Go back to original dir
cd $STARTDIR

Ich habe dies als Teil meines Playbooks ausgeführt (mit Tags isoliert ausgeführt) und Folgendes erhalten:

PLAY [Set this playbook to run locally] ****************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [jonblog : Run checksum command] ******************************************
changed: [localhost]

TASK [jonblog : debug] *********************************************************
ok: [localhost] => {
    "checksum_before.stdout_lines": [
        "374fadc4df1578f78fd60b1be6758477c2c533fa  /tmp/wp-checksum", 
        "10d66f7bdbbdd3af531d1b11a3db3059a5868838  -"
    ]
}

TASK [jonblog : Install the WordPress HTTPS plugin] ***************
changed: [localhost]

TASK [jonblog : Run checksum command] ******************************************
changed: [localhost]

TASK [jonblog : debug] *********************************************************
ok: [localhost] => {
    "checksum_after.stdout_lines": [
        "374fadc4df1578f78fd60b1be6758477c2c533fa  /tmp/wp-checksum", 
        "719c9da94b525e723b1abe188ee9f5bbaf121f3f  -"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=6    changed=3    unreachable=0    failed=0   

Die Debug-Zeilen geben den Prüfsummen-Hash des Inhalts der Dateien wieder (dieser ist identisch) und dann den Prüfsummen-Hash von ls -Rl der Dateistruktur (dies hat sich geändert). Dies steht im Einklang mit meiner früheren manuellen Feststellung, dass sich Verzeichnisprüfsummen ändern.

Was kann ich also als Nächstes tun, um herauszufinden, warum Ordneränderungszeiten diesen Vorgang fälschlicherweise als geändert kennzeichnen?

  • Sind Sie absolut sicher, dass der Inhalt jedes Mal gleich ist? Was passiert, wenn Sie alles md5summieren und dann Ihr Spiel ausführen und erneut überprüfen? Ich wäre sehr überrascht, wenn Ansible eine Datei mit demselben Inhalt überschreibt, aber es könnte irgendwo einen Fehler geben. Das erste, was mir in den Sinn kommt, ist, dass die WP-Installation eine dieser Dateien nach dem Kopieren ändert.

    – ydaetskcoR

    6. Juni 2016 um 7:00 Uhr

  • Danke @ydaetskcoR. Ich bin mir ziemlich sicher, ja – obwohl ich nicht daran gedacht hatte, diesen Befehl zu markieren und alleine auszuführen, also werde ich das als nächstes tun. Ich glaube, der Inhalt des Archivs ist bei jedem Durchlauf völlig identisch, aber es ist möglich, dass etwas anderes mit dem Verzeichnis herumspielt. Es wird jedoch nicht WP sein – ich führe keinen WP-PHP-Installationscode als Teil dieses Playbooks aus.

    – Halber

    6. Juni 2016 um 7:28 Uhr

  • @ydaetskcoR: Ich habe die von Ihnen vorgeschlagene Recherche durchgeführt und festgestellt, dass die Dateien tatsächlich byteidentisch sind – nur die Zeitstempel der Ordner ändern sich. Irgendwelche neuen Ideen? Ich werde in der Zwischenzeit mein Prüfsummenskript als Maß für die Änderung verwenden, was mich vorerst idempotent machen wird – aber es wäre schön, dies richtig zu tun (oder dem Ansible-Kernteam einen Fehler zu melden).

    – Halber

    22. Juni 2016 um 9:40 Uhr

  • Ich bekomme nicht viele Bisse auf mein Kopfgeld … lohnt es sich, es als Fehler zu melden? Ich habe das Problem mit meinem Prüfsummenskript behoben, also ist das Problem für mich abgewendet und es kann so bleiben – aber es wäre schön, es für andere zu beheben.

    – Halber

    26. Juni 2016 um 11:28 Uhr

Anstatt jedes Mal alle Dateien zu überschreiben und einen Weg zu finden, das gleiche Änderungsdatum beizubehalten, möchten Sie vielleicht die verwenden creates Möglichkeit der unarchive Modul.

Wie Sie vielleicht bereits wissen, teilt dies Ansible mit, dass eine bestimmte Datei/ein bestimmter Ordner als Ergebnis der Aufgabe erstellt wird. Somit wird die Aufgabe beim nächsten Mal nicht erneut ausgeführt werden, wenn diese Datei/Ordner bereits vorhanden ist.

Sehen http://docs.ansible.com/ansible/unarchive_module.html#options

  • Ja, darüber habe ich nachgedacht – sorry, dass ich meinen vorletzten Absatz nicht etwas klarer gemacht habe, aber darauf bezog ich mich. Das Problem bei diesem Ansatz ist, wie ich es sehe, wenn ich stoße wordpress-https.3.3.6.zip zu wordpress-https.3.3.7.zip Aufgrund einer neuen Version wird die Aufgabe behaupten, bei einer vorhandenen Installation erfolgreich gewesen zu sein, obwohl sie in Wirklichkeit nichts bewirkt hat.

    – Halber

    5. Juni 2016 um 21:15 Uhr

  • Eine andere Möglichkeit, dies zu tun, besteht darin, einen temporären Ordner zum Zusammenstellen der App zu verwenden und alles in der Datei zu löschen plugins Mappe. Alle diese Aufgaben könnten als markiert werden changed_when: Falseund dann habe ich synchronize sie an ihren Platz, was eine geänderte/unveränderte Ausgabe erzeugt.

    – Halber

    5. Juni 2016 um 21:18 Uhr


  • Ah, nein, das wird auch nicht funktionieren – Ordner-Zeitstempel wieder ändern! Bah… Also danke für den obigen Vorschlag, aber hast du noch weitere Ideen? :-)

    – Halber

    5. Juni 2016 um 21:19 Uhr


halfers Benutzer-Avatar
halber

Meine Lösung besteht darin, das Prüfsummenskript zu ändern und es zu einem dauerhaften Merkmal des Ansible-Prozesses zu machen. Es fühlt sich ein bisschen hackig an, meine eigene Prüfsumme zu erstellen, wenn Ansible es für mich tun sollte, aber es funktioniert.

Neue Antworten, die erklären, dass ich etwas falsch mache, oder dass eine neue Version von Ansible das Problem behebt, wären sehr willkommen.

Wenn ich einen Moment Zeit habe, werde ich dies als möglichen Fehler beim Ansible-Team melden. Allerdings wundere ich mich manchmal über das Aufwand-Ertrags-Verhältnis, wenn ich Fehler auf einem ausgelasteten Tracker melde – ich habe bereits einen ausstehenden Gegenstand, der schon eine Weile gewartet hat, und ich habe mich entschieden, auch das zu umgehen.

Update (18 Monate später)

Dieses Ansible-Build-System hat es nie ins Leben gerufen. Es fühlte sich an, als würde ich immer um etwas herum arbeiten. Als ich mich kürzlich entschied, meinen Blog auf einen anderen Server zu verschieben, habe ich ihn endlich angedockt. Das hat mehrere Wochen gedauert (da es bei einer echten WordPress-Installation überraschend viele Dinge zu beachten gibt), aber im Allgemeinen fand ich den Prozess viel schöner als die Verwendung von Orchestrierungstools.

1397310cookie-checkKann Ansible unarchive dazu gebracht werden, Änderungszeiten für statische Ordner zu schreiben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy