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
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.
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.
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
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 )
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"
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
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
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
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 }}"