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。但这可能很好-只是有一点代码味道。您可以使用withmode='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/*