เป็นไปได้อย่างไรที่จะย้าย / เปลี่ยนชื่อไฟล์ / ไดเรกทอรีโดยใช้โมดูล 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 แม้ว่าไดเรกทอรีจะอยู่ในเครื่องเดียวกัน
                    วิธีการที่จะบรรลุเป้าหมายนี้ก็คือการใช้กับfilestate: 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แทน