Bagaimana mungkin memindahkan / mengganti nama file / direktori menggunakan modul Ansible pada sistem jarak jauh? Saya tidak ingin menggunakan perintah / tugas shell dan saya tidak ingin menyalin file dari sistem lokal ke sistem jarak jauh.
Bagaimana mungkin memindahkan / mengganti nama file / direktori menggunakan modul Ansible pada sistem jarak jauh? Saya tidak ingin menggunakan perintah / tugas shell dan saya tidak ingin menyalin file dari sistem lokal ke sistem jarak jauh.
Jawaban:
Modul file tidak menyalin file di sistem jarak jauh. Parameter src hanya digunakan oleh modul file saat membuat symlink ke file.
Jika Anda ingin memindahkan / mengganti nama file seluruhnya pada sistem jarak jauh, maka cara terbaik Anda adalah menggunakan modul perintah untuk menjalankan perintah yang sesuai:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
Jika Anda ingin menjadi mewah maka Anda dapat menggunakan modul stat terlebih dahulu untuk memeriksa apakah foo benar-benar ada:
- 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
opsi ke command
modul (didokumentasikan di sini )? Tampaknya opsi itu akan membuat Ansible memeriksa terlebih dahulu.
removes: /path/to/foo
dan creates: /path/to/bar
. @Fonant sudah menyebut ini sebagai komentar pada jawaban lain, tetapi karena ini adalah yang diterima, saya ingin menunjukkannya lagi.
Dari versi 2.0 , dalam modul salin yang dapat Anda gunakanremote_src
parameter.
Jika True
itu akan pergi ke mesin remote / target untuk src.
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
Jika Anda ingin memindahkan file, Anda perlu menghapus file lama dengan modul file
- name: Remove old files foo
file: path=/path/to/foo state=absent
Dari versi 2.8 modul copy remote_src
mendukung penyalinan rekursif.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Saya telah menemukan opsi create dalam modul perintah berguna. Bagaimana dengan ini:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Saya biasa melakukan pendekatan 2 tugas menggunakan stat seperti yang disarankan Bruce P. Sekarang saya melakukan ini sebagai satu tugas dengan menciptakan. Saya pikir ini jauh lebih jelas.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Opsi lain yang telah bekerja dengan baik untuk saya adalah menggunakan modul sinkronisasi . Kemudian hapus direktori asli menggunakan modul file.
Berikut ini adalah contoh dari dokumen:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
diakses melalui SSH bahkan jika direktori berada di mesin yang sama.
Cara lain untuk mencapai ini adalah menggunakan file
dengan state: hard
.
Ini adalah contoh saya mulai bekerja:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
Hanya diuji pada localhost (OSX), tetapi harus bekerja di Linux juga. Saya tidak tahu untuk Windows.
Perhatikan bahwa jalur absolut diperlukan. Jika tidak, saya tidak akan membuat tautan. Anda juga tidak dapat melewati sistem file, jadi bekerja dengan media yang dipasang mungkin gagal.
Hardlink sangat mirip dengan memindahkan, jika Anda menghapus file sumber setelahnya:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
Manfaat lain adalah perubahan tetap ada saat Anda sedang bermain. Jadi, jika seseorang mengubah sumber, setiap perubahan tercermin dalam file target.
Anda dapat memverifikasi jumlah tautan ke suatu file melalui ls -l
. Jumlah hardlink ditampilkan di sebelah mode (misalnya rwxr-xr-x 2, ketika file memiliki 2 tautan).
Bruce tidak berusaha menentukan tujuan untuk memeriksa apakah akan memindahkan file jika sudah ada di sana; dia memastikan file yang akan dipindahkan benar-benar ada sebelum mencoba mv.
Jika minat Anda, seperti minat Tom, hanya memindahkan jika file tersebut belum ada, saya pikir kita harus mengintegrasikan cek Bruce ke dalam campuran:
- 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
Ini adalah cara saya membuatnya bekerja untuk saya:
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
playbook di atas, akan memeriksa apakah file abc.xts ada sebelum memindahkan file ke folder tmp.
when: stat_result.stat.exists == True
. Hanya menggunakan when: stat_result.stat.exists
cukup baik.
== True
karena saya selalu melakukan sesuatu ketika file tidak ditemukan atau == False
.
stat
exists
properti modul mengembalikan boolean
nilai. Jadi, jika Anda hanya menempatkan when: stat_result.stat.exists
itu akan memenuhi syarat jika file hadir yang juga identik when: stat_result.stat.exists == True
tetapi dengan lebih banyak teks dan pemeriksaan bersyarat yang tidak perlu.
Ini mungkin terlihat seperti berlebihan, tetapi jika Anda ingin menghindari menggunakan modul perintah (yang saya lakukan, karena menggunakan perintah tidak idempoten), Anda dapat menggunakan kombinasi dari salinan dan tidak mengarsipkan.
Anda dapat melakukannya dengan -
Menggunakan Perintah Ad Hoc
ansible all -m command -a" mv /path/to/foo /path/to/bar"
Atau Anda jika Anda ingin melakukannya dengan menggunakan playbook
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
Saya tahu ini adalah topik lama TAHUN , tetapi saya frustrasi dan membangun peran untuk diri saya sendiri untuk melakukan hal ini untuk daftar file yang sewenang-wenang. Perluas sesuai keinginan Anda:
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
Perhatikan bahwa tautan keras lebih disukai daripada menyalin di sini, karena itu secara inheren mempertahankan kepemilikan dan izin (selain tidak menggunakan lebih banyak ruang disk untuk salinan kedua file).