Cloning

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Клонирование различными способами

dd, nc, ansible (клонирование "гирляндой")

Почти как широковещательное, только лучше :-) Наверное...

apt-get install ansible
mkdir /opt/ansible_cloning
cd /opt/ansible_cloning

cat << EOF > ansible.cfg 
[defaults]
host_key_checking = false
inventory         = ./hosts.txt
EOF

cat << EOF > hosts.txt 
src  ansible_host=172.16.223.166 ansible_user=root ansible_ssh_pass=partedmagic
dst1 ansible_host=172.16.223.53  ansible_user=root ansible_ssh_pass=partedmagic
dst2 ansible_host=172.16.223.173 ansible_user=root ansible_ssh_pass=partedmagic
EOF

cat << EOF > clone.sh 
#!/bin/bash
#ansible dst1,dst2 -m shell -a "wipefs -af /dev/sda" # if need
ansible dst2 -m shell -a "nc -l -p 19000 | dd of=/dev/sda status=progress 2> /cloning.log" &
sleep 1s;
ansible dst1 -m shell -a "bash -c 'nc -l -p 19000 | tee >(dd of=/dev/sda) | nc 172.16.223.173 19000'" &
sleep 1s;
ansible src -m shell -a "dd if=/dev/sda | nc 172.16.223.53 19000"
ansible all -m shell -a "killall nc"
EOF

Пример для клонирования машин 5, 6 и 14 с машины 3 в лаборатории МРП

Все машины должны быть загружены в LiveCD с доступом по ssh и наличием утилит dd и nc

Создаём файл хостов:

cat << EOF > hosts.txt 
src  ansible_host=172.16.99.3   ansible_user=root ansible_ssh_pass=partedmagic
dst1 ansible_host=172.16.99.1   ansible_user=root ansible_ssh_pass=partedmagic
dst2 ansible_host=172.16.99.2   ansible_user=root ansible_ssh_pass=partedmagic
dst4 ansible_host=172.16.99.4   ansible_user=root ansible_ssh_pass=partedmagic
dst5 ansible_host=172.16.99.5   ansible_user=root ansible_ssh_pass=partedmagic
dst6 ansible_host=172.16.99.6   ansible_user=root ansible_ssh_pass=partedmagic
dst7 ansible_host=172.16.99.7   ansible_user=root ansible_ssh_pass=partedmagic
dst8 ansible_host=172.16.99.8   ansible_user=root ansible_ssh_pass=partedmagic
dst9 ansible_host=172.16.99.9   ansible_user=root ansible_ssh_pass=partedmagic
dst10 ansible_host=172.16.99.10 ansible_user=root ansible_ssh_pass=partedmagic
dst11 ansible_host=172.16.99.11 ansible_user=root ansible_ssh_pass=partedmagic
dst12 ansible_host=172.16.99.12 ansible_user=root ansible_ssh_pass=partedmagic
dst13 ansible_host=172.16.99.13 ansible_user=root ansible_ssh_pass=partedmagic
dst14 ansible_host=172.16.99.14 ansible_user=root ansible_ssh_pass=partedmagic
EOF

Создаём скрипт клонирования "гирляндой"

Суть: запускаем в фоне команды на прослушивание порта 19000 через nc и "хвост гирлянды" забирает поток с nc и направляет его на утилиту dd последнего узла в "гирлянде". И заодно на нём же можно смотреть прогресс утилиты dd (это значит что точно такой же прогресс уже прошёл через все остальные узлы гирлянды)

Остальные узлы принимают на nc поток, разветвляют его через tee и одну ветвь направляют на свой жёстки диск, а вторую отправляют дальше по цепочке в соседний узел гирлянды (через nc).

Последней по списку запускается команда считывания диска-источника и направления его в следующий после узла-источника узел "гирлянды". Эта команда уже не фоновая. Её завершение завершает весь скрипт.

Между командами задержки в 1 секунду. Чтобы успели открыться порты nc.

cat << EOF > clone.sh 
#!/bin/bash

#14
ansible dst14 -m shell -a "nc -l -p 19000 | dd of=/dev/nvme0n1 status=progress 2> /cloning.log" &
sleep 1s;

#6
ansible dst6 -m shell -a "bash -c 'nc -l -p 19000 | tee >(dd of=/dev/nvme0n1) | nc 172.16.99.14 19000'" &
sleep 1s;

#5
ansible dst5 -m shell -a "bash -c 'nc -l -p 19000 | tee >(dd of=/dev/nvme0n1) | nc 172.16.99.6 19000'" &
sleep 1s;

# src
ansible src -m shell -a "dd if=/dev/nvme0n1 | nc 172.16.99.5 19000"

#ansible all -m shell -a "killall nc"

EOF

dd через ssh

  • загрузить две машины с pmagic (определить, кто будет донором, кто реципиентом)
  • настроить сеть между этими машинами (обычно DHCP это делает за вас), выяснить ip-адреса донора и реципиента
  • на доноре дать команду
dd if=/dev/устройство_донор | ssh root@ip_address_реципиента /bin/dd of=/dev/устройство_реципиент

например:

dd if=/dev/sda | ssh root@ip_address_реципиента /bin/dd of=/dev/sda

tar через ssh

  • загрузить две машины с pmagic (определить, кто будет донором, кто реципиентом)
  • настроить сеть между этими машинами (обычно DHCP это делает за вас), выяснить ip-адреса донора и реципиента
  • смонтировать устройства в директории на доноре и реципиенте
  • на доноре дать команду
cd /mnt/директория_донор
tar cvf - . | ssh root@ip_address_реципиента 'cd /mnt/директория_реципиент; tar xf -'

например:

tar cvf - . | ssh root@192.168.155.9 'cd /mnt/lin; tar xf -'