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