2014-08-29 9 views
16

In meinem Textbuch Iansible Best-Practice-Verzeichnisse zu kopieren

- 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/" 

haben, die die Warnung in ansible-lint aufwirft:

[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 

So stellt sich die Frage: Gibt es eine bessere Art und Weise zu tun Dies mit Ansible-Modulen und nicht mit einem Befehl?

Antwort

6

Derzeit ist command Ihre beste Option. Es gibt keine Remote-zu-Remote-Option. Hier ist ein Thread zu ihm: How to move/rename a file using an Ansible task on a remote system

Sie haben ein paar andere Optionen:

  • Sie das file Modul nutzen könnten, um einen Symlink zu machen (indem src, path und state=link
  • Sie könnten überprüfen. Aus dem Repo auf dem Ansible-Server und verwenden Sie dann copy. Dies ist ein häufigeres Modell für die Bereitstellung von Code.
  • können Sie weiter verwenden command aber wickeln Sie es mit einer stat bedingten so ich t überschreibt nur einmal. Dies ist besonders hilfreich, wenn Sie notify verwenden, um nginx neu zu starten.

Schließlich sieht es so aus, als ob Sie eine "Bereitstellung durch Git" durchführen würden. Das ist nicht immer die beste Wahl, insbesondere, wenn Sie dieses Repo nicht "besitzen". Aber es könnte gut sein - nur ein bisschen Code riechen.

+0

"Endlich sieht es so aus, als würden Sie einen 'deploy by git' ausführen." Hier ist der Kontext. Dies ist nur ein kleiner Teil der Einrichtung des Servers. Ich greife im Grunde nur einige nützliche Server-Konfigurationen aus einem Remote-Repository, das von der Community verwaltet wird. https://github.com/roots/bedrock-ansible/issues/31 –

+0

endete nur Graben Ansible-Lint haha ​​ –

14

Sie können den synchronize module mit 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/" 

Hinweis: Remote-to-remote kopieren, verwenden Sie den gleichen Befehl und fügen Sie delegate_to (als Remote-Quelle) und Strom inventory_host (als Remote-dest)

+0

In ansible 2.2, mit synchronize-Modul wie in dieser Antwort beschrieben oder mit Befehl Modul mit 'cp' wie beschrieben in der Frage sind die einzigen Möglichkeiten, Verzeichnisse von Remote zu Remote zu kopieren. –

+1

Das hört sich vielversprechend an, aber ich kann Ihre "Note:" nicht verstehen. Können Sie ein vollständiges Beispiel für die Durchführung tiefer Kopien von Remote-zu-Remote-Dateien veröffentlichen? Ich versuche, ein Webstammverzeichnis von einer NFS-Freigabe auf die lokale Festplatte jedes Webservers in einem Pool zu kopieren. Sagen Sie von/nfs/www nach/var/www. – Idris

5

Ein anderer Weg ist Ihre Ordner vor und verwenden Sie das unarchive ansible Modul zip:

- name: copy your folder using a work around 
    unarchive: src=your.zip dest=/destinationfolder 
    become: yes 

Dies wird entpacken Sie Ihren Ordner auf Ihrem Ziel, so dass Sie einen Ordner kopieren haben ;-) aber vergessen Sie nicht entpacken Paket auf Ihrem Zielrechner.

RHEL:

yum install unzip -y


Debian:

apt installieren unzip

6

ansible 2.0 bringt den remote_src Parameter an die copy Modul: http://docs.ansible.com/ansible/copy_module.html

Jetzt müssen Sie nur noch wie etwas tun:

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

Fernkopie (Kopiemodul mit remote_src Parameter auf 'true' gesetzt) ​​unterstützt keine rekursive Kopie des Verzeichnisses und die Frage geht über das Kopieren von Verzeichnissen, so dass diese Antwort nutzlos ist –

+0

@AlanEvangelista hmm du hast recht, bah das ist scheiße. Ich denke, die Antwort ist immer noch nützlich, da es immer noch möglich ist, alle Dateien aufzulisten. – PriceChild

0

Sie with_fileglob verwenden: http://docs.ansible.com/ansible/playbooks_loops.html#id4

# copy each file over that matches the given pattern 
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600 
    with_fileglob: 
    - /playbooks/files/fooapp/* 
+1

with_fileglob nur lokale Dateien durchsucht, ist die Frage über das Kopieren von Dateien von Remote zu Remote, so dass diese Antwort nutzlos ist –

+2

Diese Antwort ist in der Tat falsch für diesen Kontext. Aber für mich war das genau das, was ich brauchte. Danke fürs Schreiben :)! – onnimonni

+0

Mmmh, Dateiglob ist nicht rekursiv. – musicformellons

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

Benutzer Verzeichnis Verzeichnis_Modus.

+1

bitte erläutern Sie mehr –