Ansible复制目录的最佳实践

Ansible复制目录的最佳实践,ansible,ansible-playbook,Ansible,Ansible Playbook,在我的剧本里我有 - name: Grab h5bp/server-configs-nginx git: repo=https://github.com/h5bp/server-configs-nginx.git dest=/tmp/server-configs-nginx version="3db5d61f81d7229d12b89e0355629249a49ee4ac" force=yes - name: Copy over h5bp

在我的剧本里我有

- name: Grab h5bp/server-configs-nginx
  git:  repo=https://github.com/h5bp/server-configs-nginx.git
        dest=/tmp/server-configs-nginx
        version="3db5d61f81d7229d12b89e0355629249a49ee4ac"
        force=yes

- name: Copy over h5bp configuration
  command: cp -r /tmp/server-configs-nginx/{{ item }} /etc/nginx/{{ item }}
  with_items:
    - "mime.types"
    - "h5bp/"
这会在ansible lint中引发警告:

[ANSIBLE0006] cp used in place of copy module
/Users/austinpray/Dropbox/DEV/opensauce/bedrock-ansible/roles/nginx/tasks/main.yml:0
Task/Handler: Copy over h5bp configuration

因此,这就提出了一个问题:有没有更好的方法用ansible模块而不是命令来实现这一点呢?

目前,
命令是最好的选择。没有远程到远程选项。这里有一条关于它的线索:

您还有几个其他选择:

  • 您可以使用
    文件
    模块创建符号链接(通过设置
    src
    路径
    状态=链接
  • 您可以在Ansible服务器上签出repo,然后使用
    copy
  • 您可以继续使用
    命令
    ,但可以使用
    stat
    条件将其包装起来,这样它只会覆盖一次。如果您使用
    notify
    重新启动nginx,这一点尤其有用

最后,看起来您可能正在执行“按git部署”。这并不总是最佳选择,尤其是如果您没有“拥有”该repo。但这可能很好-只是有一点代码味道。

您可以使用with
mode='pull'

- name: Copy over h5bp configuration
 synchronize: mode=pull src=/tmp/server-configs-nginx/{{ item }} dest=/etc/nginx/{{ item }} 
 with_items:
   - "mime.types"
   - "h5bp/"

注意:要将远程复制到远程,请使用相同的命令并添加
委派到
(作为远程源)和当前的
资源清册主机
(作为远程目的地)

另一种方法是先压缩文件夹,然后使用
不归档的ansible
模块:

- name: copy your folder using a work around
  unarchive: src=your.zip dest=/destinationfolder
  become: yes
这将解压目标上的文件夹,以便获得文件夹副本;-) 但是不要忘记在目标机器上解压

莱尔:

yum安装解压-y


Debian:

apt安装解压


Ansible 2.0将
remote_src
参数带到
copy
模块:

现在,您只需执行以下操作:

- name: Copy over h5bp configuration
  copy: src=/tmp/server-configs-nginx/{{ item }} dest=/etc/nginx/{{ item }} remote_src=yes
  with_items:
    - "mime.types"
    - "h5bp"

您可以与_fileglob一起使用:

  • 复制:src={{item}}dest=/etc/fooapp/directory\u mode=yes

用户目录\u模式字段

“最后,看起来您可能正在执行‘按git部署’。”下面是上下文。这只是设置服务器的一小部分。我基本上只是从社区维护的远程repo中获取一些有用的服务器配置。最终放弃ansible lint Hahawawith_fileglob只搜索本地文件,问题是将文件从远程复制到远程,所以这个答案是无用的。这个答案在这种情况下确实不正确。但对我来说,这正是我所需要的。谢谢你的发帖:)!Mmmh,fileglob是非递归的。远程复制(将Remote_src参数设置为“true”的复制模块)不支持目录的递归复制,问题是关于复制目录的,因此此答案是正确的useless@AlanEvangelista嗯,你说得对,太糟糕了。我认为这个答案仍然有用,因为它仍然可以列出所有文件。在ansible 2.2中,使用这个答案中描述的同步模块,或者使用问题中描述的带“cp”的命令模块,是从远程复制目录到远程的唯一方法。这听起来很有希望,但我无法理解您的“注意事项:”。你能举一个完整的例子来做远程到远程文件的深度复制吗?我正在尝试将NFS共享中的web根目录复制到池中每个web服务器的本地磁盘上。从/nfs/www到/var/www。请提供更多解释
# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
  with_fileglob:
    - /playbooks/files/fooapp/*