เป็นไปได้อย่างไรที่จะย้าย / เปลี่ยนชื่อไฟล์ / ไดเรกทอรีโดยใช้โมดูล Ansible บนระบบระยะไกล? ฉันไม่ต้องการใช้งานคำสั่ง / เชลล์และฉันไม่ต้องการคัดลอกไฟล์จากระบบโลคัลไปยังระบบรีโมต
เป็นไปได้อย่างไรที่จะย้าย / เปลี่ยนชื่อไฟล์ / ไดเรกทอรีโดยใช้โมดูล Ansible บนระบบระยะไกล? ฉันไม่ต้องการใช้งานคำสั่ง / เชลล์และฉันไม่ต้องการคัดลอกไฟล์จากระบบโลคัลไปยังระบบรีโมต
คำตอบ:
โมดูลไฟล์ไม่ได้คัดลอกไฟล์ในระบบระยะไกล พารามิเตอร์ src ถูกใช้โดยโมดูลไฟล์เมื่อสร้าง symlink ไปยังไฟล์เท่านั้น
หากคุณต้องการย้าย / เปลี่ยนชื่อไฟล์ทั้งหมดในระบบรีโมตทางออกที่ดีที่สุดคือการใช้โมดูลคำสั่งเพื่อเรียกใช้คำสั่งที่เหมาะสม:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
หากคุณต้องการจินตนาการก่อนอื่นคุณสามารถใช้โมดูล stat เพื่อตรวจสอบว่า foo มีอยู่จริง:
- 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
ตัวเลือกในcommand
โมดูล (เอกสารที่นี่ )? ดูเหมือนว่าตัวเลือกนั้นจะทำการตรวจสอบ Ansible ก่อน
removes: /path/to/foo
creates: /path/to/bar
@Fonant พูดถึงสิ่งนี้เป็นความคิดเห็นในคำตอบอื่นแล้ว แต่เนื่องจากนี่เป็นคำตอบที่ยอมรับได้ฉันต้องการชี้ให้เห็นอีกครั้ง
จากเวอร์ชัน 2.0ในโมดูลคัดลอกคุณสามารถใช้remote_src
พารามิเตอร์
ถ้าTrue
มันจะไปที่เครื่องรีโมต / เป้าหมายสำหรับ src
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
หากคุณต้องการย้ายไฟล์คุณต้องลบไฟล์เก่าด้วยโมดูลไฟล์
- name: Remove old files foo
file: path=/path/to/foo state=absent
จาก โมดูลการคัดลอก เวอร์ชัน 2.8remote_src
รองรับการคัดลอกซ้ำ
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
ฉันได้พบตัวเลือกการสร้างในโมดูลคำสั่งที่มีประโยชน์ เกี่ยวกับสิ่งนี้:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
ฉันเคยทำ 2 วิธีการทำงานโดยใช้สถิติเช่น Bruce P แนะนำ ตอนนี้ฉันทำสิ่งนี้เป็นงานเดียวกับสร้าง ฉันคิดว่านี่ชัดเจนกว่ามาก
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
ตัวเลือกที่มีการทำงานได้ดีสำหรับฉันก็คือการใช้โมดูลประสาน จากนั้นลบไดเรกทอรีเดิมโดยใช้โมดูลไฟล์
นี่คือตัวอย่างจากเอกสาร:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
เข้าถึงผ่าน SSH แม้ว่าไดเรกทอรีจะอยู่ในเครื่องเดียวกัน
วิธีการที่จะบรรลุเป้าหมายนี้ก็คือการใช้กับfile
state: hard
นี่คือตัวอย่างที่ฉันต้องทำงาน:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
ทดสอบบน localhost (OSX) เท่านั้น แต่ควรใช้กับ Linux ด้วย ฉันบอก Windows ไม่ได้
โปรดทราบว่าจำเป็นต้องใช้พา ธ สัมบูรณ์ อย่างอื่นมันจะไม่ให้ฉันสร้างลิงค์ นอกจากนี้คุณไม่สามารถข้ามระบบไฟล์ดังนั้นการทำงานกับสื่อที่เมาท์อาจล้มเหลว
ฮาร์ดลิงก์นั้นคล้ายกับการย้ายหากคุณลบไฟล์ต้นฉบับในภายหลัง:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
ประโยชน์อีกอย่างคือการเปลี่ยนแปลงจะยังคงอยู่เมื่อคุณอยู่ในระหว่างการเล่น ดังนั้นหากมีคนเปลี่ยนแปลงแหล่งที่มาการเปลี่ยนแปลงใด ๆ จะปรากฏในไฟล์เป้าหมาย
ls -l
คุณสามารถตรวจสอบจำนวนการเชื่อมโยงไปยังไฟล์ผ่านทาง จำนวนฮาร์ดลิงก์จะปรากฏถัดจากโหมด (เช่น rwxr-xr-x 2 เมื่อไฟล์มี 2 ลิงก์)
บรูซไม่ได้พยายามจัดทำปลายทางเพื่อตรวจสอบว่าจะย้ายไฟล์หรือไม่หากมีอยู่แล้ว เขาทำให้แน่ใจว่าไฟล์ที่จะย้ายมีอยู่จริงก่อนที่จะพยายาม mv
หากความสนใจของคุณเช่น Tom's คือการย้ายเฉพาะในกรณีที่ไฟล์นั้นไม่มีอยู่ฉันคิดว่าเราควรจะรวมการตรวจสอบของ Bruce เข้ากับส่วนผสม:
- 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
นี่คือวิธีที่ฉันทำให้มันทำงานได้สำหรับฉัน:
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 ด้านบนจะตรวจสอบว่ามีไฟล์ abc.xts อยู่ก่อนที่จะย้ายไฟล์ไปยังโฟลเดอร์ tmp หรือไม่
when: stat_result.stat.exists == True
ไม่จำเป็นต้องใช้ แค่ใช้when: stat_result.stat.exists
ก็ดีพอ
== True
== False
stat
exists
คุณสมบัติโมดูลจะส่งคืนboolean
ค่า ดังนั้นถ้าคุณใส่when: stat_result.stat.exists
ที่จะตอบสนองเงื่อนไขหากไฟล์ที่มีซึ่งเหมือนกันwhen: stat_result.stat.exists == True
แต่มีข้อความเพิ่มเติมและการตรวจสอบเงื่อนไขที่ไม่จำเป็น
สิ่งนี้อาจดูเหมือน overkill แต่ถ้าคุณต้องการหลีกเลี่ยงการใช้โมดูลคำสั่ง (ที่ฉันทำเพราะการใช้คำสั่งไม่ใช่ idempotent) คุณสามารถใช้การรวมกันของการคัดลอกและไม่เก็บถาวร
คุณสามารถทำได้โดย -
การใช้คำสั่ง Ad Hoc
ansible all -m command -a" mv /path/to/foo /path/to/bar"
หรือคุณถ้าคุณต้องการที่จะทำมันโดยใช้ playbook
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
ฉันรู้ว่ามันเป็นหัวข้อเก่าอายุหลายปีแต่ฉันรู้สึกหงุดหงิดและสร้างบทบาทให้กับตัวเองเพื่อทำสิ่งนี้เพื่อดูรายการไฟล์โดยพลการ ยืดออกตามที่เห็นสมควร
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
โปรดทราบว่าการลิงก์ฮาร์ดไดรฟ์นั้นดีกว่าในการคัดลอกที่นี่เนื่องจากเป็นการรักษาความเป็นเจ้าของและการอนุญาตโดยธรรมชาติ (นอกเหนือจากการไม่ใช้พื้นที่ดิสก์เพิ่มเติมสำหรับสำเนาไฟล์ที่สอง)
บน Windows:
- name: Move old folder to backup
win_command: "cmd.exe /c move /Y {{ sourcePath }} {{ destinationFolderPath }}"
ในการเปลี่ยนชื่อใช้คำสั่งrenameหรือrenแทน