Possible: copier le contenu d'un répertoire dans un autre répertoire

j'essaie de copier le contenu de dist directory dans Nginx directory.

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 quand j'exécute le playbook il lance une erreur:

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 qui copie un répertoire? Comment puis-je copier un répertoire contenu dans un autre répertoire et un fichier?

de l'aide? Merci

24
demandé sur ahus1 2016-02-18 20:30:12

9 réponses

vous pouvez utiliser le module synchroniser . L'exemple tiré de la documentation:

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

Ceci a l'avantage supplémentaire qu'il sera plus efficace pour le grand/beaucoup de fichiers.

21
répondu Aidan Feldman 2017-08-28 04:55:02

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

copie les deux articles dans l'autre répertoire. Dans l'exemple, l'un des éléments est un annuaire et l'autre ne l'est pas. Il fonctionne parfaitement.

17
répondu Asier Gomez 2018-01-02 17:42:38

Ansible Copy module par défaut copie des fichiers / dirs de la machine de contrôle à la machine distante. Si vous voulez copier des fichiers/dirs dans une machine distante et si vous avez Ansible 2.0 , mettez remote_src à yes

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
13
répondu helloV 2016-02-18 18:47:06

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 ce qui suit:

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

Cela résout @ surfer190 question de suivi:

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

* est un shell glob, en ce qu'il s'appuie sur votre shell pour énumérer tous les fichiers du dossier avant en cours d'exécution cp , tandis que le . demande directement cp d'obtenir le contenu du répertoire (voir https://askubuntu.com/questions/86822/how-can-i-copy-the-contents-of-a-folder-to-another-folder-in-a-different-directo )

6
répondu fractalic 2017-11-20 04:05:58

Ansible remote_src ne supporte pas la copie récursive.Voir remote_src description dans Ansible copie docs

pour recursivement copier le contenu d'un dossier et s'assurer que la tâche reste idempotent je le fais habituellement 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 find apparaît toujours comme 'changed '

3
répondu dvanrensburg 2016-08-16 14:01:53

j'ai trouvé une solution de contournement pour la copie récursive à distance:

- 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
répondu agrimal 2018-02-23 01:11:26

j'ai été impliqué toute une journée, aussi! et finalement trouvé la solution dans shell commande au lieu de copie: 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 }}'

strictement avis: 1. src_path et des_path se terminent par le symbole / 2. dans l'interpréteur de commandes src_path se termine par . qui montre tout le contenu du répertoire 3. J'ai utilisé mon nom de serveur distant à la fois dans hosts: et execute shell section de jenkins, au lieu du spécificateur remote_src: dans le playbook.

je suppose que c'est un bon conseil d'exécuter sous la commande Execute Shell section dans jenkins:

ansible-playbook  copy-payment.yml -i remote-server-name
1
répondu foad322 2018-05-24 08:20:10

ci-dessous travaillé 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
répondu Sakharam Thorat 2017-09-25 12:27:56

J'ai trouvé une solution idéale pour copier des fichiers d'un serveur possible à distance.

de la copie de 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
répondu Prateek patel 2017-12-07 09:22:41