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

Управление несколькими клетками с помощью Shell скриптов

Между ручным управлением каждой клеткой с помощью cbsd jlogin и настройкой систем централизованной оркестровки вроде Puppet или Ansible находится способ, основанный на базе скриптов на языке Shell.

Использование фреймворка cbsd и команд вида jset/jget/jconfig/jexec позволяет с помощью простых скриптов реализовать достаточно сложные сценарии конфигурирования и управления множеством клеток.

Ниже приводится примеры написания таких скриптов для решения всевозможных групповых задач внутри клеток.

Тестируем наличие в клетках уязвимого ПО

Простейший скрипт, запускающий в каждой клетке команду pkg audit -F - проверка наличия установленного ПО с известными проекту FreeBSD уязвимостями.

#!/bin/sh

echo «Checking local SYSTEM»
pkg audit -F
echo ""
echo «Checking DokuWiki JAIL»
/usr/local/bin/cbsd jexec jname=dokuwiki pkg audit -F
echo ""
echo «Checking OwnCloud JAIL»
/usr/local/bin/cbsd jexec jname=owncloud pkg audit -F
echo ""
echo «Checking FTP Backup JAIL»
/usr/local/bin/cbsd jexec jname=ftpbackup pkg audit -F
echo ""
echo «Checking SAMBA JAIL»
/usr/local/bin/cbsd jexec jname=samba pkg audit –F

Пример вывода скрипта после отработки:

Checking local SYSTEM
vulnxml file up-to-date
0 problem(s) in the installed packages found.

Checking DokuWiki JAIL
vulnxml file up-to-date
0 problem(s) in the installed packages found.

Checking OwnCloud JAIL
vulnxml file up-to-date
0 problem(s) in the installed packages found.

Checking FTP Backup JAIL
vulnxml file up-to-date
0 problem(s) in the installed packages found.

Checking SAMBA JAIL
vulnxml file up-to-date
0 problem(s) in the installed packages found.

Более компактный вариант скрипта, который использует цикл и проверку статуса Jail.

#!/bin/sh

for jail in $(/usr/local/bin/cbsd jorder); do

        jstatus1=`/usr/local/bin/cbsd jstatus ${jail}`

        if [ $jstatus1 -ne "0" ]; then
                /usr/local/bin/cbsd jexec jname=${jail} pkg audit -F
        fi

done

Обновление базы известных пакетов и вывод информации об наличие обновлений

Аналогичная предыдущей идеи - выполняем pkg upgrade с ключом -n внутри каждой клетки. Итог - обновляем список доступных для клетки пакетов pkg из репозиториев и выводим на экран доступные обновления.

#!/bin/sh

echo «Checking local SYSTEM»
pkg upgrade -n
echo ""
echo «Checking DokuWiki JAIL»
/usr/local/bin/cbsd jexec jname=dokuwiki pkg upgrade -n
echo ""
echo «Checking OwnCloud JAIL»
/usr/local/bin/cbsd jexec jname=owncloud pkg upgrade -n
echo ""
echo «Checking FTP Backup JAIL»
/usr/local/bin/cbsd jexec jname=ftpbackup pkg upgrade -n
echo ""
echo «Checking SAMBA JAIL»
/usr/local/bin/cbsd jexec jname=samba pkg upgrade –n

Вариант с циклом работает аналогично.

Получение мгновенных значений потребления оперативной памяти клеток

Задача простая - хотим знать, сколько запущенные клетки используют оперативной памяти

#!/bin/sh

cbsd jrctl mode=show | egrep -i "\-\-\-|memoryuse" | grep -v "\=0"

Полученный результат выполнения скрипта

--- dokuwiki ---
memoryuse=31M
vmemoryuse=645M
--- owncloud ---
memoryuse=46M
vmemoryuse=1948M
--- samba ---
memoryuse=16M
vmemoryuse=1680M
--- ftpbackup ---
memoryuse=1172K
vmemoryuse=42M
--- asterisk ---
memoryuse=25M
vmemoryuse=889M

Запуск нескольких скриптов и отправка по почте

Итак - у нас есть несколько полезных скриптов, которые получают нужную нам информацию о клетках. Нужно решить задачу их периодического запуска и получения вывода на электронную почту

#!/bin/sh

sleep 1
echo "To: vershinin.e@gmail.com" > /root/Scripts/audit-pkg.mail
echo "Subject: Audit PKG on MAIN and JAILed systems!!!" >> /root/Scripts/audit-pkg.mail
echo "" >> /root/Scripts/audit-pkg.mail
echo "" >> /root/Scripts/audit-pkg.mail
sleep 1
`/root/Scripts/pkg-audit-all-sys.sh >> /root/Scripts/audit-pkg.mail`
sleep 1
`/root/Scripts/pkg-upgrade-all-sys.sh >> /root/Scripts/audit-pkg.mail`
sleep 1
`/root/Scripts/memory-use-jails.sh >> /root/Scripts/audit-pkg.mail`
sleep 1
`cat /root/Scripts/audit-pkg.mail | /usr/local/bin/msmtp vershinin.e@gmail.com`
sleep 1

Настройки почтового клиента msmtp в файле /root/.msmtprc

account default
host smtp.gmail.com
maildomain gmail.com
auto_from on
port 587
from vershinin.asterisk@gmail.com
tls on
tls_certcheck off

auth on
user vershinin.asterisk
password XXXXXXXXXXXX
logfile /var/log/msmtp.log

# Syslog logging with facility LOG_MAIL instead of the default LOG_USER.
syslog LOG_MAIL

Регулярное резервное копирование клеток

Скрипт для регулярной выгрузки клеток и их сохранение в определенном месте с определенным именем.

#!/bin/sh

jailname=$1

CBSDPATH=/CBSD

JAILBACKUPTARGET=/data/JAILS

backupdate=`/bin/date "+%Y-%m-%d"`

jstatus=`/usr/local/bin/cbsd jstatus $jailname`

if [ $jstatus -ne "0" ]; then
        /usr/local/bin/cbsd jstop $jailname
        sleep 15
fi

jstatus2=`/usr/local/bin/cbsd jstatus $jailname`

if [ $jstatus2 -eq "0" ]; then
        /usr/local/bin/cbsd jexport jname=$jailname compress=9
        sleep 15
fi

if [ -f $CBSDPATH/export/$jailname.img ]; then
        cp $CBSDPATH/export/$jailname.img $JAILBACKUPTARGET/$jailname-$backupdate.img
        sleep 5
fi

jstatus3=`/usr/local/bin/cbsd jstatus $jailname`

if [ $jstatus3 -eq "0" ]; then
        /usr/local/bin/cbsd jstart $jailname
        sleep 5
fi

jstatus4=`/usr/local/bin/cbsd jstatus $jailname`

if [ $jstatus4 -ne "0" ]; then
        echo "Backup JAIL Finish Successfull! Jail restarted!"
fi

Данный скрипт запускается через /etc/crontab для каждой клетки индивидуально по расписанию.

# Backup JAILS monthly
1       4       1       *       *       root    /root/Scripts/backup-jail.sh dokuwiki
1       4       2       *       *       root    /root/Scripts/backup-jail.sh owncloud
1       4       3       *       *       root    /root/Scripts/backup-jail.sh samba && /usr/local/bin/cbsd jexec jname=samba /usr/local/etc/rc.d/transmission stop
1       4       4       *       *       root    /root/Scripts/backup-jail.sh ftpbackup

Итог работы скрипта - в каталоге /data/JAILS/ каждый месяц в первых числах будут создаваться сжатые экспорты всех клеток со всеми настройками.

Полезные alias-ы для интерпретатора CSH

При частой работе с клетками некоторые большие команды удобно сократить с помощью создания alias в настройках интерпретатора - например .cshrc

Просмотр файловых систем - вариант первый.

alias df        'df -m | grep -v "\/dev"'

Просмотр файловых систем - вариант второй.

alias df2       'df | grep -v "\/jails\/"'

Список всех клеток со всех узлов.

alias jall      cbsd jls alljails=1 shownode=1

Список всех узлов и их статусов.

alias cnodes    cbsd node mode=list

Команды запуска и остановки torrent клиента Transmission внутри клетки.

alias tstop     '/usr/local/bin/cbsd jexec jname=samba /usr/local/etc/rc.d/transmission stop'
alias tstart    '/usr/local/bin/cbsd jexec jname=samba /usr/local/etc/rc.d/transmission start'