Làm thế nào có thể di chuyển / đổi tên tệp / thư mục bằng mô-đun Ansible trên hệ thống từ xa? Tôi không muốn sử dụng các tác vụ lệnh / shell và tôi không muốn sao chép tệp từ hệ thống cục bộ sang hệ thống từ xa.
Làm thế nào có thể di chuyển / đổi tên tệp / thư mục bằng mô-đun Ansible trên hệ thống từ xa? Tôi không muốn sử dụng các tác vụ lệnh / shell và tôi không muốn sao chép tệp từ hệ thống cục bộ sang hệ thống từ xa.
Câu trả lời:
Mô-đun tệp không sao chép tệp trên hệ thống từ xa. Tham số src chỉ được sử dụng bởi mô-đun tệp khi tạo liên kết tượng trưng đến tệp.
Nếu bạn muốn di chuyển / đổi tên tập tin hoàn toàn trên một hệ thống từ xa thì cách tốt nhất của bạn là sử dụng mô-đun lệnh để chỉ cần gọi lệnh thích hợp:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
Nếu bạn muốn có được sự ưa thích thì trước tiên bạn có thể sử dụng mô-đun stat để kiểm tra xem foo có thực sự tồn tại không:
- 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
tùy chọn cho command
mô-đun (tài liệu ở đây ) không? Có vẻ như tùy chọn đó sẽ làm cho Ansible kiểm tra trước.
removes: /path/to/foo
và creates: /path/to/bar
. @Fonant đã đề cập đến điều này như nhận xét về một câu trả lời khác, nhưng vì đây là câu trả lời được chấp nhận, tôi muốn chỉ ra nó một lần nữa.
Từ phiên bản 2.0 , trong mô-đun sao chép, bạn có thể sử dụng remote_src
tham số.
Nếu True
nó sẽ đi đến máy từ xa / đích cho src.
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
Nếu bạn muốn di chuyển tệp, bạn cần xóa tệp cũ bằng mô-đun tệp
- name: Remove old files foo
file: path=/path/to/foo state=absent
Từ mô-đun sao chép phiên bản 2.8remote_src
hỗ trợ sao chép đệ quy.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Tôi đã tìm thấy tùy chọn tạo trong mô-đun lệnh hữu ích. Còn cái này thì sao:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Tôi đã từng thực hiện một cách tiếp cận 2 nhiệm vụ bằng cách sử dụng stat như Bruce P gợi ý. Bây giờ tôi làm điều này như một nhiệm vụ với tạo. Tôi nghĩ rằng điều này là rõ ràng hơn nhiều.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Một tùy chọn khác hoạt động tốt với tôi là sử dụng mô-đun đồng bộ hóa . Sau đó loại bỏ thư mục gốc bằng cách sử dụng mô-đun tập tin.
Đây là một ví dụ từ các tài liệu:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
được truy cập thông qua SSH ngay cả khi thư mục nằm trên cùng một máy.
Một cách khác để đạt được điều này là sử dụng file
với state: hard
.
Đây là một ví dụ tôi có để làm việc:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
Chỉ được thử nghiệm trên localhost (OSX), nhưng cũng hoạt động trên Linux. Tôi không thể nói cho Windows.
Lưu ý rằng đường dẫn tuyệt đối là cần thiết. Khác nó sẽ không cho phép tôi tạo liên kết. Ngoài ra, bạn không thể vượt qua các hệ thống tập tin, vì vậy làm việc với bất kỳ phương tiện được gắn nào có thể thất bại.
Liên kết cứng rất giống với việc di chuyển, nếu bạn xóa tệp nguồn sau đó:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
Một lợi ích khác là những thay đổi được duy trì khi bạn đang ở giữa một vở kịch. Vì vậy, nếu ai đó thay đổi nguồn, mọi thay đổi sẽ được phản ánh trong tệp đích.
Bạn có thể xác minh số lượng liên kết đến một tập tin thông qua ls -l
. Số lượng liên kết cứng được hiển thị bên cạnh chế độ (ví dụ: rwxr-xr-x 2, khi một tệp có 2 liên kết).
Bruce đã không cố gắng thống kê điểm đến để kiểm tra xem có nên di chuyển tệp hay không nếu nó đã ở đó; ông đã chắc chắn rằng tập tin được di chuyển thực sự tồn tại trước khi thử mv.
Nếu sở thích của bạn, như của Tom, là chỉ di chuyển nếu tệp không tồn tại, tôi nghĩ chúng ta vẫn nên tích hợp kiểm tra của Bruce vào hỗn hợp:
- 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
Đây là cách tôi làm cho nó hoạt động với tôi:
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 ở trên, sẽ kiểm tra xem tập tin abc.xts có tồn tại hay không trước khi di chuyển tập tin vào thư mục tmp.
when: stat_result.stat.exists == True
. Chỉ cần sử dụng when: stat_result.stat.exists
là đủ tốt.
== True
vì tôi luôn làm gì đó khi không tìm thấy tệp hoặc == False
.
stat
mô-đun exists
trả về một boolean
giá trị. Vì vậy, nếu bạn chỉ đặt when: stat_result.stat.exists
điều đó sẽ thỏa mãn điều kiện nếu tệp có mặt giống hệt với when: stat_result.stat.exists == True
nhưng có nhiều văn bản hơn và kiểm tra điều kiện không cần thiết.
Điều này có vẻ như quá mức cần thiết, nhưng nếu bạn muốn tránh sử dụng mô-đun lệnh (mà tôi làm, bởi vì nó sử dụng lệnh không phải là idempotent), bạn có thể sử dụng kết hợp giữa sao chép và không lưu trữ.
Bạn có thể làm điều đó bằng cách -
Sử dụng lệnh Ad Hoc
ansible all -m command -a" mv /path/to/foo /path/to/bar"
Hoặc Bạn nếu bạn muốn làm điều đó bằng cách sử dụng playbook
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
Tôi biết đó là một chủ đề cũ NĂM , nhưng tôi đã nản lòng và xây dựng một vai trò cho chính mình để thực hiện chính xác điều này cho một danh sách các tệp tùy ý. Mở rộng khi bạn thấy phù hợp:
chính.yml
- name: created destination directory
file:
path: /path/to/directory
state: directory
mode: '0750'
- include_tasks: move.yml
loop:
- file1
- file2
- file3
di chuyển.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
Lưu ý rằng liên kết cứng tốt hơn là sao chép ở đây, vì nó vốn bảo toàn quyền sở hữu và quyền (ngoài việc không tiêu tốn thêm dung lượng đĩa cho bản sao thứ hai của tệp).
Trên Windows:
- name: Move old folder to backup
win_command: "cmd.exe /c move /Y {{ sourcePath }} {{ destinationFolderPath }}"
Để đổi tên sử dụng đổi tên hoặc ren lệnh thay vì