Вопрос или проблема
У меня есть соединение с ограниченной пропускной способностью с несколькими машинами в лаборатории. Мне нужно загрузить большой файл на них, но это медленно, так как я выполняю ansible с другого компьютера.
Однако между этими машинами есть соединение высокой пропускной способности (гигабитный Ethernet), что заставило меня подумать о более быстрых способах загрузки файла (12.5GiB). Например, в данный момент я использую задачу copy
:
- name: "Установка ПО: загрузка установщика iso | 4 / ?"
ansible.builtin.copy:
remote_src: false # файл локальный, загрузить на целевой перед извлечением
src: software_installer.iso
dest: /tmp/software_installer/software_installer.iso
mode: '0644'
….но это заставит ansible загружать файл вручную на каждую машину с компьютера, на котором я запускаю ansible, что нежелательно.
Еще что я мог бы сделать, так это запустить плейбук с одной из машин с высокой пропускной способностью, но это потребует копирования корневого SSH-ключа для всех машин на удаленный хост (много пользовательская машина), что также является существенно нежелательным.
Существует ли способ заставить ansible передавать файл по торрент-технологии между всеми хостами, чтобы компьютеру, на котором я запускаю ansible, нужно было загрузить файл только один раз?
Ответ или решение
Для решения задачи загрузки большого файла на несколько хостов с использованием Ansible, при этом учитывая ограничения по пропускной способности, возможна реализация метода, который будет «торрентить» файл между хостами. Это позволит загрузить файл только один раз на одном из высокоскоростных хостов, а затем использовать внутреннюю сеть для распространения файла.
К сожалению, Ansible сам по себе не поддерживает торрентинг файлов, но вы можете использовать некоторые обходные пути, такие как использование rsync для копирования файла между хостами после его начальной загрузки. Вот пошаговый процесс, который можно реализовать:
- Загрузите файл на один из хостов с высокой пропускной способностью. Для этого вы можете использовать стандартный модуль Ansible
copy
илиfetch
.
- name: "Загрузка файла на один из высокоскоростных хостов"
hosts: high_bandwidth_host # замените на ваш высокоскоростной хост
tasks:
- name: "Загрузка软件安装程序"
ansible.builtin.copy:
src: software_installer.iso
dest: /tmp/software_installer.iso
- Используйте rsync для распространения файла на все остальные хосты. Сначала убедитесь, что
rsync
установлен на всех целевых хостах. Затем можно создать задачу, которая отправит файл на остальные машины.
- name: "Распространение файла между хостами"
hosts: all_except_high_bandwidth_hosts # замените на ваши остальные хосты
tasks:
- name: "Копирование файла с высокоскоростного хоста"
command: >
rsync -avz --progress high_bandwidth_host:/tmp/software_installer.iso /tmp/software_installer.iso
В этом примере хосты с высокой пропускной способностью сначала получают файл, а затем используют rsync
для копирования файла на оставшиеся машины в локальной сети, что значительно ускоряет процесс.
- Очистите ненужные временные файлы после успешного распространения:
- name: "Очистка временных файлов"
hosts: high_bandwidth_host # хост с высокой производительностью, где был временно загружен файл
tasks:
- name: "Удаление временного файла"
file:
path: /tmp/software_installer.iso
state: absent
Заключение
Хотя Ansible не поддерживает прямую загрузку файлов в стиле торрентинга, использование комбинации copy
и rsync
позволит вам эффективно развернуть большие файлы через локальную сеть. Это значительно увеличит скорость загрузки и снизит нагрузку на пропускную способность вашей сети.