如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/shell任务,也不想将文件从本地系统复制到远程系统。
当前回答
- 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命令,所以它在每个主机上运行一次,移动文件,然后不再运行。
当我需要在几百台主机上移动一个文件或目录时,我会使用这种方法,其中许多主机可能在任何给定时间都处于关机状态。它是幂等的,可以安全地放在剧本里。
其他回答
这是我让它为我工作的方式:
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
上面的剧本,会检查是否文件abc。在将文件移动到TMP文件夹之前,XTS已经存在。
另一个对我来说很有效的选项是使用同步模块。然后使用file模块删除原始目录。
下面是文档中的一个例子:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
从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支持递归复制。
这看起来有点过分,但是如果你想避免使用命令模块(我就是这样做的,因为它使用的命令不是幂等的),你可以结合使用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
推荐文章
- 如何删除文件中的特定行?
- c++11返回值优化或移动?
- 使用Java重命名文件
- 如何从Python包内读取(静态)文件?
- 如何删除目录内的文件和文件夹?
- 为什么我得到“Pickle - EOFError: run out of input”读取一个空文件?
- 写字符串到文本文件,并确保它总是覆盖现有的内容。
- 从另一个文件导入变量?
- 寻找不属于特定用户的文件
- 如何复制文件跨计算机使用SSH和MAC OS X终端
- 如何在node.js中移动文件?
- 如何修改文本文件?
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- 移动一个文件到服务器上的另一个文件夹
- Python列表目录,子目录和文件