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. Если вы используете более раннюю версию, рекомендуется сначала обновиться.

Использование 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 одновременно: