FreeBSD virtual environment management and repository

2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !

Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.

Интеграция CBSD с PHPIPAM.

Введение

С увеличением числа работающих виртуальных машин и контейнеров, может возникать проблема инвентаризации и учета используемого адресного пространства. Кроме этого, если кластер насчитывает два и более хостера, становиться проблемой выдавать уникальные непересекаемые между нодами IP адреса для гостевых окружений. Для этих целей, напрашивается какой-нибудь внешний /микро/ сервис, занимающийся учетом IP адресов.

В этой статье будут продемонстрированы возможности внешних CBSD хуков на примере кластера из 3 физических серверов, расположенных в разных ДЦ, но организующие единый VPC для виртуальных окружений на базе vxlan и интеграцией с системой IP management на базе PHPIPAM.

Мы предполагаем, что CBSD ноды уже сконфигурированы и между ними организован VPC, как это описано в статье VPC с CBSD (vxlan).

Установка PHPIPAM

Устанавливайте PHPIPAM, воспользовавшись любым подходящим для вас способом на выбор: PHPIPAM можно установить из портов:

make -C /usr/ports/net-mgmt/phpipam install 

или через pkg:

pkg install -y phpipam

, либо с официального репозитория на GitHub.

Кроме этого, для CBSD существует CBSDfile для деплоя этого сервиса с нуля через команду `cbsd up`. В этом примере мы пойдем по максимально быстрому пути и воспользуемся тем, что получим уже готовый образ для CBSD (образ, который является результатом команды `cbsd jexport' на контейнер, сформированный CBSDfile-ом). У нас в наличие три сервера с именами: srv-01, srv-02 и srv-03. Выберем любой из них в качестве хостера для phpipam и получим контейнер:

cbsd repo action=get sources=img name=phpipam

запускаем контейнер:

cbsd jstart phpipam

Альтернативный вариант через CBSDfile:

cd /tmp
git clone https://github.com/cbsd/cbsdfile-recipes.git
cd cbsdfile-recipes/jail/phpipam
cbsd up

(при необходимости собрать под альтернативную версию FreeBSD, через аргумент ver: cbsd up ver=12.2)

И открываем страничку в броузере: http://<IP контейнера>

Настройка PHPIPAM

Авторизовываемся в PHPIPAM от администоратора используя дефолтные данные:

  • login: Admin
  • password: ipamadmin

Меняем пароль ( в нашем случае установим пароль в значение 'qwerty123') и активируем функциональность API для работы с PHPIPAM удаленно. Для этого, кликните на пункт 'phpIPAM Server settings':

Установите при необходимости Site URL: в корректное значение. Особенно это важно, если сервис работает за внешним беленсером. Если вы используете беленсер на базе nginx, убедитесь, что конфигурация пропускает соответствующие заголовки:

        location / {
                proxy_pass http://:80;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
	

Активируйте API features, не забудьте сохранить изменения кнопкой save и переходите в настройки API через левое меню:

Создайте ключ для доступа к API:

В качестве App id используйте произвольный уникальный идентификатор (который вам необходимо запомнить для настройки CBSD модуля). В нашем случае мы используем ID: Admin

Установите права доступа в значение: Read/Write

И установите метод доступа к API через токен: User token

Также, через меню Subnets, мы должны завести рабочую сеть, которая отдана под виртуальные окружения и которая будет нотифицироваться через API.


В данном примере, этой сетью является CBSD VPC1: 10.0.1.0/24


На этом конфигурация PHPIPAM завершена.

Установка модуля ipam для CBSD

Получим и активируем ipam модуль для CBSD ( внимание, версия CBSD должна быть не ниже 13.0.4 ).

cbsd module mode=install ipam
echo 'ipam.d' >> ~cbsd/etc/modules.conf
cbsd initenv

Скопируем стандартный конфигурационный файл и откорректируем креденшненелы:

cp -a /usr/local/cbsd/modules/ipam.d/etc/ipam.conf ~cbsd/etc
vi ~cbsd/etc/ipam.conf

В нашем случае, PHPIPAM работает по адресу http://10.0.1.7, поэтому конфигурационный файл ~cbsd/etc/ipam.conf будет выглядеть следующим образом:

PHPIPAMURL="http://10.0.1.7"
PHPIPAMURLAPI="${PHPIPAMURL}/api"
USER="admin"
PASS="qwerty123"
APPID="Admin"
DEBUG=0
# PHPIPAM APP Security ( only 'token' is supported at the moment )
APP_SECURITY="token"

Ознакомиться с операциями, которые предоставляет ipam модуль в CBSD можно через команду 'cbsd ipam --help'. Как мы видим, возможности покрывают такие операции как:

  • 1) запрос на первый свободный IP адрес в сети;
  • 2) создание и/или обновление данных для указанного IP адреса;
  • 3) удаление IP адреса;

Эти три действия будут использованы в качестве 'cbsd dhcpd' скрипта, который предлагает свободный IP адрес для jail и виртуальных машин, а также в create/stop/start/destroy хуках. В качестве проверки, что PHPIPAM и модуль настроены корректно, вы можете попробовать создать и удалить любую тестовую запись через CLI, например:

cbsd ipam mode=create subnet=10.0.1.0/24 ip4_addr=10.0.1.50 description="jail" note="srv-01.my.domain" hostname="jail1.my.domain" debug=1

Если в PHPIPAM ваша запись появилась - осталось дело за малым - вежливо попросить CBSD это делать за вас ;-)

Для удаления нашей тестовой записи:

cbsd ipam destroy

Настройка CBSD

Внимание! Все следующие в этом пункте настройки должны выполнятся одинаково на всех серверах кластера, поэтому рекомендуется использовать любой удобный config-management аля Puppet,SaltStack,Chef или Ansible. Для наглядности, здесь описаны действия для одного хоста, непосредственно через CLI/shell.

a) Нам потребуется перенастроить `cbsd dhcpd' на использование внешнего скрипта.

Для этого скопируем дефолтный конфигурационный файл dhcpd.conf и изменим значение 'internal' на внешний скрипт, который будет обращаться к PHPIPAM. Например, скопируем этот файл как /root/bin/phpiapm.sh:

cp ~cbsd/etc/defaults/dhcpd.conf ~cbsd/etc/
vi ~cbsd/etc/dhcpd.conf

пример:

dhcpd_helper="/root/bin/dhcpd-ipam"

Создадим каталог /root/bin и поместим в него скрипт, вызывающий first_free метод, для получения первого свободного IP от PHPIPAM.

Пример вызова находится здесь: /usr/local/cbsd/modules/ipam.d/share/dhcpd/dhcpd-ipam:

mkdir /root/bin
cp -a /usr/local/cbsd/modules/ipam.d/share/dhcpd/dhcpd-ipam /root/bin/

Отредактируем аргумент subnet= в /root/bin/dhcpd-ipam на ту сеть, которую вы используете для виртуальных окружений (и которую конфигурировали в PHPIPAM).

В нашем случае, это - 10.0.1.0/24, соответственно, вид скрипта будет:

#!/bin/sh

cbsd ipam mode=firstfreelock subnet=10.0.1.0/24

b) скопируем скрипты, которые будут запускаться в качестве create/destroy/start/stop хуков окружений. Примеры этих скриптов находятся здесь: /usr/local/cbsd/modules/ipam.d/share.

mkdir -p /root/share/cbsd-ipam
cp -a /usr/local/cbsd/modules/ipam.d/share/*.d /root/share/cbsd-ipam/

В /root/share/cbsd-ipam/ у нас теперь находятся три каталога по имени каталогов, которые отрабатывают в CBSD при определенных событиях:

  • master_create.d - работает при создании нового окружения;
  • master_poststart.d - работает после запуска окружения;
  • remove.d - работает при уничтожении окружения;

Внутри каждого каталога находится выполняемый файл ipam.sh, в котором вам необходимо откорректировать рабочую сеть, которой будем оперировать в PHPIPAM. В нашем случае это 10.0.1.0/24. Если ваша сеть другая, например 192.168.0.0/16, то во всех скриптах замените:

1) строчку 10.0.1.*) в условии case на:
192.168.*)

2) аргумент subnet в строке вызова 'cbsd ipam', указав вашу сеть:
subnet=192.168.0.0/16

Конечно, вы можете написать собственный, более изящный обработчик вместо этих демонстрационных скриптов. Теперь, если вы не используете свои собственные профили, просто слинкуйте скрипты в каталоги CBSD:

для jail:

ln -sf /root/share/cbsd-ipam/master_create.d/ipam.sh ~cbsd/share/jail-system-default/master_create.d/ipam.sh
ln -sf /root/share/cbsd-ipam/master_poststart.d/ipam.sh ~cbsd/share/jail-system-default/master_poststart.d/ipam.sh
ln -sf /root/share/cbsd-ipam/remove.d/ipam.sh ~cbsd/share/jail-system-default/remove.d/ipam.sh

для bhyve:

ln -sf /root/share/cbsd-ipam/master_create.d/ipam.sh ~cbsd/share/bhyve-system-default/master_create.d/ipam.sh
ln -sf /root/share/cbsd-ipam/master_poststart.d/ipam.sh ~cbsd/share/bhyve-system-default/master_poststart.d/ipam.sh
ln -sf /root/share/cbsd-ipam/remove.d/ipam.sh ~cbsd/share/bhyve-system-default/remove.d/ipam.sh

На этом все! Теперь, работая с CBSDfile или API или CLI, создавая и удаляя jail или bhyve виртуальные окружения на любом из трех серверов, вы решаете проблемы:

  • возможных коллизий при выдаче свободных адресов, поскольку теперь эта логика вынесенная за пределы локальных CBSD инсталляций в отдельную сущность/сервис, гарантирующая выдачу свободных IP;
  • автоматического учета адресного пространства и документация, какое виртуальное окружение (имя), какого типа (jail/bhyve) взяло тот или иной IP и на какой ноде она запустилась (поле description в PHPIPAM будет заполнено именем CBSD хостера, на котором осуществлен запуск окружения);


Демо результата (с комментариями на русском):


Удачи, попутного ветра и легких облаков!