Ansible递归目录复制

时间:2017-08-02 01:04:18

标签: ansible

Ansible版本:2.2.1.0

我在Ansible中将目录内容复制到目标主机时遇到问题。我的角色目录结构如下所示:

roles/server/
├── defaults
│   └── main.yml
├── files
│   ├── Common-x86_64.repo
│   ├── docker-ce-stable.repo
|
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   ├── main.yml
│   └── packages.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

在files目录中有很多(大约12个)repos,为了保持简短,我省略了很多。我在packages.yml

中运行此代码
- name: 1. Setup Repos
     file:
       src: files/
       dest: /etc/yum.repos.d/
       owner: root
       group: root
       mode: 0644

即使任务完成且没有错误,也没有任何内容复制到目标计算机上的/etc/yum.repos.d/

ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Media.repo    CentOS-fasttrack.repo
CentOS-CR.repo         CentOS-Sources.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo

我在文档页面上看到,使用/结束源目录会导致内容被递归复制。我做错了什么?

3 个答案:

答案 0 :(得分:2)

file module 用于复制文件,但用于设置目标文件的属性。

copy module用于复制。

答案 1 :(得分:1)

为接受的答案提供一些其他信息。

使用目录路径的递归副本具有以下缺点:

  • 您无法获取每个复制文件的更改状态信息
  • 因此val--check标志不会显示任何内容
  • 您不能在递归中包括/排除特定的文件/目录
  • 在批量复制之后执行更正更改将永远不会产生--check --diff状态,并且还可能影响远程主机上已经存在的文件。

似乎有一种更强大的方法来执行递归复制,即结合使用changed=0with_filetree

when

答案 2 :(得分:1)

源文件和目录可以存储在 files 目录中。如果您将它们放在其他文件夹中,则可能找不到。

复制文件:

copy:
  src: src_filename 
  dest: to_be_parent/src_filename

结果为 to_be_parent/src_filename。目标文件名可能等于也可能不等于 src 文件名。

复制目录:

copy:
  src: mydirectory
  dest: to_be_parent

结果为to_be_parent/mydirectory

copy:
  src: mydirectory/
  dest: to_be_parent

结果为to_be_parent/contents_of_mydirectory

在以下情况下不是那么理想的结果:

copy:
  src: mydirectory
  dest: to_be_parent/mydirectory

结果为to_be_parent/mydirectory/mydirectory/contents_of_mydirectory