2015-03-04 16 views
18

Pracuję w projekcie, a używamy ansible, aby utworzyć wdrożenie klastra serwerów. Jednym z zadań, które muszę wdrożyć, jest skopiowanie lokalnego pliku do zdalnego hosta, tylko jeśli ten plik istnieje lokalnie. Teraz staram się rozwiązać ten problem za pomocą tegoSkopiuj plik lokalny, jeśli istnieje, używając 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 to się niepowodzeniem z następującym komunikatem: błąd: „działanie” lub „local_action” atrybut brakuje w zadaniu „skopiować lokalną filetocopy.zip do zdalnego Jeśli istnieje "

Próbowałem utworzyć to, jeśli z zadania polecenia. Próbowałem już stworzyć to zadanie z lokalnym zaangażowaniem, ale nie mogłem go uruchomić. Wszystkie próbki, które znalazłem, nie biorą udziału w powłoce lokalnej, są tylko próbki poleceń i żadne z nich nie ma niczego innego niż polecenie. Czy istnieje sposób na wykonanie tego zadania za pomocą ansibla?

Odpowiedz

17

Zmień swój pierwszy krok w następstwie na

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

Hi @ sandra-parsick, dzięki za odpowiedź, to nadal nie z failed: [52.11.12.29 -> 127,0 .0.1] => {"failed": true, "parsowany": false} [sudo via ansible, key =] password: – dirceusemighini

+0

wygląda na to, że nie lubi sudo. Jak dzwonisz do "playbooka"? –

+0

standardowym wzorcem jest moduł [stat module] (http://docs.ansible.com/stat_module.html), który eliminuje konieczność użycia powłoki/polecenia. – tedder42

20

Wiem, że to pytanie już odpowiedział, ale natknąłem się na tym samym numerze rano i pomyślałem, że mogę umieścić bardziej kompleksową odpowiedź na przyszłość.

Jeśli chcesz sprawdzić istnienie lokalnego pliku przed wykonaniem jakiegoś zadania, tutaj jest kompleksowa urywek:

- 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: jeśli chcesz sprawdzić istnienie zdalnego pliku (jako Zrobiłem), to jest droga:

- 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

Co powiesz na to?

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

Spowoduje to skopiowanie pliku do celu, jeśli istnieje lokalnie. Jeśli nie istnieje, po prostu nie robi nic, ponieważ błąd jest ignorowany.

+0

Czy to jest komentarz czy odpowiedź? –

+0

Odpowiedź, dodałem wyjaśnienie. –

+0

Interesujące, nie miałem czasu, aby przetestować to, ale wydaje się być świetnym – dirceusemighini

2

Fileglob umożliwia wyszukiwanie pliku docelowego.

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

Jeśli nie przyzwyczajenie skonfigurować dwa zadania, można użyć is_file aby sprawdzić, czy pliki lokalne istnieje:

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

ścieżka jest względna do katalogu PlayBook, więc za pomocą magii zmienna rola ścieżka jest zalecana, jeśli odwołujesz się do plików znajdujących się w katalogu ról.

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

Powiązane problemy