webentwicklung-frage-antwort-db.com.de

Ansible Best Practice zum Kopieren von Vergleichen

In meinem Spielbuch habe ich 

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

Was wirft die Warnung in Ansible-Fusseln:

[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

Das wirft also die Frage auf: Gibt es einen besseren Weg, dies mit anpassbaren Modulen zu tun, als mit einem Befehl?

19
Austin Pray

Derzeit ist command die beste Option. Es gibt keine Remote-zu-Remote-Option. Hier ist ein Thread darüber: So verschieben/benennen Sie eine Datei mithilfe einer Ansible-Task auf einem Remote-System um

Sie haben ein paar andere Möglichkeiten:

  • sie können das Modul file verwenden, um einen Symlink zu erstellen (indem Sie src, path und state=link setzen.
  • sie könnten das Repo auf dem Ansible-Server auschecken und dann copy verwenden. Dies ist ein allgemeineres Modell für die Bereitstellung von Code.
  • sie können command weiterhin verwenden, sie jedoch mit einer stat-Bedingung umschließen, sodass sie nur einmal überschrieben wird. Dies ist besonders hilfreich, wenn Sie Nginx mit notify neu starten.

Schließlich sieht es so aus, als würden Sie ein "deploy by git" durchführen. Das ist nicht immer die beste Wahl, vor allem, wenn Sie dieses Repo nicht "besitzen". Aber es könnte gut sein - nur ein bisschen Code-Geruch.

7
tedder42

Sie können das Modul synchronize mit mode='pull' verwenden.

- name: Copy over h5bp configuration
 synchronize: mode=pull src=/tmp/server-configs-nginx/{{ item }} dest=/etc/nginx/{{ item }} 
 with_items:
   - "mime.types"
   - "h5bp/"

Note: Verwenden Sie zum Kopieren von Remote zu Remote den gleichen Befehl und fügen Sie delegate_to (als Remote-Quelle) und den aktuellen inventory_Host (als Remote-Ziel) hinzu

16
ant31

Ansible 2.0 bringt den remote_src-Parameter in das copy-Modul: http://docs.ansible.com/ansible/copy_module.html

Jetzt musst du nur noch 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"
7
PriceChild

Eine andere Möglichkeit ist, den Ordner vorher zu komprimieren und das unarchive ansible-Modul zu verwenden:

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

Dadurch wird der Ordner an Ihrem Zielordner entpackt, sodass Sie über eine Ordnerkopie verfügen; -) Vergessen Sie jedoch nicht, das Paket unzip auf dem Zielcomputer zu haben.

RHEL: 

yum install unzip -y


Debian: 

apt install entpacken

5
  • copy: src = {{item}} dest =/etc/fooapp/verzeichnismodus = ja

feld "user directory_mode" 

0

Sie könnten 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/*
0
user3773243