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

 

С чего началось

Сначала поднялся сервер виртуализации, затем внутрипочтовый сервер, веб-хостинг, сервер мониторинга, DNS-сервер, сервер Jabber + площадка вебинаров и многие другие. Затем настал момент, когда количество серверов удвоилось, и их все нужно было подключить к мониторингу, поставить базовый софт, в общем — выполнить базовые задачи.

Выбирать стали между aNimble и Puppet. Последний покорил своей простотой. Поскольку его установка очень хорошо описана на многих ресурсах, опустим ее. После установки сервера и настройки первого клиента встал вопрос, как за всем этим наблюдать. Желательно что-то визуальное. Тут рассматривали только два варианта: Dashboard-Lite и Enterprise Dashboard. Первый бесплатен, в нем можно только наблюдать и делить списки на группы для визуального восприятия. Группировать серверы на классы и применять на лету так и не вышло, зато в консоли все прекрасно отрабатывало. После поставили enterprise-версию, думая даже приобрести лицензию, чтобы облегчить жизнь администраторам. Покрутив демоверсию (30 дней), поплевались: возможности пошире, чем у lite, но тем не менее не обеспечивают всего необходимого. Тогда решили оставить lite и делать все консольно.

Подключили все серверы, описали классы. Все завелось хорошо. На первых порах цели были простые:

* указать содержимое файла `/etc/resolf.conf` с адресами DNS-сервера;
* установить ряд программ: htop, iftop, Nmap;
* установить пакеты Zabbix, настроить конфиг;
* управлять обновлениями.

И тут, очередной раз блуждая по интернетам, наткнулся на Foreman. По описанию в статье установка была проста. В этой статье есть скрипт запуска клиентов с настройкой конфига. Поскольку у нас серверы «разномастные» — есть с Ubuntu 12.04 и 14.04, а статья ориентирована на 14.04, тут я наступил на первые грабли. Убрал установку репозиториев, стал использовать на 12.04 клиент из собственных репозиториев. В итоге получился вот такой первый скрипт.

#!/bin/bash
apt-get install -y puppet
sed -i s/START=no/START=yes/g /etc/default/puppet
sed -i '/\/var\/log\/puppet/a \server=server.local' /etc/puppet/puppet.conf
puppet agent --test

Как видно, скрипт устанавливает клиент Puppet, включает на запуск его, добавляет параметр «адрес сервера» в конфиг и запускает агент. В Foreman он появился, и все было прекрасно до того момента, пока не стали обрабатываться классы. Это были вторые грабли. Дело в том, что с Foreman устанавливается свой Puppet. И вся эта конструкция требует определенной структурной иерархии в манифестах. Например, при дефолтном Puppet использовалось три файла манифеста: sipe.pp — дефолтный, node.pp — файл с описанием нодов и class.pp, в котором описывались классы. У Foreman из коробки доступно четыре окружения, так называемые глобальные профили для групп серверов. Например, для тестовых и для продакшена. Чтобы манифест был доступен в любом окружении, его необходимо добавлять в каждое окружение. Имя манифеста при этом всегда должно быть unit.pp, для корректной обработки Foreman. В итоге каждый класс должен быть «оформлен» /etc/puppet/environments/production/modules/class_name/manifests и внутри должен лежать файл init.pp — только с таким именем и никаким другим. При использовании «старых» манифестов, где все в куче, сыпались ошибки. Причем у меня не вышло без ошибок запихать два класса в один init.pp. Как только с этим разобрались и переписали манифесты, можно подключать их в веб-интерфейсе Foreman. Настройка подключений также очень хорошо изложена в статье, ссылку на которую я дал выше. Что мне понравилось: очень удобное управление группами серверов с предустановкой классов (то есть можно создавать группы и подгруппы и на каждом из уровней прикреплять классы); удобный обзор и мониторинг. Позже, когда все заработало и появилось больше времени, я занялся небольшой модификацией скрипта установки Puppet-клиента.

Далее неплохо бы дать инструмент, который бы автоматически или полуавтоматически устанавливал и настраивал Puppet-агент в систему. Да еще и с проверкой дистрибутива, в котором он работает. А в идеале вообще программой на C и с поддержкой различных дистрибутивов GNU/Linux.

 

Начнем с малого

Итак, начнем с небольшого скрипта на bash. Вдруг это вдохновит кого-нибудь на написание «супер» программы инсталлятора, а пока я наваял на коленке скрипт только для Ubuntu. За помощь огромнейшее спасибо одному из участников Omsk Linux User Group — Shroom.

Мысли вслух

Народ из сообщества OmskLUG очень дружелюбен и всегда готов помочь. Адрес Jabber-конференции: omsklug@conference.jabber.ru.

Придется вспомнить, как писать на bash (или научиться). А поскольку я человек далекий от написания скриптов на bash, то у меня дело подзатянулось. Чтобы снять вопросы, которые возникнут позднее, сразу оговорюсь, что на момент написания статьи было две версии Ubuntu: 12.04 и 14.04. Итак, обо всем по порядку.

if (whiptail --title "Подготовка рабочей станции " --yesno "Запуск сценария установки" 10 60  "введите имя ПК") then

Здесь мы запускаем сценарий установки, соглашаемся с запуском скрипта или отменяем его.

namehost=$(whiptail --title "Установка HostName" --inputbox "Введите имя компьютера" 10 60 HostName 3>&1 1>&2 2>&3)

Здесь запускаем второе окно с указанием имени компьютера в файле /etc/hostname для возможности смены имени хоста. Делается это из-за того, что имя сертификата для Puppet и имя хоста совпадают. А так как планируется запускать скрипт сразу после установки системы, то очень актуально сменить hostname компьютера.

Получаем введенное значение, проверяем, что не нажали отмену, пишем данные в /etc/hostname. Если отмена — выходим.

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo $namehost > /etc/hostname
else
    echo "Отмена"
    exit
fi

Запускаем установку Puppet-клиента. Опять проверяем, что нажато — ОK или отмена, и проверяем версию установленной системы. Если 12.04 — качаем пакет с puppetlabs. Устанавливаем его, удаляем deb-пакет с компьютера, запускаем установку Puppet-агента. Даем разрешение на запуск. Пишем в файл /etc/puppet/puppet.conf адрес Puppet-сервера, указанный ранее, и перезапускаем Puppet-агент. Если нет — качаем для 14.04 и повторяем те же шаги, что и для 12.04 (если кто напишет проверку для всех систем — с удовольствием бы применил у себя). Для удобства добавляем команду puppetagent. И применяем файл .bashrc.

namepuppet=$(whiptail --title "Введите адрес сервера Puppet" --inputbox "Введите имя сервера Puppet" 10 60 ServerName 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
    if [ `lsb_release -r | sed 's/.\+:\s\+//'` = "12.04" ]; then
        wget apt.puppetlabs.com/puppetlabs-release-pc1-precise.deb
        dpkg -i puppetlabs-release-pc1-precise.deb
        rm puppetlabs-release-trusty.deb
        apt-get install -y puppet
        sed -i s/START=no/START=yes/g /etc/default/puppet
        sed -i "/\/var\/log\/puppet/a \server=$namepuppet" /etc/puppet/puppet.conf
        puppet agent --test
    else
        wget apt.puppetlabs.com/puppetlabs-release-trusty.deb
        dpkg -i puppetlabs-release-trusty.deb
        rm puppetlabs-release-trusty.deb
        apt-get install -y puppet
        sed -i 's/templatedir/#templatedir/' /etc/puppet/puppet.conf
        sed -i s/START=no/START=yes/g /etc/default/puppet
        sed -i "/\/var\/log\/puppet/a \server=$namepuppet" /etc/puppet/puppet.conf
        puppet agent --test
        echo 'alias puppetagent="sudo puppet agent --test"' >> /home/$USER/.bashrc
        source /home/$USER/.bashrc
    fi
else
    echo "Отмена запуска"
    exit
fi

Это немного ускорит установку и настройку Puppet-клиента. Как известно, аппетит приходит во время еды. Вот и в моем случае: только когда скрипт был дописан, пришла идея внести изменения — не проверять установленную ОС, а давать выбор пользователю самому указать версию Linux, в которой запускается скрипт. И украсить прогресс-баром скачивание и установку Puppet с помощью whiptail --gauge или аналогичного инструмента dialog. Побродив несколько дней по интернетам, наткнулся на занимательную статью «Применение whiptail --gauge».

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

wget -q apt.puppetlabs.com/puppetlabs-release-trusty.deb
echo 5
dpkg -i puppetlabs-release-trusty.deb > /dev/null
echo 10
rm puppetlabs-release-trusty.deb*
echo 15
apt-get install -y puppet > .log.log
#########################################################################
#(
progress="30"
while (true)
do
    proc=$(ps aux | grep -v grep | grep -e "apt-get")
    if [ "$proc" = "" ]; then break; fi
    sleep 1
    progress=$(expr $progress + 2)
done;
##########################################################################
rm .log.log
sed -i s/START=no/START=yes/g /etc/default/puppet
sed -i "/\/var\/log\/puppet/a \server=$namepuppet" /etc/puppet/puppet.conf
sed -i 's/templatedir/#templatedir/' /etc/puppet/puppet.conf
echo 100
puppet agent --test
) | whiptail --title "Установка Puppet-клиента" --gauge "Пожалуйста, подождите, роняем цены на нефть" 7 70 1

Как видно, немного допилил прогресс-бар — чтобы он более-менее был похож на настоящий прогресс-бар, а не имитацию. После этого получили вполне рабочую систему. Теперь все это хозяйство необходимо добавить в процесс установки системы. Системы мы ставим по сети PXE, скрипт автонастройки выложен на веб-сервере (о том, как это поднималось, можно прочитать в серии статей по PXE в предыдущих номерах) preseed.cfg. Внутри описаны различные директивы автонастройки по ходу установки, так называемые файлы ответов. Здесь можно указать, какой набор программного обеспечения дополнительно нужно установить, как разбить диски, как настроить сеть и прочее.

Нас интересует директива d-i preseed/late_command string. Для удобства положим скрипт рядом с файлом preseed.cfg на веб-сервере и потом скачаем его в процессе установки.

d-i preseed/late_command string wget http://ip/puppetinstall.sh /target/puppetinstall.sh; \
cd /target; \
chmod +x puppetinstall.sh; \
in-target /bin/bash /target/puppetinstall.sh;

Если на этом этапе использовать скрипт, то его нужно немного переработать. А именно убрать запуск клиента Puppet, оставить только установку пакетов. Рекомендую использовать после первой загрузки сервера. Я пошел немного по другому пути: по d-i preseed/late_command string просто скачиваю файл скрипта в систему, а уже после перезагрузки запускаю его.

Далее готовим Puppet-манифесты. Описываем классы установки базового пакета программ и подключение к системе мониторинга Zabbix. Внутри последнего класса (zabbix) описываем файл конфигурации, который будем передавать Puppet-клиентам (смотри дополнительные материалы к статье).

Теперь на все новые серверы автоматом будет вставать Puppet. В файле настройки класса zabbix указано установить Zabbix-клиент, описан стандартный конфиг с указанием IP-адреса сервера Zabbix и дополнительно приведены параметры для подключения мониторинга температуры дисков:

#UserParameter=HDDTempSDA,hddtemp -n /dev/sda
#UserParameter=HDDTempSDB,hddtemp -n /dev/sdb

В остальном все стандартно. Аналогичным образом настраиваем /etc/resolg.conf для указания DNS-сервера. Класс routelan.pp используем для настройки маршрутов, внутри описан скрипт, который создается в /opt/lan.sh.

#!/bin/bash
sudo route add -net 192.168.0.0/24 gateway IP_шлюза eth0

Суть, думаю, понятна. Хочется отметить, что Foreman как оболочка мониторинга и инструмент подключения/отключения параметров (классов) показывает себя очень даже неплохо. В сравнении с Puppet Dashboard информативность на уровне.

Главная страница Foreman
Главная страница Foreman
Список клиентов Puppet в Foreman
Список клиентов Puppet в Foreman
Центр сертификации Puppet
Центр сертификации Puppet
 

Заключение

Как показывает практика, подобные решения автоматизации высвобождают от 30 до 50% времени, что дает значительное увеличение производительности системного администратора. В целом Puppet — очень зрелый продукт, который без особых сложностей разворачивается практически на любой платформе.

P.S. Надеюсь, ты не потратил время зря 😉 Спасибо и удачи!

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии