如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/shell任务,也不想将文件从本地系统复制到远程系统。
当前回答
我知道这是一个多年前的话题,但我感到沮丧,并为自己构建了一个角色,对任意文件列表执行此操作。扩展到你认为合适的范围:
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: Move the src file to dest
command: mv /path/to/src /path/to/dest
args:
removes: /path/to/src
creates: /path/to/dest
只有当/path/to/src存在而/path/to/dest不存在时,才会运行mv命令,所以它在每个主机上运行一次,移动文件,然后不再运行。
当我需要在几百台主机上移动一个文件或目录时,我会使用这种方法,其中许多主机可能在任何给定时间都处于关机状态。它是幂等的,可以安全地放在剧本里。
这看起来有点过分,但是如果你想避免使用命令模块(我就是这样做的,因为它使用的命令不是幂等的),你可以结合使用copy和unarchive。
使用tar来归档您需要的文件。如果你提前想想,这其实是有道理的。您可能希望在给定目录中有一系列文件。创建包含所有文件的目录,并将它们归档到tar文件中。 使用unarchive模块。当你这样做的时候,随着destination:和remote_src:关键字,你可以把你所有的文件复制到一个临时文件夹开始,然后在你想要的地方解包。
文件模块不复制远程系统上的文件。src参数仅供文件模块在创建到文件的符号链接时使用。
如果你想完全在远程系统上移动/重命名一个文件,那么最好的方法是使用命令模块调用适当的命令:
- 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
实现这一点的另一种方法是使用带状态的文件:很难。
这是我要做的一个例子:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
虽然只在本地主机(OSX)上测试,但也应该在Linux上工作。我看不出是Windows。
注意,绝对路径是必需的。否则它不会让我创建链接。此外,您不能跨文件系统,因此使用任何已安装的媒体都可能失败。
硬链接非常类似于移动,如果你之后删除源文件:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
另一个好处是,当你在玩的时候,改变是持续的。因此,如果有人更改了源文件,任何更改都会反映在目标文件中。
您可以通过ls -l验证到文件的链接数量。硬链接的数量显示在模式旁边(例如,当一个文件有2个链接时,rwxr-xr- x2)。
你可以通过
使用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
推荐文章
- 不能与文件列表一起使用forEach
- python方式检查文件是否存在?
- BAT文件执行后保持CMD打开
- 从包含文件名的路径获取不包含文件名的完整路径
- Git:从另一个分支复制目录中的所有文件
- PHP,获取没有文件扩展名的文件名
- 如何在远程系统上使用Ansible任务移动/重命名文件
- 从java.io.File获取java.nio.file.Path对象
- 用c#编写数据到CSV文件
- 安卓系统;检查文件是否存在而不创建新的文件
- 如何改变。net WebClient对象的超时时间
- 我如何可以删除在VIM所有文本从当前行文件结束?
- 如何比较二进制文件,以检查他们是否相同?
- 如何使用open with语句打开文件
- Xcode:在项目构建中出现“文件xxx.png从工作副本中丢失”的问题