复制目录的Ansible最佳实践

时间:2014-08-29 22:05:05

标签: 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 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模块而不是命令?

6 个答案:

答案 0 :(得分:16)

您可以将synchronize modulemode='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模块制作符号链接(通过设置srcpathstate=link
  • 您可以在Ansible服务器上查看回购,然后使用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)

  • copy:src = {{item}} dest = / etc / fooapp / directory_mode = yes

用户directory_mode字段。