Ansible: копировать содержимое каталога в другой каталог
Я пытаюсь скопировать содержимое каталога dist в каталог nginx.
- name: copy html file
copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/
Но когда я запускаю пьесу, она выдает ошибку:
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/"}
Как мне скопировать каталог, в котором есть другой каталог и файл?
Ответы
Ответ 1
Решенный ответ:
Чтобы скопировать содержимое каталога в другой каталог, я использую следующее:
- name: copy consul_ui files
command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html
with_items:
- "index.html"
- "static/"
Он копирует оба элемента в другой каталог. В этом примере один из элементов - это каталог, а другой - нет. Он отлично работает.
Ответ 2
Вы можете использовать модуль synchronize. Пример из документации:
# Synchronize two directories on one remote host.
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
delegate_to: "{{ inventory_hostname }}"
Это дает дополнительное преимущество, которое будет более эффективным для большого/большого количества файлов.
Ответ 3
Модуль Ansible Copy по умолчанию копирует файлы/диски из управляющей машины на удаленный компьютер. Если вы хотите скопировать файлы /dirs на удаленном компьютере, и если у вас Ansible 2.0, установите remote_src
на yes
- name: copy html file
copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
Ответ 4
Самое простое решение, которое я нашел, чтобы скопировать содержимое папки без копирования самой папки, заключается в следующем:
- name: Move directory contents
command: cp -r /<source_path>/. /<dest_path>/
Это устраняет следующий вопрос @surfer190:
Хммм, если вы хотите скопировать все содержимое? Я заметил, что * не работает - surfer190 23 июн '16 в 7:29
*
является оболочкой glob, поскольку он полагается на вашу оболочку для перечисления всех файлов в папке перед запуском cp
, а .
непосредственно инструктирует cp
получать содержимое каталога (см. https://askubuntu.com/questions/86822/how-can-i-copy-the-contents-of-a-folder-to-another-folder-in-a-different-directo)
Ответ 5
Ansible remote_src не поддерживает рекурсивное копирование. См. описание remote_src в документах Ansible copy
Чтобы рекурсивно скопировать содержимое папки и убедиться, что задача остается идемпотентной, я обычно делаю это следующим образом:
- 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 }}"
Даунсайд - это то, что команда find все еще отображается как "изменена"
Ответ 6
Я тоже был вовлечен целый день! и наконец нашел решение в команде shell
вместо copy: или command: как показано ниже:
- 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 }}'
строго обратите внимание на:
1. src_path и des_path заканчиваются символом /
2. в оболочке команда src_path заканчивается на .
, который показывает все содержимое каталога
3. Я использовал свое имя удаленного сервера как в hosts, так и в shell раздел jenkins, вместо спецификатора remote_src:
в playbook.
Я думаю, что это хороший совет, чтобы запустить команду ниже в разделе Execute Shell в jenkins:
ansible-playbook copy-payment.yml -i remote-server-name
Ответ 7
Я нашел обходной путь для рекурсивного копирования с удаленного на удаленное:
- 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
Ответ 8
Ниже работал у меня,
-name: Upload html app directory to Deployment host
copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes
Ответ 9
Это я нашел идеальное решение для копирования файла с сервера Ansible на удаленный.
копировать файл 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 }}"