如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/shell任务,也不想将文件从本地系统复制到远程系统。
当前回答
你可以通过
使用Ad Hoc命令
ansible all -m command -a" mv /path/to/foo /path/to/bar"
或者你,如果你想用剧本的话
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
其他回答
另一个对我来说很有效的选项是使用同步模块。然后使用file模块删除原始目录。
下面是文档中的一个例子:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
这看起来有点过分,但是如果你想避免使用命令模块(我就是这样做的,因为它使用的命令不是幂等的),你可以结合使用copy和unarchive。
使用tar来归档您需要的文件。如果你提前想想,这其实是有道理的。您可能希望在给定目录中有一系列文件。创建包含所有文件的目录,并将它们归档到tar文件中。 使用unarchive模块。当你这样做的时候,随着destination:和remote_src:关键字,你可以把你所有的文件复制到一个临时文件夹开始,然后在你想要的地方解包。
我知道这是一个多年前的话题,但我感到沮丧,并为自己构建了一个角色,对任意文件列表执行此操作。扩展到你认为合适的范围:
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
注意,此处硬链接比复制更可取,因为它固有地保留了所有权和权限(此外,不会为文件的第二个副本消耗更多的磁盘空间)。
- name: Example
hosts: localhost
become: yes
tasks:
- name: checking if a file exists
stat:
path: "/projects/challenge/simplefile.txt"
register: file_data
- name: move the file if file exists
copy:
src: /projects/challenge/simplefile.txt
dest: /home/user/test
when: file_data.stat.exists
- name: report a missing file
debug:
msg: "the file or directory doesn't exist"
when: not file_data.stat.exists
从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.8版开始复制模块remote_src支持递归复制。