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
для 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 хостера, на котором осуществлен запуск окружения);