wake-up-neo.com

Wie kann ich überprüfen, ob die Datei in ansible heruntergeladen wurde

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.

23
user1994660

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
30
DomaNitro

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
50
pfalcon

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
16
iGEL

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
8
Ben Whaley

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.

4
Rico

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
4
czerasz

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

0
Tom Carchrae

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
0
Felipe