如何使用远程系统上的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个链接时)。

这可能看起来像是矫枉过正,但如果你想避免使用命令模块(我这样做,因为它使用的命令不是幂等的),你可以使用复制和取消归档的组合。

  1. 使用tar来归档您将需要的文件。 如果你以前想,这实际上是有道理的。 您可能需要一个给定目录中的一系列文件。 用所有文件创build该目录,并将它们存档在焦油中。
  2. 使用unarchive模块。 当你这样做的时候,以及目标:和remote_src:关键字,你可以将所有的文件复制到一个临时文件夹中,然后将它们准确地解压到你想要的位置。

对我来说运行良好的另一个选项是使用同步模块 。 然后使用文件模块删除原始目录。

下面是一个文档示例: - synchronize: src: /first/absolute/path dest: /second/absolute/path archive: yes delegate_to: "{{ inventory_hostname }}"