Jak można przenieść / zmienić nazwę pliku / katalogu za pomocą modułu Ansible w systemie zdalnym? Nie chcę używać zadań polecenia / powłoki i nie chcę kopiować pliku z systemu lokalnego do systemu zdalnego.
Jak można przenieść / zmienić nazwę pliku / katalogu za pomocą modułu Ansible w systemie zdalnym? Nie chcę używać zadań polecenia / powłoki i nie chcę kopiować pliku z systemu lokalnego do systemu zdalnego.
Odpowiedzi:
Moduł plików nie kopiuje plików w systemie zdalnym. Parametr src jest używany tylko przez moduł pliku podczas tworzenia dowiązania symbolicznego do pliku.
Jeśli chcesz przenieść / zmienić nazwę pliku w całości na zdalnym systemie, najlepiej jest użyć modułu poleceń, aby po prostu wywołać odpowiednie polecenie:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
Jeśli chcesz się spodobać, możesz najpierw użyć modułu statystyk, aby sprawdzić, czy foo faktycznie istnieje:
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
removes
opcji command
modułu ( tutaj udokumentowane )? Wygląda na to, że ta opcja sprawi, że najpierw sprawdzimy Ansible.
removes: /path/to/foo
i creates: /path/to/bar
. @Fonant już wspomniał o tym jako komentarz do innej odpowiedzi, ale ponieważ jest to zaakceptowana, chcę to jeszcze raz podkreślić.
Od wersji 2.0 w module kopiowania można użyć remote_src
parametru.
Jeśli True
przejdzie do zdalnego / docelowego komputera dla src.
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
Jeśli chcesz przenieść plik, musisz usunąć stary plik za pomocą modułu plików
- name: Remove old files foo
file: path=/path/to/foo state=absent
Od wersji 2.8 moduł kopiowania remote_src
obsługuje kopiowanie rekurencyjne.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Uważam, że opcja create w module poleceń jest przydatna. Co powiesz na to:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Kiedyś stosowałem podejście z dwoma zadaniami, używając statystyk, jak sugeruje Bruce P. Teraz robię to jako jedno zadanie z tworzeniem. Myślę, że jest to o wiele wyraźniejsze.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Inną opcją, która działała dla mnie dobrze, jest użycie modułu synchronizacji . Następnie usuń oryginalny katalog za pomocą modułu plików.
Oto przykład z dokumentów:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
jest dostępne przez SSH, nawet jeśli katalog znajduje się na tym samym komputerze.
Innym sposobem na osiągnięcie tego jest użycie file
z state: hard
.
Oto przykład, który mam do pracy:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
Testowany tylko na localhost (OSX), ale powinien również działać na Linuksie. Nie mogę powiedzieć dla Windows.
Pamiętaj, że potrzebne są ścieżki bezwzględne. W przeciwnym razie nie pozwoli mi to utworzyć linku. Nie można także krzyżować systemów plików, więc praca z dowolnym zamontowanym nośnikiem może się nie powieść.
Hardlink jest bardzo podobny do przenoszenia, jeśli później usuniesz plik źródłowy:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
Kolejną korzyścią jest to, że zmiany są utrzymywane, gdy jesteś w trakcie gry. Jeśli więc ktoś zmieni źródło, każda zmiana zostanie odzwierciedlona w pliku docelowym.
Możesz sprawdzić liczbę linków do pliku poprzez ls -l
. Liczba twardych dowiązań jest pokazana obok trybu (np. Rwxr-xr-x 2, gdy plik ma 2 dowiązania).
Bruce nie próbował statystykować miejsca docelowego, aby sprawdzić, czy przenieść plik, jeśli już tam był; upewniał się, że plik, który ma zostać przeniesiony, faktycznie istniał przed próbą wykonania mv.
Jeśli twoim zainteresowaniem, podobnie jak Toma, jest przeniesienie się tylko wtedy, gdy plik jeszcze nie istnieje, myślę, że nadal powinniśmy zintegrować czek Bruce'a z miksem:
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
Oto jak działam dla mnie:
Tasks:
- name: checking if the file 1 exists
stat:
path: /path/to/foo abc.xts
register: stat_result
- name: moving file 1
command: mv /path/to/foo abc.xts /tmp
when: stat_result.stat.exists == True
powyższy podręcznik sprawdzi, czy plik abc.xts istnieje przed przeniesieniem pliku do folderu tmp.
when: stat_result.stat.exists == True
. Samo używanie when: stat_result.stat.exists
jest wystarczająco dobre.
== True
ponieważ zawsze coś robię, gdy nie można znaleźć pliku lub == False
.
stat
exists
właściwości modułu zwraca boolean
wartość. Tak więc, jeśli wstawisz when: stat_result.stat.exists
, spełni warunek, jeśli plik jest obecny, który jest identyczny, when: stat_result.stat.exists == True
ale zawiera więcej tekstów i niepotrzebne sprawdzenie warunkowe.
Może się to wydawać przesadą, ale jeśli chcesz uniknąć używania modułu poleceń (co robię, ponieważ użycie polecenia nie jest idempotentne), możesz użyć kombinacji kopiowania i archiwizacji.
Możesz to zrobić przez -
Za pomocą polecenia Ad Hoc
ansible all -m command -a" mv /path/to/foo /path/to/bar"
Lub Ty, jeśli chcesz to zrobić, korzystając z poradnika
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
Wiem, że to stary LATOWY temat, ale denerwowałem się i stworzyłem dla siebie rolę, aby robić to dokładnie na dowolnej liście plików. Rozszerz według własnego uznania:
main.yml
- name: created destination directory
file:
path: /path/to/directory
state: directory
mode: '0750'
- include_tasks: move.yml
loop:
- file1
- file2
- file3
move.yml
- name: stat the file
stat:
path: {{ item }}
register: my_file
- name: hard link the file into directory
file:
src: /original/path/to/{{ item }}
dest: /path/to/directory/{{ item }}
state: hard
when: my_file.stat.exists
- name: Delete the original file
file:
path: /original/path/to/{{ item }}
state: absent
when: my_file.stat.exists
Pamiętaj, że twarde linkowanie jest lepsze niż kopiowanie tutaj, ponieważ z natury zachowuje własność i uprawnienia (oprócz tego, że nie zajmuje więcej miejsca na dysku dla drugiej kopii pliku).