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