2015-03-04 9 views
18

Ich arbeite in einem Projekt, und wir verwenden Ansible, um eine Bereitstellung eines Clusters von Servern zu erstellen. Eine der Aufgaben, die ich implementieren muss, ist das Kopieren einer lokalen Datei auf den Remote-Host, nur wenn diese Datei lokal existiert. Jetzt versuche ich, dieses Problem zu lösen mit diesemKopieren Sie lokale Datei, wenn vorhanden, mit Ansible

- hosts: 127.0.0.1 
    connection: local 
    tasks: 
    - name: copy local filetocopy.zip to remote if exists 
    - shell: if [[ -f "../filetocopy.zip" ]]; then /bin/true; else /bin/false; fi; 
     register: result  
    - copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip 
     when: result|success 

Bu dies mit der folgenden Meldung fehlschlägt: ERROR: ‚action‘ oder ‚local_action‘ Attribut in Aufgabe „kopieren lokale filetocopy.zip zu entfernten fehlt Wenn existiert "

Ich habe versucht, dies zu erstellen, wenn mit Befehlsaufgabe. Ich habe bereits versucht, diese Aufgabe mit einer local_action zu erstellen, aber ich konnte es nicht funktionieren lassen. Alle Samples, die ich gefunden habe, betrachten eine Shell nicht als local_action, es gibt nur Beispiele von Befehlen, und keiner von ihnen hat etwas anderes als einen Befehl. Gibt es eine Möglichkeit, diese Aufgabe mit Ansible zu erledigen?

Antwort

17

Ändern Sie den ersten Schritt in den folgenden auf

- name: copy local filetocopy.zip to remote if exists 
    local_action: stat path="../filetocopy.zip" 
    register: result  
+0

Hallo @ sandra-parsick, danke für die Antwort, dies noch mit versagt fehlgeschlagen: [52.11.12.29 -> 127,0 .0.1] => {"failed": true, "parsed": false} [sudo über ansible, key =] passwort: – dirceusemighini

+0

es scheint, es mag kein sudo. Wie nennst du das Playbook? –

+0

Das Standardmuster hierfür ist das [stat-Modul] (http://docs.ansible.com/stat_module.html), das die Notwendigkeit einer Shell/eines Befehls vermeidet. – tedder42

20

weiß, dass ich diese Frage schon beantwortet wurde, aber ich stolperte heute Morgen auf dem gleichen Problem und dachte, dass ich eine umfassendere Antwort für die Zukunft hinterlassen könnte.

Wenn Sie die Existenz einer lokalen Datei wollen überprüfen, bevor eine Aufgabe ausführt, hier ist die umfassende Schnipsel:

- name: get file stat to be able to perform a check in the following task 
    local_action: stat path=/path/to/file 
    register: file 

- name: copy file if it exists 
    copy: src=/path/to/file dest=/destination/path 
    when: file.stat.exists 

EDIT: Wenn Sie die Existenz einer Remote Datei will prüfen (wie Ich habe), das ist der Weg zu gehen:

- name: get file stat to be able to perform check in the following task 
    stat: path=/path/to/file 
    register: file 

- name: copy file if it exists 
    copy: src=/path/to/file dest=/destination/path 
    when: file.stat.exists 
-1

Wie wäre es damit?

tasks: 
- copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip 
    failed_when: false 

Dies wird die Datei auf das Ziel kopieren, wenn es lokal existiert. Wenn es nicht existiert, tut es einfach nichts, da der Fehler ignoriert wird.

+0

Ist das ein Kommentar oder eine Antwort? –

+0

Eine Antwort, ich fügte eine Erklärung hinzu. –

+0

Interessant, ich hatte keine Zeit, es zu testen, aber scheint großartig – dirceusemighini

2

Fileglob ermöglicht eine Suche nach einer eventuell vorhandenen Datei.

- name: copy file if it exists 
    copy: src="{{ item }}" dest=/destination/path 
    with_fileglob: "/path/to/file" 
2

Wenn Sie nicht einrichten zwei Aufgaben gewohnt, könnten Sie is_file wenn lokale Dateien überprüfen vorhanden:

tasks: 
- copy: src=/a/b/filetocopy.zip dest=/tmp/filetocopy.zip 
    when: '/a/b/filetocopy.zip' | is_file 

Der Weg zum Textbuch-Verzeichnis relativ ist, so die Magie Die Variable role_path wird empfohlen, wenn Sie auf Dateien innerhalb des Rollenverzeichnisses verweisen.

Ref: http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths

Verwandte Themen