如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/ shell任务,也不想将文件从本地系统复制到远程系统。
如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/ shell任务,也不想将文件从本地系统复制到远程系统。
Answers:
文件模块不会在远程系统上复制文件。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
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.8版开始, 复制模块 remote_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
我曾经像Bruce P建议的那样使用统计量执行2任务方法。现在,我将创建作为一项任务来完成。我认为这要清楚得多。
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
实现这一目标的另一种方法是使用file
与state: 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
。硬链接的数量显示在该模式旁边(例如,当文件具有2个链接时,rwxr-xr-x 2)。
这是我为我工作的方式:
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
上面的剧本,在将文件移到tmp文件夹之前,将检查文件abc.xts是否存在。
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
但包含更多文本和不必要的条件检查。
我知道这是YEARS的旧话题,但是我很沮丧,并且为自己建立了一个角色,可以对任意文件列表执行此操作。视需要扩展:
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
请注意,硬链接优于此处的复制,因为硬链接固有地保留了所有权和权限(除了不占用更多磁盘空间用于文件的第二个副本外)。