Uzaktaki bir sistemdeki Ansible modülünü kullanarak bir dosyayı / dizini taşımak / yeniden adlandırmak nasıl mümkün olur? Komut / kabuk görevlerini kullanmak istemiyorum ve dosyayı yerel sistemden uzak sisteme kopyalamak istemiyorum.
Uzaktaki bir sistemdeki Ansible modülünü kullanarak bir dosyayı / dizini taşımak / yeniden adlandırmak nasıl mümkün olur? Komut / kabuk görevlerini kullanmak istemiyorum ve dosyayı yerel sistemden uzak sisteme kopyalamak istemiyorum.
Yanıtlar:
Dosya modülü uzaktaki sisteme dosya kopyalamaz. Src parametresi, dosya modülü tarafından bir dosyaya sembolik bağlantı oluştururken kullanılır.
Bir dosyayı tamamen uzaktaki bir sistemde taşımak / yeniden adlandırmak istiyorsanız, en iyi seçeneğiniz komut modülünü kullanarak sadece uygun komutu çağırmaktır:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
Eğer fantezi almak istiyorsanız önce foo'nun gerçekten var olup olmadığını kontrol etmek için stat modülünü kullanabilirsiniz:
- 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
seçeneği command
modüle ( burada belgelenmiştir ) kullanmamanın bir nedeni var mı? Görünüşe göre bu seçenek Ansible'ı kontrol ettirecek.
removes: /path/to/foo
ve creates: /path/to/bar
. @Fonant bunu başka bir cevaba yorum olarak zaten belirtti, ancak bu kabul edilen cevap olduğu için tekrar belirtmek istiyorum.
Sürüm 2.0'dan , kopya modülünderemote_src
parametre kullanabilirsiniz .
Eğer True
o src uzaktan / hedef makineye gidecek.
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
Dosyayı taşımak istiyorsanız, dosya modülüyle eski dosyayı silmeniz gerekir
- name: Remove old files foo
file: path=/path/to/foo state=absent
2.8 sürümünden itibaren kopya modülü remote_src
özyinelemeli kopyalamayı destekler.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Komut modülünde oluştur seçeneği yararlı buldum. Buna ne dersin:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Bruce P'nin önerdiği gibi stat kullanarak 2 görev yaklaşımı yapardım. Şimdi bunu tek bir görev olarak yapıyorum. Bence bu çok daha net.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Benim için iyi çalışan bir başka seçenek de senkronizasyon modülünü kullanmaktır . Daha sonra dosya modülünü kullanarak orijinal dizini kaldırın.
İşte dokümanlardan bir örnek:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
dizin aynı makinede olsa bile SSH üzerinden erişilir.
Bunu başarmak için başka bir yol kullanıyor file
ile state: hard
.
Bu benim çalışmam gereken bir örnek:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
Sadece localhost (OSX) üzerinde test edildi, ancak Linux üzerinde de çalışmalı. Windows için söyleyemem.
Mutlak yolların gerekli olduğunu unutmayın. Yoksa bağlantıyı oluşturmama izin vermedi. Ayrıca dosya sistemlerini geçemezsiniz, bu nedenle bağlı herhangi bir ortamla çalışmak başarısız olabilir.
Kaynak dosyayı daha sonra kaldırırsanız, sabit bağlantı taşınmaya çok benzer:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
Bir diğer avantaj ise, oyunun ortasındayken değişikliklerin devam etmesidir. Birisi kaynağı değiştirirse, herhangi bir değişiklik hedef dosyaya yansıtılır.
Yoluyla bir dosyaya bağlantı sayısını doğrulayabilirsiniz ls -l
. Sabit bağlantı sayısı modun yanında gösterilir (örneğin, bir dosyada 2 bağlantı olduğunda rwxr-xr-x 2).
Bruce, dosya zaten oradaysa taşınsın mı taşınmayacağını kontrol etmek için hedefi belirlemeye çalışmıyordu; mv denemeden önce taşınacak dosyanın gerçekten var olduğundan emin oluyordu.
Tom'unki gibi ilgi alanınız yalnızca dosya zaten yoksa hareket etmekse, Bruce'un kontrolünü karışıma entegre etmemiz gerektiğini düşünüyorum:
- 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
Benim için çalışmasını sağladım:
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
Yukarıdaki oynatma kitabı, dosyayı tmp klasörüne taşımadan önce abc.xts dosyasının var olup olmadığını kontrol eder.
when: stat_result.stat.exists == True
. Sadece kullanmak when: stat_result.stat.exists
yeterince iyi.
== True
çünkü dosya bulunamadığı zaman bir şeyler yapıyorum çünkü == False
.
stat
göre exists
bir boolean
değer döndürür . Yani, sadece koyarsanız when: stat_result.stat.exists
dosya için de aynı olan when: stat_result.stat.exists == True
ancak daha fazla metin ve gereksiz koşullu kontrol ile durumu karşılar .
Bu aşırıya kaçmış gibi görünebilir, ancak komut modülünü kullanmaktan kaçınmak istiyorsanız (ki bunu yapmak, komut kullanmak idempotent olmadığı için) kopyala ve arşivden çıkarmayı kullanabilirsiniz.
Yapabilirsiniz -
Geçici Komutu Kullanma
ansible all -m command -a" mv /path/to/foo /path/to/bar"
Ya da playbook kullanarak yapmak istiyorsanız
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
Bu bir YIL eski konu olduğunu biliyorum , ama hayal kırıklığına uğradım ve keyfi bir dosya listesi için tam olarak bunu yapmak için bir rol inşa ettim. Uygun gördüğünüz şekilde genişletin:
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
Sabit bağlamanın burada kopyalamaya tercih edildiğine dikkat edin, çünkü mülkiyet ve izinleri doğal olarak korur (dosyanın ikinci bir kopyası için daha fazla disk alanı tüketmemeye ek olarak).