Foreman и Libvirt лучшие друзья

Прежде всего хотелось бы сказать несколько слов о проекте Foreman. Это не просто альтернатива скоропостижно скончавшегося Puppet Dashboard, это набор инструментов для управления жизненным циклом сервера, именно так гласит описание на сайте проекта. Это веб-интерфейс (cli так же присутствует), который помогает системным-администраторам в решении задач:

  • Развертывания систем. Поддерживаются: Bare metal, Amazon EC2, Google Compute Engine, OpenStack, Libvirt, oVirt, VMware
  • Управления конфигурациями. Поддерживаются: Puppet, Salt, Chef, Ansible
  • Мониторинга. Речь идет о мониторинге работы системы управления конфигурациями.

В этой заметке рассматривается настройка связки Foreman и Libvirt для развертывания виртуальных машин с установкой ОС посредством PXE. При этом установка и базовая конфигурация Foreman считается уже выполненной и не затрагивается.

Конфигурация Libvirt

Для начала рассмотрим настройку гипервизора. В качестве основы для libvirt используем сервер с Fedora Linux. Выполним установку libvirt для виртуализации используем KVM.

dnf install libvirt-daemon-kvm

Для RHEL/Centos разница сводится к замене dnf на yum.

После установки необходимо отредактировать несколько конфигурационных файлов. В /etc/libvirt/libvirtd.conf раскомментировать следующую строку для возможности работы непривилегированным пользователем:

unix_sock_group = "libvirt"

В конфигурационном файле /etc/libvirt/qemu.conf настраиваем возможность удаленного доступа к дисплеям виртуальных машин.

vnc_listen = "0.0.0.0"
spice_listen = "0.0.0.0"

Настраиваем автозапуск и запускаем службы libvirt

for SERVICES in libvirtd virtlogd; do
  systemctl enable $SERVICES
  systemctl start $SERVICES
  systemctl status $SERVICES 
done

В качестве сетевого устройства для подключения виртуальных машин используем Open vSwitch. Для этого создаем файл конфигурации /tmp/ovs-network.xml следующего содержания:

<network>
  <name>ovs-network</name>
  <forward mode='bridge'/>
  <bridge name='ovs-br0'/>
  <virtualport type='openvswitch'/>
</network>

И загружаем его через virsh:

virsh net-define /tmp/ovs-network.xml
virsh net-start ovs-network
virsh net-autostart ovs-network

Если впоследствии потребуется удалить сеть, это можно будет сделать так:

virsh net-destroy ovs-network
virsh net-autostart --disable ovs-network
virsh net-undefine ovs-network

Все, что остается — создать пользователя для удаленного управления Libvirt:

useradd foreman
usermod -aG libvirt foreman

Конфигурация Foreman

Теперь пора перейти к нашему «прорабу». При условии, что конфигурация развернута на CentOS/RHEL 7 установка необходимого модуля сводится к установке пакета средствами yum:

yum install foreman-libvirt

После установки пакета требуется перезапуск службы. Так как в основе лежит Ruby on Rails, то это веб-сервер Apache:

systemctl restart httpd

Заходим в веб интерфейс и проверяем, что необходимая возможность стала доступной:
foreman about libvirt

Необходимо сконфигурировать безпарольную (по ключу) авторизацию между серверами foreman и libvirt, например так:

mkdir /usr/share/foreman/.ssh
chmod 700 /usr/share/foreman/.ssh
chown foreman:foreman /usr/share/foreman/.ssh
sudo -u foreman bash
ssh-keygen -t rsa -b 4096

После чего скопировать содержимое /usr/share/foreman/.ssh/id_rsa.pub в ~/.ssh/authorized_keys на сервере libvirt.

На этом действия которые необходимо совершить в консоли почти закончились. Большая часть последующей настройки происходит в браузере.

Настроим ресурс libvirt в веб интерфейсе Foreman:

foreman new compute resource

Но это еще не все, необходимо настроить процесс развертывание операционной системы c использованием kickstart и PXE.

Infrastructure -> Provisioning setup

foreman architecture

Установка ОС осуществляется не с сервера Foreman непосредственно, а с сервера smart-proxy. Для установки ОС посредством kickstart нам необходим сервер smart-proxy с ролью TFTP. DHCP и DNS так же нужны, но они могут быть внешние, например на базе сетевого оборудования.

В установке «по умолчанию» на основном сервере уже есть сконфигурированный smart-proxy с ролями Puppet и Puppet CA. Можно использовать его и доставить нужные роли (как предлагается ниже) или настроить для развертывания систем отдельный сервер smart-proxy.

Устанавливать на виртуальную машину будем Centos 7.2.

foreman provisioning setup step 1foreman provisioning setup step 2foreman provisioning setup step 3foreman provisioning setup step 4 foreman provisioning setup step 5

Для установки операционной системы с помощью PXE на сервере smart proxy необходимо сделать доступными для загрузи по tftp ядро и образ initrd.

cd /var/lib/tftpboot/boot
wget -O CentOS-7.2-x86_64-initrd.img https://mirror.yandex.ru/centos/7/os/x86_64/images/pxeboot/initrd.img
wget -O CentOS-7.2-x86_64-vmlinuz https://mirror.yandex.ru/centos/7/os/x86_64/images/pxeboot/vmlinuz

Infrastructure -> Compute profiles

Несмотря на то, тип сети отображается как NAT, беспокоится не о чем, просто про Open vSwitch Foreman ничего не знает.foreman compute profile

Hosts -> Provisioning Templates

foreman template assoc

Hosts -> Operating systems -> CentOS 7.2

foreman centos step 1foreman centos step 2foreman centos step 3foreman centos step 4

Hosts -> Partition Tables -> Kickstart default (Опционально)

<%#
kind: ptable
name: Kickstart default
oses:
- CentOS
- Fedora
- RedHat
%>
zerombr
clearpart --all --initlabel
part /boot --asprimary --fstype xfs --size=300
part pv.01 --size=5000 --grow
volgroup vg00 pv.01
logvol / --vgname=vg00 --fstype=xfs  --size=2048 --name=lv_root
logvol /var --vgname=vg00 --fstype=xfs --size=2048 --name=lv_var
logvol /tmp --vgname=vg00 --fstype=xfs --size=1024 --name=lv_tmp
logvol swap --vgname=vg00 --size=1024 --name=lv_swap

Создание виртуальной машины

Заключительный этап, создание виртуальной машины и установка ОС через веб интерфейс.

foreman new host step 1foreman new host step 2foreman new host step 3foreman new host step 4

После завершения установки ОС получаем сервер с установленным агентом puppet и профилем выбранным в момент установки. Если не выбирать Puppet Master в процессе конфигурации сервер получится «пустым», без подключения к Puppet.