web-dev-qa-db-fra.com

Ansible meilleure pratique pour copier des répertoires

Dans mon cahier j'ai 

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

Ce qui soulève l'avertissement dans 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

Cela soulève donc la question: existe-t-il une meilleure façon de faire cela avec des modules ansibles plutôt qu'avec une commande?

19
Austin Pray

Actuellement, command est votre meilleure option. Il n'y a pas d'option de télécommande à distance. Voici un fil à ce sujet: Comment déplacer/renommer un fichier en utilisant une tâche Ansible sur un système distant

Vous avez deux autres options:

  • vous pouvez utiliser le module file pour créer un lien symbolique (en définissant src, path et state=link.
  • vous pouvez consulter le référentiel sur le serveur Ansible, puis utiliser copy. C'est un modèle plus courant de déploiement de code.
  • vous pouvez continuer à utiliser command mais l'envelopper avec une condition stat afin qu'il ne soit écrasé qu'une seule fois. Ceci est particulièrement utile si vous utilisez notify pour redémarrer nginx.

Enfin, il semble que vous fassiez un "deploy by git". Ce n'est pas toujours le meilleur choix, surtout si vous ne possédez pas ce dépôt. Mais ça pourrait aller, juste un peu d'odeur de code.

7
tedder42

Vous pouvez utiliser le module synchronize avec 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/"

Remarque: pour copier de distance à distance, utilisez la même commande et ajoutez delegate_to (en tant que source distante) et le inventory_Host en cours (en tant que destination distante).

16
ant31

Ansible 2.0 apporte le paramètre remote_src au module copy: http://docs.ansible.com/ansible/copy_module.html

Maintenant, il vous suffit de faire quelque chose comme:

- 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

Une autre méthode consiste à compresser votre dossier avant et à utiliser le module unarchive ansible:

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

Cela décompressera votre dossier sur votre destination afin que vous ayez une copie du dossier ;-) Mais n'oubliez pas de disposer de unzip package sur votre machine cible.

RHEL: 

miam installer unzip -y


Debian: 

apt installer unzip

5
Hassan Boutougha
  • copie: src = {{item}} dest =/etc/fooapp/mode_répertoire = yes

champ utilisateur directory_mode. 

0
Vijay Samanthapuri

Vous pouvez utiliser with_fileglob: 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