Ich lade die Datei mit wget
von ansible herunter.
- name: Download Solr
Shell: chdir={{project_root}}/solr wget http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip
ich möchte das aber nur, wenn die Zip-Datei an diesem Ort nicht vorhanden ist. Derzeit lädt das System es jedes Mal herunter.
Sofern Sie keinen Grund haben, wget
zu verwenden, sollten Sie das get_url
-Modul nicht verwenden. Es wird geprüft, ob die Datei heruntergeladen werden muss.
---
- hosts : all
gather_facts : no
tasks:
- get_url:
url="http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip"
dest="{{project_root}}/solr-4.7.0.Zip"
HINWEIS: Wenn Sie das Verzeichnis und nicht den vollständigen Pfad in die Variable dest
eingeben, wird die Datei zwar immer noch in ein temporäres Verzeichnis heruntergeladen, Sie müssen jedoch eine MD5-Prüfung durchführen, um zu entscheiden, ob Sie in das Zielverzeichnis kopieren möchten.
Und wenn Sie den Download-Status speichern möchten, können Sie Folgendes verwenden:
---
- hosts : all
gather_facts : no
tasks:
- get_url:
url="http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip"
dest="{{project_root}}/solr-4.7.0.Zip"
register: get_solr
- debug:
msg="solr was downloaded"
when: get_solr|changed
Hinweis: Diese Antwort bezieht sich auf die allgemeine Frage "Wie kann ich das Vorhandensein einer Datei in Ansible prüfen", nicht jedoch einen speziellen Fall des Herunterladens von Dateien.
Die Probleme mit den vorherigen Antworten, die "Befehls" - oder "Shell" -Aktionen verwenden, sind, dass sie im --check-Modus nicht funktionieren. Tatsächlich wird die erste Aktion übersprungen, und die nächste wird bei der Bedingung "Wenn: solr_exists.rc! = 0" (aufgrund nicht definierter Variablen) ausgegeben.
Seit Ansible 1.3 gibt es eine direktere Möglichkeit, das Vorhandensein von Dateien zu überprüfen - mit dem "stat" -Modul. Natürlich funktioniert es auch als "local_action", um das Vorhandensein einer lokalen Datei zu überprüfen:
- local_action: stat path={{secrets_dir}}/secrets.yml
register: secrets_exist
- fail: msg="Production credentials not found"
when: secrets_exist.stat.exists == False
Viele Module kennen das Ergebnis bereits und werden übersprungen, wenn es bereits vorhanden ist, wie file
oder geturl
. Andere Variablen wie command
haben die Option creates
, die diesen Befehl überspringt, wenn diese Datei bereits vorhanden ist (oder nicht vorhanden ist, wenn Sie die Option removes
verwenden).
Sie sollten also zunächst die verfügbaren Module prüfen, ob sie bereits schlau genug sind. Wenn nicht: Ich empfehle das Modul stats
. Vorteil gegenüber der anderen Lösung: Keine "roten Fehler, sondern ignoriert" in der Ausgabe.
- name: Check MySQL data directory existence
stat: path=/var/lib/mysql-slave
register: mysql_slave_data_dir
- name: Stop MySQL master to copy data directory
service: name=mysql state=stopped
Sudo: yes
when: not mysql_slave_data_dir.stat.exists
Hier gibt es mindestens zwei Möglichkeiten.
Sie können eine Variable registrieren, wenn die Datei vorhanden ist. Dann verwenden Sie eine if-Bedingung , um den Befehl unter der Bedingung auszuführen, dass die Datei noch nicht vorhanden ist:
- command: /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.Zip
register: solr_Zip
ignore_errors: True
- name: Download Solr
Shell: chdir={{project_root}}/solr /usr/bin/wget http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip
when: solr_Zip|failed
Sie können auch das Modul -Befehle mit der Option creates
verwenden:
- name: Download Solr
command: /usr/bin/wget http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip chdir={{project_root}}/solr creates={{project_root}}/solr/solr-4.7.0.Zip
Sie können diese Überprüfung also grundsätzlich durchführen, indem Sie eine Variable aus einem Befehl registrieren und deren Rückkehrcode überprüfen. (Sie können dies auch tun, indem Sie dessen Standard prüfen.)
- name: playbook
hosts: all
user: <your-user>
vars:
project_root: /usr/local
tasks:
- name: Check if the solr Zip exists.
command: /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.Zip
ignore_errors: True
register: solr_exists
- name: Download Solr
Shell: chdir={{project_root}}/solr wget http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip
when: solr_exists.rc != 0
Dies besagt im Wesentlichen, dass der Befehl /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.Zip
ausgeführt wird, wenn der Befehl Download Solr
einen Code zurückgibt, der nicht 0 ist.
Ich hoffe es hilft.
Dieser Artikel könnte nützlich sein
Daraus ergibt sich dieses Beispiel:
tasks:
- Shell: if [[ -f "/etc/monitrc" ]]; then /bin/true; else /bin/false; fi
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
mein Favorit ist, die Datei nur herunterzuladen, wenn sie neuer ist als die lokale Datei (was auch beinhaltet, wenn die lokale Datei nicht existiert).
die -N
-Option mit wget führt Folgendes aus: https://www.gnu.org/software/wget/manual/html_node/Time_002dStamping-Usage.html .
leider glaube ich nicht, dass get_url
ein gleichwertiges Feature enthält.
also eine sehr kleine änderung:
- name: Download Solr
Shell: chdir={{project_root}}/solr wget -N http://<SNIPPED>/solr-4.7.0.Zip
Verwenden Sie das Argument creates
- name: Download Solr
Shell: creates={{working_directory}}/solr/solr-4.7.0.Zip chdir={{working_directory}}/solr wget http://mirror.mel.bkb.net.au/pub/Apache/lucene/solr/4.7.0/solr-4.7.0.Zip