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. Если вы используете более раннюю версию, рекомендуется сначала обновиться.
Использование CBSDfile
Вы можете использовать CBSDfile для создания и удаления окружений CBSD одной командой. Если вы ищите Vagrant для jail или bhyve, возможно вам понравится нативный FreeBSD/CBSD механизм.
Мы не стали изобретать колесо относительно формата CBSDfile и не стремимся повторить синтаксис Dockerfile-like, а используем привычную для большинства форму записи shell-сценария: описывайте конфигурацию вашего приложения в функции с именем jail_XXX или bhyve_YYY. Одна функция - одно окружение. Вы можете использовать любые параметры из команд jcreate/jconstruct-tui/jconfig и bcreate/bconstruct-tui/bconfig.
Например, создание виртуальной машины CentOS7 через bcreate:
cbsd bcreate jname=c1 vm_ram=4g vm_cpus=2 vm_os_type=linux vm_os_profile="cloud-CentOS-7-x86_64" ci_ip4_addr=10.0.0.110 ip4_addr=10.0.0.110 runasap=1 imgsize=6g
В формате CBSDfile, это может быть записано следующим образом:
bhyve_c1() { vm_ram="4g" vm_cpus="2" imgsize="6g" vm_os_type=linux vm_os_profile="cloud-CentOS-7-x86_64" runasap=1 ssh_wait=1 }
Кроме того, используя обычный шелл для описания окружения, в отличие от Dockerfile-like файлов мы можем использовать привычные sh конструкции и использовать различные условия, например, каталоги с CBSDfile может быть общим для нескольких независимых нод, но в зависимости от определенного условия (например по имени ноды), окружения будут использовать разные IP адреса:
jail_nginx() { case "${nodename}" in home.my.domain) ip4_addr="93.100.25.10,2a05:3580:d811:800::2" ;; srv-01.convectix.com) # for srv-01.convectix.com ip4_addr="142.132.155.251,2a01:4f8:261:2b85::1,10.0.100.1" ;; *) echo "Unkown nodename: $nodename, no ip4_addr profile/settings" ip4_addr="DHCP" ;; esac ver="native" interface=0 # with interface=0, IP address # should already be initialized, e.g via rc.conf host_hostname="${jname}.convectix.com" astart=1 pkg_bootstrap=1 pkglist="www/nginx" }
Выполним команду cbsd up и дождавшись окончания, вы можете сразу зайти в виртуальную машину через cbsd blogin
Если вам необходимо выполнить ряд действий при создании окружения, используйте функции postcreate_XXX.
Обратите внимание, что такие команды как blogin,jlogin,bexec,jexec,bscp,jscp,bdestroy,jdestroy,bstop/jstop и тд, также поддерживают CBSDfile и если вы выполняете команду:
cbsd bloginв каталоге, в котором находится CBSDfile, CBSD будет использовать окружения из CBSDfile, в том числе, если CBSDfile использует API (см. ниже)
CBSDfile + API (private cloud)
CBSDfile файл может работать не только локально, но и с удаленным API, за которым может быть любое количество нод. Добавив в файл всего два параметра ( CLOUD_URL + CLOUD_KEY ), вы заставите CBSDfile работать с вашим API сервисом, деплоя ваши окружения в собственное частное облако! При этом локальная копия CBSD при наличие такого CBSDfile, работает как тонкий клиент. Пожалуйста, прочтите для подробностей: API module: частное облако через API
Основные отличия CBSDfile для API от локального заключаются в том, что вместо vm_os_type и vm_os_profile для bhyve вы используете краткий alias в виде img= , который настравается на стороне сервера, а для jail параметр imgsize= является обязательным, что установит квоту по файловой системе для jail. А также, параметры настройки сети ( IP адрес, шлюз, маски ) при CLOUD/API не играют роли, поскольку контроль за выдачей IP адресов происходит со стороны сервера и вы не можете попросить любой адрес.
Примеры
Лучше всего познакомиться с CBSDfile, глядя на рабочие примеры. Например, посмотрите на CBSDfile для деплоя сервиса gitlab: https://github.com/cbsd/cbsdfile-recipes/tree/master/jail/gitlab
В функциях jail_ или bhyve_ находится только описание параметров окружения. Если вам необходимо при разворачивании окружения выполнить ряд действий в нем, используйте функции postcreate_. Это обычная шелл функция, в которой вы можете использовать CBSD команды, где параметр jname= и непосредственно 'cbsd' может быть опущен. Например, если в командной строчке для форвардинга портов вы пишете:
cbsd expose jname=jail2 in=2233 out=22, то в CBSDfile полный пример будет выглядеть так:
jail_jail2() { ver="native" # использовать ту же версию для FreeBSD base, что и ваш хост. Можете указать фиксированно: ver=12.2 или ver=13.0 и тд. ip4_addr="DHCP,DHCPv6" # You need correct configuration of nodeippool and nodeip6pool via 'cbsd initenv-tui` runasap=1 # запустить jail сразу по факту создания } postcreate_jail2() { expose in=2233 out=22 }
Вы можете захотеть выдавать IP адреса не из глобального пула, для этого вы можете вызвать cbsd 'dhcpd' с альтернативными сетями или диапазоном IP адресов, например:
jail_jail2() { ip4_addr=$( dhcpd ip4pool=192.168.0.5-10 ) # Выдаст адрес из диапазона 192.168.5-10 }или список IP адресов (или сетей):
jail_jail2() { ip4_addr=$( dhcpd ip4pool=10.0.0.2,10.0.0.3,10.0.0.4,10.0.0.190-200 ) }
Если вы планируете рано или поздно использовать CBSDfile с API, при копировании файлов из хост системы в окружение предпочитайте команды jscp (для jail) и bscp (для bhyve), вместо обычного cp, поскольку команды jscp/bscp поддерживают работу с CBSDfile/API. В этом случае, для локальных операций и облачных, ваш CBSDfile будет одинаков. Например:
jail_jail2() { ip4_addr="DHCP # You need correct configuration of nodeippool via 'cbsd initenv-tui` runasap=1 # запустить jail сразу по факту создания } postcreate_jail2() { cp /COPYRIGHT ${data}/root # эта команда скопирует /COPYRIGHT внутрь контейнера в каталог /root только локально и не отработает при CLOUD API. # не используйте это. Вместо этого, пишите: jscp /COPYRIGHT ${jname}/root/ # эта команда одинаково отработает с локальным деплоем и с API }
Другой метод кастомизации контейнера через статические файлы - использование каталога 'skel'. Просто положите файты в skel/ каталог, соблюдая иерархию каталогов. Например, : как перезаписать /usr/local/etc/smb4.conf и /usr/local/etc/pkg/repos/ файлы в Samba контейне
.Также, параметры которые вы описываете в jail_ и bhyve_ функциях, можно указывать в командной строчке. Что может быть удобно, если вы используете один CBSDfile для генерации образа разных версий, например:
jail_mc() { ip4_addr="DHCP" # You need correct configuration of nodeippool via 'cbsd initenv-tui` pkglist="shells/bash misc/mc" # установим пакеты bash и mc runasap=1 # запустить jail сразу по факту создания }
Запуская команду `cbsd up ver=12.2` или `cbsd up ver=13.0`, вы получите контейнер с mc/bash для FreeBSD 12.2 или 13.0, без необходимости редактировать CBSDfile.
Если вы используете CBSDfile вместе с CLOUD/API и при создании окружения выполняете с ним ряд действий, убедитесь, что в функции jail_ или bhyve_ вы используете параметр ssh_wait=1, чтобы `cbsd up` дождалась доступности окружения через ssh:
jail_jail2() { pkglist="puppet7" # установим в систему puppet ssh_wait=1 } postcreate_jail2() { jscp /path/to/config/puppet.conf ${jname}:/usr/local/etc/puppet/ # скопируем puppet.conf, в котором указан ваш puppet server jexec /usr/local/bin/puppet agent -t # применим конфигурацию Puppet }
В этом примере вы можете создавать окружения, которые при создании автоматически будут подключаться за своей конфигурацей к Puppetserver и дальнейшее управление им вы можете производить в Puppet
Если вам необходимо выполнить последовательность действий через jexec/bexec, вы можете использовать конструкцию HEREROC, вместо большого количества вызовов bexec/jexec, например:
# для jail: jail_jail2() { pkglist="puppet7" # установим в систему puppet ssh_wait=1 # дождемся доступности окружения, прежде чем выполнять postcreate операции } postcreate_jail2() { jscp /path/to/config/puppet.conf ${jname}:/usr/local/etc/puppet/ # скопируем puppet.conf, в котором указан ваш puppet server # выполним все эти команды на созданном окружении jexec <<EOF export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" whoami date hostname pwd EOF } # для bhyve: bhyve_vm1() { vm_ram="4g" vm_cpus="2" imgsize="6g" vm_os_type=linux vm_os_profile="cloud-CentOS-7-x86_64" runasap=1 ssh_wait=1 } postcreate_vm1() { # выполним все эти команды на созданном окружении bexec <<EOF # все эти команды выполняются в виртуальной машине: export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" sudo yum update -y # sudo yum -y install https://yum.puppet.com/puppet6-release-el-7.noarch.rpm # puppet package sudo yum install -y puppet-agent # sudo yum clean -y all # EOF }
Еще несколько примеров:
Пример для jail. Создайте в каталоге файл requirents.txt - он будет содержать список pip модулей для python, с содержимым:
requests
Создайте CBSDfile с содержимым:
jail_pyjail1() { ip4_addr="DHCP" host_hostname="${jname}.example.com" pkg_bootstrap="1" pkglist="www/nginx python37 security/sudo security/ca_root_nss devel/py-pip devel/py-websockets" } postcreate_pyjail1() { jscp requirements.txt ${jname}:/tmp/requirements.txt jexec pip install -r /tmp/requirements.txt jexec rm /tmp/requirements.txt }
Создайте pyjail1:
cbsd up
или:
cbsd up pyjail1
Удалите pyjail1:
cbsd destory
или:
cbsd destroy pyjail1
Еще один пример CBSDfile
Посмотрите демо как это может выглядеть для гибридных окружений с созданием jail и bhyve одновременно: