如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/shell任务,也不想将文件从本地系统复制到远程系统。


当前回答

从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:关键字,你可以把你所有的文件复制到一个临时文件夹开始,然后在你想要的地方解包。

从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支持递归复制。

- 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命令,所以它在每个主机上运行一次,移动文件,然后不再运行。

当我需要在几百台主机上移动一个文件或目录时,我会使用这种方法,其中许多主机可能在任何给定时间都处于关机状态。它是幂等的,可以安全地放在剧本里。

Bruce并没有试图统计目的地以检查是否移动已经在那里的文件;在尝试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

实现这一点的另一种方法是使用带状态的文件:很难。

这是我要做的一个例子:

- 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)。