复制目录的Ansible最佳实践

Aus*_*ray 19 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/"
Run Code Online (Sandbox Code Playgroud)

这引发了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
Run Code Online (Sandbox Code Playgroud)

所以这提出了一个问题:有没有更好的方法来使用ansible模块而不是命令?

ant*_*t31 16

您可以使用该synchronize模块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/"
Run Code Online (Sandbox Code Playgroud)

注意:要复制远程到远程,请使用相同的命令并添加delegate_to(作为远程源)和当前inventory_host(作为远程dest)


ted*_*r42 8

目前,command是您最好的选择.没有远程到远程选项.这是一个关于它的线程:如何使用远程系统上的Ansible任务移动/重命名文件

您还有其他几种选择:

  • 您可以使用file模块做一个符号链接(通过设置src,pathstate=link.
  • 你可以在Ansible服务器上查看repo然后使用copy.这是部署代码的更常见模型.
  • 你可以继续使用command但是用stat条件包装它所以它只会覆盖一次.如果您使用notify重新启动nginx,这将特别有用.

最后,看起来你可能正在"通过git进行部署".这并不总是最好的选择,特别是如果你不"拥有"那个回购.但它可能很好 - 只是一些代码味道.


Pri*_*cey 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"
Run Code Online (Sandbox Code Playgroud)

  • 远程复制(将remote_src参数设置为'true'的复制模块)不支持目录的递归复制,问题是关于复制目录,所以这个答案是无用的 (2认同)

Has*_*gha 5

另一种方法是先将文件夹压缩并使用该unarchive ansible模块:

- name: copy your folder using a work around
  unarchive: src=your.zip dest=/destinationfolder
  become: yes
Run Code Online (Sandbox Code Playgroud)

这将解压缩您目的地上的文件夹,以便您拥有文件夹副本;-)但不要忘记在目标计算机上安装解压缩包.

RHEL:

yum install unzip -y


Debian:

apt install unzip