web-dev-qa-db-fra.com

Ansible: copier un contenu de répertoire dans un autre répertoire

J'essaie de copier le contenu du répertoire dist dans le répertoire nginx.

J'écris le suivant:

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes

Mais lorsque j'exécute le livre de lecture, une erreur est générée:

TASK [NGINX : copy html file] **************************************************
fatal: [172.16.8.200]: FAILED! => {"changed": false, "failed": true, "msg": "attempted to take checksum of directory:/home/vagrant/dist/"}

Il y a un bug lors de la copie d'un répertoire? Comment copier un contenu de répertoire contenant un autre répertoire et un fichier?

Toute aide? Merci

24
Asier Gomez

Réponse résolue: Pour copier le contenu d'un répertoire dans un autre répertoire, j'utilise le suivant:

- name: copy consul_ui files
  command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html
  with_items:
   - "index.html"
   - "static/"

Il copie les deux éléments dans l'autre répertoire. Dans l'exemple, l'un des éléments est un répertoire et l'autre non. Ça fonctionne parfaitement.

20
Asier Gomez

Vous pouvez utiliser le module synchronize . L'exemple de la documentation:

# Synchronize two directories on one remote Host.
- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
  delegate_to: "{{ inventory_hostname }}"

Cela a l'avantage supplémentaire d'être plus efficace pour les fichiers volumineux/nombreux.

26
Aidan Feldman

Ansible Copy module copie par défaut les fichiers/répertoires de la machine de contrôle vers la machine distante. Si vous voulez copier des fichiers/répertoires sur une machine distante et que vous avez Ansible 2.0, définissez remote_src sur yes

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
12
helloV

La solution la plus simple que j'ai trouvée pour copier le contenu d'un dossier sans copier le dossier lui-même est d'utiliser les éléments suivants:

- name: Move directory contents
  command: cp -r /<source_path>/. /<dest_path>/

Ceci résout la question de suivi de @ surfer190 :

Hmmm si vous voulez copier le contenu entier? J'ai remarqué que * ne fonctionne pas - surfer190 23 juillet 2016 à 7:29

* est un glob Shell, en ce sens qu'il repose sur votre shell pour énumérer tous les fichiers du dossier before exécutant cp, tandis que . indique directement à cp de récupérer le contenu du répertoire (voir https: // askubuntu. com/questions/86822/comment-puis-je-copier-le-contenu-d'un-dossier-vers-un-dossier-différent-dans-un-répertoire-différent )

5
fractalic

Ansible remote_src ne prend pas en charge la copie récursive. Voir Description de remote_src dans la documentation Ansible

Pour copier récursivement le contenu d'un dossier et s'assurer que la tâche reste idempotente, je le fais généralement de cette façon:

- name: get file names to copy
  command: "find /home/vagrant/dist -type f"
  register: files_to_copy

- name: copy files
  copy:
    src: "{{ item }}" 
    dest: "/usr/share/nginx/html"
    owner: nginx
    group: nginx
    remote_src: True
    mode: 0644
  with_items:
   - "{{ files_to_copy.stdout_lines }}"

L'inconvénient est que la commande de recherche apparaît toujours comme "modifiée"

3
dvanrensburg

Je me suis impliqué toute une journée, aussi! et a finalement trouvé la solution dans la commande Shell au lieu de copier: ou commande: comme ci-dessous:

- hosts: remote-server-name
  gather_facts: no
  vars:
    src_path: "/path/to/source/"
    des_path: "/path/to/dest/"
  tasks:
  - name: Ansible copy files remote to remote
    Shell: 'cp -r {{ src_path }}/. {{ des_path }}'

avis strictement à: 1. src_path et des_path se terminent par le symbole / 2. Dans la commande shell src_path se termine par . qui affiche tout le contenu du répertoire 3. J'ai utilisé mon nom-serveur-distant les deux dans les hôtes: et exécuter Shell section de jenkins, au lieu du spécificateur remote_src: dans playbook.

Je suppose que c’est un bon conseil d’exécuter sous la commande dans la section Exécuter Shell dans Jenkins:

ansible-playbook  copy-payment.yml -i remote-server-name
2
foad322

J'ai trouvé une solution de contournement pour la copie récursive de distante en distante:

- name: List files in /usr/share/easy-rsa
  find:
    path: /usr/share/easy-rsa
    recurse: yes
    file_type: any
  register: find_result

- name: Create the directories
  file:
    path: "{{ item.path | regex_replace('/usr/share/easy-rsa','/etc/easy-rsa') }}"
    state: directory
    mode: "{{ item.mode }}"
  with_items:
    - "{{ find_result.files }}"
  when:
    - item.isdir

- name: Copy the files
  copy:
    src: "{{ item.path }}"
    dest: "{{ item.path | regex_replace('/usr/share/easy-rsa','/etc/easy-rsa') }}"
    remote_src: yes
    mode: "{{ item.mode }}"
  with_items:
    - "{{ find_result.files }}"
  when:
    - item.isdir == False
1
agrimal

Ci-dessous a fonctionné pour moi,

-name: Upload html app directory to Deployment Host
 copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes
0
Sakharam Thorat

J'ai trouvé cette solution idéale pour copier un fichier d'un serveur Ansible vers un ordinateur distant.

copie du fichier yaml

- hosts: localhost
  user: {{ user }}
  connection: ssh
  become: yes
  gather_facts: no
  tasks:
   - name: Creation of directory on remote server
     file:
       path: /var/lib/jenkins/.aws
       state: directory
       mode: 0755
     register: result
   - debug: 
       var: result

   - name: get file names to copy
     command: "find conf/.aws -type f"
     register: files_to_copy

   - name: copy files
     copy:
      src: "{{ item }}" 
      dest: "/var/lib/jenkins/.aws"
      owner: {{ user }}
      group: {{ group }}
      remote_src: True
      mode: 0644
     with_items:
      - "{{ files_to_copy.stdout_lines }}"
0
Prateek patel