Администрирование виртуальных серверов с использованием Puppet: Часть 1. Установка и настройка Puppet Введение В процессе организации серверной среды с использованием средств виртуализации или облачных сервисов быстро растет количество отдельных серверов. Каждый раз при создании нового сервера возникает необходимость установки и конфигурации соответствующего программного обеспечения. Более того, синхронизация серверных конфигураций требует дополнительных усилий, таких, например, как написание cценариев на языке командной оболочки shell. С помощью программного средства Puppet можно быстро создать новый сервер и настроить его параметры буквально в несколько команд без каких-либо затруднений. Кроме того, Puppet будет периодически синхронизировать конфигурации созданных серверов. Несмотря на то, что эта программа обычно используется для управления крупными серверными структурами (например, в дата-центрах или на Web-сервисах с большим количеством пользователей), её вполне можно применить и для обслуживания нескольких серверов (скажем, в локальной сети небольшого офиса или в домашней сети). История Puppet Проект Puppet является разработкой компании Puppet Labs и распространяется как ПО с открытым исходным кодом (Open Source Software). Программа имеет гибкую модульную структуру: в настоящее время для Puppet написано уже более 200 модулей расширения. Puppet поддерживается не только компанией-разработчиком, но и весьма активным сообществом пользователей. Установка и подготовка Puppet к работе Функционирование Puppet организовано по схеме "клиент-сервер". Каждый клиент периодически устанавливает связь с главным управляющим сервером (или несколькими такими серверами) и выполняет синхронизацию конфигурации. По умолчанию такие сеансы связи происходят каждые полчаса. Поэтому для обеспечения нормальной работы Puppet потребуются как минимум два установленных сервера: один будет выполнять функции главного управляющего сервера (master server), а другой (или другие) выступать в роли подчинённых ему серверов, то есть, в данном контексте можно назвать их серверами-"клиентами". Для того, чтобы установить Puppet на хосте, который будет управлять другими серверами в качестве главного управляющего сервера, необходимо выполнить команды, показанные в листинге 1. Следует отметить, что эти команды выполняются от имени суперпользователя root. Листинг 1. Установка пакета puppet-server на главный управляющий сервер Code: # yum -y install puppet-server # chkconfig puppetmaster on # service puppetmaster start Пакеты для подчинённых серверов устанавливаются на клиентских хостах, как показано в листинге 2 (команды выполняются также от имени суперпользователя root). Листинг 2. Установка пакета puppet на хосте-клиенте Code: # yum -y install puppet # chkconfig puppet on # service puppet start Если хост главного управляющего сервера защищён сетевым экраном, а хосты-клиенты расположены "снаружи" относительно этого сетевого экрана (например, компьютеры в локальной сети), то на главном сервере необходимо открыть TCP-порт с номером 8140 и, по возможности, сделать его доступным только для клиентских хостов. Если все операции будут выполняться на одном компьютере (localhost), то никаких манипуляций с сетевым экраном не требуется. Основы использования Puppet С точки зрения Puppet все конфигурации определяются и описываются как ресурсы (resources), которые можно назвать основными структурными компонентами управляющей среды. Ресурсами могут быть файлы, сервисы (server services), программные пакеты (software packages) и т.д. Более того, ресурсом может быть даже одиночный вызов команды оболочки shell. Например, описываемый в листинге 3 ресурс типа file представляет известный всем файл /etc/passwd, владельцем которого является root. Листинг 3. Описание ресурса - файла /etc/passwd Code: file { '/etc/passwd': owner => root, mode => 644, } Ресурсы можно группировать по определённым характеристикам: так, например, любой файл имеет владельца и расположен по конкретному адресу (path) в файловой системе, у каждого пользователя есть регистрационное имя (login), личный идентификатор (UID) и идентификатор группы (GID). В соответствии с этими характеристиками формируются типы ресурсов. Кроме того, самые важные характеристики типа ресурса в общем смысле одинаковы для любых операционных систем, независимо от незначительных деталей реализации. То есть описание ресурса вполне можно абстрагировать от его реализации в той или иной операционной системе. На основе вышеописанных предпосылок сформирован уровень абстракции ресурсов (resource abstraction layer - RAL) программы Puppet. RAL разделяет ресурсы на типы (types), являющиеся моделями высокого уровня, и провайдеры (providers), которые представляют более низкий уровень, то есть реализации ресурсов, зависящие от конкретной платформы. Такая организация RAL позволяет составлять описания ресурсов способом, применимым практически на любой системе. Цикл синхронизации RAL Puppet использует RAL как для чтения, так и для изменения состояния ресурсов системы. Являясь декларативной системой контроля и управления, Puppet начинает рабочий цикл с получения информации о том, в каком состоянии должен находиться тот или иной ресурс. При синхронизации ресурса используется RAL для запроса текущего состояния, сравнения его с требуемым и внесения всех необходимых изменений при обнаружении каких-либо различий. Структура описания ресурса Как было сказано выше, в Puppet каждый ресурс является экземпляром некоторого типа (resource type), с указания которого начинается собственно описание. Ресурс идентифицируется именем (title), которое записывается в одиночных кавычках после открывающей фигурной скобки и сопровождается символом двоеточия. Далее с новой строки определяются атрибуты типа (attributes), причём некоторые атрибуты являются общими для всех типов, другие же присущи только данному конкретному типу ресурса. Каждый атрибут имеет значение (value), таким образом, записи атрибутов с соответствующими значениями имеют общую форму attribute => value. Общее представление о синтаксисе языка описания ресурсов Puppet можно получить из листинга 4, в котором показан самый простой случай - описание ресурса типа "пользователь" (user). Листинг 4. Синтаксис языка описания ресурсов Puppet на примере пользователя Code: user { 'alex': ensure => present, uid => '501', gid => 'admin', shell => '/bin/bash', home => '/home/alex', managehome => true, } Каждая строка определения атрибута заканчивается запятой, а закрывающая фигурная скобка сообщает о том, что описание ресурса завершено. Следующая конфигурация, демонстрируемая в листинге 5, позволяет установить пакет openssh-server, разрешить использование сервиса sshd по умолчанию и выполнить проверку, чтобы убедиться в том, что этот сервис действительно активизирован и работает. Листинг 5. Описание ресурса - сервиса sshd (установка, запуск, проверка) Code: package { 'openssh-server': ensure => installed, } service { 'sshd': enable => true, ensure => running, require => Package['openssh-server'], } Теперь необходимо применить описанные выше конфигурации к соответствующим серверам. В пакет Puppet по умолчанию включён специальный файл конфигурирования ресурсов site.pp, который располагается в каталоге /etc/puppet/manifests. Если параметры конфигурации ресурсов не очень сложны, то их можно добавить в этот файл вручную: например, содержимое вышеприведённых листингов 3 и 4. После того, как все требуемые программы установлены и активированы, а файлы конфигурации сформированы, обязательно нужно зарегистрировать все подчинённые серверы (клиенты) на главном управляющем сервере и подтвердить достоверность регистрации (sign), то есть пройти своеобразную сертификацию. На подчинённых серверах регистрация выполняется следующей командой (также требуются права суперпользователя root): Code: puppetd --test --waitforcert 30 --server MASTER_SERVER_ADDRESS Вместо MASTER_SERVER_ADDRESS следует указать реальный адрес главного управляющего сервера. После регистрации всех необходимых клиентов на главном управляющем сервере выполняются команды, показанные в листинге 6. Листинг 6. Сертификация зарегистрированных клиентов на главном управляющем сервере Code: puppetca --list # выводится список адресов зарегистрированных клиентов puppetca --sign CLIENT_SERVER_ADDRESS # вместо CLIENT_SERVER_ADDRESS следует указать реальный адрес клиента # команда повторяется для адреса каждого клиента После завершения операций регистрации и сертификации Puppet автоматически применит описанные выше конфигурации ресурсов на зарегистрированных клиентах. Далее на клиентских хостах в конфигурационный файл самой программы /etc/puppet/puppet.conf необходимо добавить следующий параметр, определяющий адрес главного управляющего сервера: Code: [main] # здесь также записывается реальный адрес сервера server = MASTER_SERVER_ADDRESS Теперь Puppet полностью настроен и работает. Автоматическая синхронизация конфигураций ресурсов подчинённых серверов будет производиться каждые 30 минут. Пронаблюдать процесс можно выполнив команду: Code: tail -f /var/log/messages Заключение В этой статье мы рассмотрели процесс настройки и конфигурации Puppet на главном управляющем сервере и клиентских серверах, состояние которых и будет отслеживаться. В следующей статье данного цикла будут рассмотрены примеры конфигурации Puppet для выполнения стандартных задач системного администратора. Алексей Снастин, независимый разработчик ПО, начальник отдела Дата: 03.07.2012 http://www.ibm.com/developerworks/ru/library/l-puppet_01/
Администрирование виртуальных серверов с использованием Puppet: Часть 2. Примеры конфигураций ресурсов Введение В первой статье (см. выше) был рассмотрен процесс установки и настройки пакета Puppet, используемого для настройки и администрирования виртуальных серверов. В этой статье приведены примеры конфигураций для некоторых конкретных ресурсов. Для того, чтобы использовать эти конфигурации на практике, их необходимо добавить в файл конфигурирования ресурсов /etc/puppet/manifests/site.pp. Создание пользователя с правами администратора Puppet позволяет управлять учётными записями пользователей с помощью специального типа ресурса user. В листинге 1 приведена конфигурация для создания на сервере пользователя с именем admin, обладающего некоторыми правами для выполнения функций администратора. Листинг 1. Создание пользователя admin Code: # Добавление учётной записи admin user { 'admin': home => '/home/admin', # домашний каталог для этого пользователя managehome => true, # Puppet управляет домашним каталогом admin groups => ['wheel'], # пользователь принадлежит к группе wheel password => 'PASSWORD_HASH', # хэш-значение для пароля после его зашифрования } В листинге 1 вместо PASSWORD_HASH должно быть подставлено хэш-значение, полученное после шифрования пароля. Эту операцию можно выполнить с помощью стандартной функции crypt (3), например, следующей командой: Code: perl -wle 'print crypt "PASSWORD", "SALT"' или Code: python -c 'import crypt; print crypt.crypt("PASSWORD","SALT")' Если штатные системные средства кажутся недостаточно надёжными, то можно воспользоваться специализированным программным обеспечением: Code: yum -y install ircd-ratbox-mkpasswd /usr/bin/ircd-mkpasswd -m -s 'SALT' -p 'PASSWORD' Следует отметить, что в описания ресурсов можно добавлять комментарии в стиле командной оболочки shell, то есть всё, что следует за символом '#', считается комментарием. Установка и настройка sudo Конфигурация, необходимая для установки пакета sudo, и изменения, вносимые в файл /etc/sudoers с целью допуска пользователей из группы wheel к sudo-операциям с помощью augeas, приведены в листинге 2. Листинг 2. Установка и настройка пакета sudo Code: # установка пакета sudo package { 'sudo': # необходимо проверить, действительно ли установлен пакет ensure => installed, } # разрешить пользователям из группы wheels использовать sudo augeas { 'sudowheel': # целевой файл /etc/sudoers context => '/files/etc/sudoers', changes => [ # изменения, которые необходимо внести в файл /etc/sudoers 'set spec[user = "%wheel"]/user %wheel', 'set spec[user = "%wheel"]/host_group/host ALL', 'set spec[user = "%wheel"]/host_group/command ALL', 'set spec[user = "%wheel"]/host_group/command/runas_user ALL', ], } Установка и конфигурация сервера ssh Конфигурация, показанная в листинге 3, позволяет установить и запустить сервис sshd на сервере. Кроме того, в ней также вносятся изменения в файл /etc/ssh/sshd_config для того, чтобы запретить вход суперпользователю root и попытки регистрации без паролей (с пустыми паролями). Листинг 3. Конфигурация для сервиса sshd Code: # установка требуемого пакета package { 'openssh-server': ensure => installed, } # разрешить использование сервиса sshd service { 'sshd': # активировать сервис при загрузке системы enable => true, # проверять, запущен ли сервис ensure => running, # эта проверка выполняется до активизации сервиса require => Package['openssh-server'], } # внесение необходимых изменений в файл конфигурации сервиса augeas { 'sshd_config': # целевой файл /etc/ssh/sshd_config context => '/files/etc/ssh/sshd_config' # после применения данной конфигурации необходим перезапуск сервиса notify => Service['sshd'], changes => [ # запретить вход суперпользователю root 'set PermitRootLogin no', # запретить вход без пароля 'set PermitEmptyPasswords no', ], } Конфигурация правил для сетевого экрана iptables Для того, чтобы получить возможность конфигурации правил для сетевого экрана iptables с помощью Puppet, необходимо установить дополнительный модуль puppet-iptables, который расположен в хранилище GitHub. Все команды для скачивания и установки модуля puppet-iptables приведены в листинге 4. Листинг 4. Скачивание и установка специального модуля puppet-iptables Code: cd /tmp wget --no-check-certificate "https://github.com/kbarber/ \ puppet-iptables/tarball/master" tar xvzf kbarber-puppet-iptables-1.2.0-2-g9deddbb.tar.gz # далее для установки требуются права суперпользователя root mkdir -p /etc/puppet/modules mv kbarber-puppet-iptables-g9deddbb /etc/puppet/modules/ Кроме того, на главном управляющем сервере и на всех подчинённых серверах в файл конфигурации /etc/puppet/puppet.conf необходимо добавить параметры, указанные в листинге 5. Листинг 5. Параметры конфигурации, необходимые для использования модуля puppet-iptables Code: [main] libdir = /var/lib/puppet/lib [puppetd] pluginsync=true plugindest=/var/lib/puppet/lib После этого станет доступным управление ресурсами сетевого экрана iptables с помощью Puppet. В приведённом ниже листинге 6 показана упрощённая базовая конфигурация сетевого экрана, позволяющая принимать только пакеты из явно указанных источников, а именно: с локального компьютера (localhost), хостов локальной сети, а также пакеты, поступающие по ssh-соединению. Листинг 6. Базовая конфигурация ресурсов сетевого экрана iptables Code: # принимать пакеты только по существующему (установленному) соединению iptables { 'allow established, related': state => ['ESTABLISHED', 'RELATED'], proto => 'all', jump => 'ACCEPT', } # принимать все пакеты с локального хоста iptables { 'allow localhost': source => '127.0.0.1', proto => 'all', jump => 'ACCEPT', } # принимать все пакеты из локальной сети iptables { 'allow LAN': source => '192.168.0.0/16', proto => 'all', jump => 'ACCEPT', } # принимать все пакеты, приходящие по SSH-соединению iptables { 'allow ssh': proto => 'tcp', dport => 22, jump => 'ACCEPT', } # все прочие входящие пакеты по умолчанию отбрасывать (не принимать) iptables { 'drop incoming packets': chain => 'INPUT', proto => 'all', jump => 'DROP', } Заключение Программное средство Puppet является удобным и гибким инструментом настройки, администрирования и синхронизации конфигураций как виртуальных, так и физических серверов. Универсальный язык описания ресурсов позволяет создавать конфигурации, независимые от конкретных платформ и операционных систем. Алексей Снастин, независимый разработчик ПО, начальник отдела Дата: 03.07.2012 http://www.ibm.com/developerworks/ru/library/l-puppet_02/