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