it-swarm.com.ru

Ansible: скопировать содержимое каталога в другой каталог

Я пытаюсь скопировать содержимое каталога dist в каталог nginx.

Я пишу следующее:

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes

Но когда я выполняю playbook, он выдает ошибку:

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

Это ошибка копирования каталога? Как я могу скопировать содержимое каталога, которое находится внутри другого каталога и файла?

Любая помощь? Спасибо

24
Asier Gomez

Решенный ответ: Чтобы скопировать содержимое каталога в другой каталог, я использую следующее:

- name: copy consul_ui files
  command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html
  with_items:
   - "index.html"
   - "static/"

Копирует оба элемента в другой каталог. В этом примере один из элементов является каталогом, а другой - нет. Работает отлично.

20
Asier Gomez

Вы можете использовать модуль synchronize . Пример из документации:

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

Это дает дополнительное преимущество, так как оно будет более эффективным для больших/многих файлов.

26
Aidan Feldman

Ansible Copy модуль по умолчанию копирует файлы/каталоги с управляющей машины на удаленную машину. Если вы хотите скопировать файлы/каталоги на удаленном компьютере и если у вас есть 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
12
helloV

Самое простое решение, которое я нашел для копирования contents папки без копирования самой папки, - это использовать следующее:

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

Это решает следующий вопрос @ surfer190 :

Хм, а что если вы хотите скопировать все содержимое? Я заметил, что * не работает - surfer190 23 июля '16 в 7:29

* - это глобус оболочки, поскольку он использует ваш Shell для перечисления всех файлов в папке before с запущенной cp, тогда как . прямо указывает cp на получение содержимого каталога (см. https: // askubuntu. ru/questions/86822/как можно скопировать содержимое папки в другую папку в другом директории )

5
fractalic

Ansible remote_src не поддерживает рекурсивное копирование. См. описание remote_src в Ansible copy docs

Чтобы рекурсивно скопировать содержимое папки и убедиться, что задача остается идемпотентной, я обычно делаю это следующим образом:

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

Недостатком является то, что команда поиска по-прежнему отображается как «изменено»

3
dvanrensburg

Я тоже был вовлечен целый день! и, наконец, нашли решение в команде Shell вместо copy: или команда: как показано ниже:

- 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. Я использовал свое имя удаленного сервера оба в хостах: и запустил Shell раздел jenkins, вместо спецификатора remote_src: в playbook.

Я думаю, что это хороший совет для запуска команды ниже в разделе «Выполнить оболочку» в jenkins:

ansible-playbook  copy-payment.yml -i remote-server-name
2
foad322

Я нашел обходной путь для рекурсивного копирования с удаленного на удаленный:

- 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
agrimal

Ниже работал для меня,

-name: Upload html app directory to Deployment Host
 copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes
0
Sakharam Thorat

Это я нашел идеальное решение для копирования файлов с сервера 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 }}"
0
Prateek patel