如何使用远程系统上的Ansible任务来移动/重命名文件
如何使用远程系统上的Ansible模块来移动/重命名文件/目录? 我不想使用命令/ shell任务,而且我不想将文件从本地系统复制到远程系统。
文件模块不会复制远程系统上的文件。 创build符号链接到文件时,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
从版本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
我发现命令模块中的创build选项很有用。 这个怎么样:
- name: Move foo to bar command: creates="path/to/bar" mv /path/to/foo /path/to/bar
我曾经用布鲁斯Pbuild议的方法来做一个2任务的方法。 现在我把这个作为一个任务来创build。 我认为这是更清晰的。
布鲁斯并没有试图确定是否移动文件的目的地,如果已经存在的话; 他正在确保在尝试mv之前移动文件实际存在。
如果你的兴趣像汤姆一样只是在文件不存在的情况下才会移动,那么我认为我们还是应该把布鲁斯的支票结合到一起:
- 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
这是我为我工作的方式:
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是否存在。
另一种实现这一点的方法是使用state: hard
file
。
这是我开始工作的一个例子:
- name: Link source file to another destination file: src: /path/to/source/file path: /target/path/of/file state: hard
虽然只在本地主机(OSX)上testing,但也应该在Linux上工作。 我不能告诉Windows。
请注意,绝对path是必需的。 否则它不会让我创build链接。 此外,您无法跨越文件系统,因此使用任何已安装的介质可能会失败。
硬链接与移动非常相似,如果之后删除源文件:
- name: Remove old file file: path: /path/to/source/file state: absent
另一个好处是,当你在剧中时,变化是持续的。 所以如果有人更改源,任何更改都会反映在目标文件中。
您可以通过ls -l
来validation文件链接的数量。 硬链接的数量显示在模式旁边(例如rwxr-xr-x 2,当文件有2个链接时)。
这可能看起来像是矫枉过正,但如果你想避免使用命令模块(我这样做,因为它使用的命令不是幂等的),你可以使用复制和取消归档的组合。
- 使用tar来归档您将需要的文件。 如果你以前想,这实际上是有道理的。 您可能需要一个给定目录中的一系列文件。 用所有文件创build该目录,并将它们存档在焦油中。
- 使用unarchive模块。 当你这样做的时候,以及目标:和remote_src:关键字,你可以将所有的文件复制到一个临时文件夹中,然后将它们准确地解压到你想要的位置。
对我来说运行良好的另一个选项是使用同步模块 。 然后使用文件模块删除原始目录。
下面是一个文档示例: - synchronize: src: /first/absolute/path dest: /second/absolute/path archive: yes delegate_to: "{{ inventory_hostname }}"