在我的剧本中我有
- 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模块而不是命令?
答案 0 :(得分:16)
您可以将synchronize
module与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/"
注意:要复制远程到远程,请使用相同的命令并添加delegate_to
(作为远程源)和当前inventory_host
(作为远程目标)
答案 1 :(得分:7)
目前,command
是您的最佳选择。没有远程到远程选项。以下是关于它的主题:How to move/rename a file using an Ansible task on a remote system
您还有其他几个选择:
file
模块制作符号链接(通过设置src
,path
和state=link
。copy
。这是部署代码的更常见模型。command
,但用stat
条件包装它,这样它只会覆盖一次。如果您使用notify
重新启动nginx,这将特别有用。最后,看起来你可能正在“通过git进行部署”。这并不总是最好的选择,尤其是如果你不“拥有”那个回购。但它可能很好 - 只是一些代码味道。
答案 2 :(得分:7)
Ansible 2.0将remote_src
参数带到copy
模块:http://docs.ansible.com/ansible/copy_module.html
现在你只需要做一些事情:
- name: Copy over h5bp configuration
copy: src=/tmp/server-configs-nginx/{{ item }} dest=/etc/nginx/{{ item }} remote_src=yes
with_items:
- "mime.types"
- "h5bp"
答案 3 :(得分:5)
另一种方法是先将文件夹压缩并使用numrows
模块:
unarchive ansible
这将解压缩目的地上的文件夹,以便您拥有文件夹副本;-) 但不要忘记在目标计算机上安装解压缩包。
RHEL:
yum install unzip -y
Debian:
apt install unzip
答案 4 :(得分:0)
您可以使用with_fileglob:crashes
# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
with_fileglob:
- /playbooks/files/fooapp/*
答案 5 :(得分:0)
用户directory_mode字段。