Master of puppets: Установка и настройка системы удаленного управления конфигурацией Puppet. Master of puppets: Установка и настройка системы удаленного управления конфигурацией Puppet Установка puppet

Для более эффективного использования Puppet нужно понимать, как строятся модули и манифесты. Данное руководство ознакомит вас с работой этих компонентов Puppet на примере настройки стека LAMP на сервере Ubuntu 14.04.

Требования

  • Установка Puppet (мастер и агент). Больше об этом – .
  • Возможность создать хотя бы один виртуальный сервер Ubuntu 14.04 для обслуживания агентской ноды Puppet.

Основы кода Puppet

Ресурсы

Код Puppet в основном состоит из ресурсов. Ресурс – это фрагмент кода, который описывает состояние системы и определяет необходимые ей изменения. Например:

user { "mitchell":
ensure => present,
uid => "1000",
gid => "1000",
shell => "/bin/bash",
home => "/home/mitchell"
}

Объявление ресурса имеет такой формат:

resource_type { "resource_name"
attribute => value
...
}

Чтобы просмотреть все типы ресурсов Puppet, введите команду:

puppet resource --types

Больше о типах ресурсов вы узнаете в этом руководстве.

Манифесты

Манифест – это сценарий оркестровки. Программы Puppet с расширением.pp называются манифестами. Манифест Puppet по умолчанию – /etc/puppet/manifests/site.pp.

Классы

Как и в любом обычном языке программирования, классы отвечают за организацию и повторное использование частей оркестровки.

В определении класса находится блок кода, который описывает, как работает класс. Определив класс, вы можете использовать его в манифестах.

Определение класса имеет такой формат:

class example_class {
...
code
...
}

Этот код определяет класс example_class. Код Puppet будет находиться в фигурных скобках.

Объявление класса – это то место в коде, где вызывается тот или иной класс. С помощью объявления класса Puppet обрабатывает его код.

Объявление класса бывает обычным и по типу ресурса.

Обычное объявление класса добавляется в код с помощью ключевого слова include.

include example_class

При объявлении по типу ресурса класс объявляется в формате ресурса:

class { "example_class": }

Такое объявление позволяет добавлять в код параметры класса, которые переопределяют стандартные значения атрибутов класса. Например:

node "host2" {
class { "apache": } # use apache module
apache::vhost { "example.com": # define vhost resource
port => "80",
docroot => "/var/www/html"
}
}

Модули

Модуль – это группа манифестов и других файлов, организованная заранее определенным образом, которая позволяет облегчить совместное и повторное использование отдельных частей оркестровки. Модули помогают систематизировать код Puppet, поскольку с их помощью код можно разделить на несколько манифестов.

Модули Puppet хранятся в каталоге /etc/puppet/modules.

Написание манифеста

Потренироваться писать манифесты, модули и классы Puppet можно на примере установки стека LAMP на сервер Ubuntu (в результате получится ).

Итак, чтобы выполнить оркестровку сервера Ubuntu 14.04 и установить на него стек LAMP, нужны ресурсы для таких действий:

  • установка пакета apache2.
  • запуск сервиса apache2.
  • установка пакета сервера MySQL, mysql-server.
  • запуск сервиса mysql.
  • установка пакета php5
  • создание тестового сценария PHP, info.php.
  • обновление индекса apt перед установкой каждого пакета.

Ниже вы найдете три примера кода Puppet, с помощью которого можно получить такую установку стека LAMP.

Первый пример научит писать базовые манифесты в одном файле. Второй пример поможет собрать и использовать класс и модуль на основе ранее написанных манифестов. В третьем примере вы узнаете, как пользоваться предварительно собранными общедоступными модулями для установки стека LAMP.

Примечание : Для тестирования лучше использовать свежий виртуальный сервер.

Пример 1: Установка LAMP с помощью одного манифеста

Манифест Puppet можно написать на агентской ноде, а затем выполнить его с помощью команды puppet apply (для этого не нужно иметь установку из мастера и агента).

В данном разделе вы научитесь писать манифесты, которые будут использовать такие типы объявления ресурсов:

  • exec: выполнение команд.
  • package: установка пакетов.
  • service: управление сервисами.
  • file: управление файлами.

Создание манифеста

Создайте новый манифест:

sudo vi /etc/puppet/manifests/lamp.pp

Добавьте в него следующий код, чтобы объявить необходимые ресурсы.

# запуск команды "apt-get update"
exec { "apt-update": # ресурс exec "apt-update"
command => "/usr/bin/apt-get update" # команда, которую запустит этот ресурс
}
# установка пакета apache2
package { "apache2":
require => Exec["apt-update"], # запрос "apt-update" перед установкой пакета
ensure => installed,
}
# запуск сервиса apache2
service { "apache2":
ensure => running,
}
# установка mysql-server
package { "mysql-server":
require => Exec["apt-update"], # запрос "apt-update" передустановкой
ensure => installed,
}
# запуск сервиса mysql
service { "mysql":
ensure => running,
}
# установка пакета php5
package { "php5":
require => Exec["apt-update"], # запрос "apt-update" перед установкой
ensure => installed,
}
# запуск сервиса info.php
file { "/var/www/html/info.php":
ensure => file,
content => "", # код phpinfo
require => Package["apache2"], # запрос пакета "apache2"
}

Применение манифеста

Чтобы использовать новый манифест, введите команду:

sudo puppet apply --test

Она выведет объёмный результат, который отображает все изменения состояния среды. Если в выводе нет ошибок, вы сможете открыть свой внешний IP-адрес или доменное имя в браузере. На экране появится тестовая страница PHP с информацией о стеке. Это значит, что Apache и PHP работают.

Теперь стек LAMP установлен на сервер с помощью Puppet.

Это довольно простой манифест, поскольку его можно выполнить на агенте. Если у вас нет мастера Puppet, другие агентские ноды не смогут использовать этот манифест.

Мастер-сервер Puppet проверяет изменения состояния сервера каждые 30 минут.

Пример 2: Установка стека LAMP с помощью модуля

Теперь попробуйте создать простой модуль, основанный на манифесте LAMP, который вы написали в предыдущем разделе.

Чтобы создать модуль, создайте в каталоге modules новый каталог (его имя должно совпадать с именем модуля). В этом каталоге должны находиться каталог manifests и файл init.pp. В файле init.pp указывается класс Puppet (его имятакже должно совпадать с именем модуля).

Создание модуля

Перейдите на мастер-сервер Puppet и создайте структуру каталогов для модуля:

cd /etc/puppet/modules
sudo mkdir -p lamp/manifests

Создайте и откройте в редакторе файл init.pp:

sudo vi lamp/manifests/init.pp

В файл вставьте класс lamp:

class lamp {
}

Скопируйте содержимое манифеста из раздела 1 и вставьте его в блок класса lamp. Теперь у вас есть определение класса lamp. Другие манифесты смогут использовать этот класс в качестве модуля.

Сохраните и закройте файл.

Использование модуля в главном манифесте

Теперь можно настроить главный манифест и с помощью модуля lamp установить на сервер стек LAMP.

На мастер-сервере Puppet отредактируйте такой файл:

sudo vi /etc/puppet/manifests/site.pp

Скорее всего, на данный момент файл пуст. Добавьте в него следующие строки:

node default { }
node "lamp-1" {
}

Примечание : Вместо lamp-1 укажите имя хоста своего агента Puppet, на который нужно установить стек.

Блок node позволяет указать код Puppet, который будет применяться только к некоторым нодам.

Блок default применяется ко всем агентским нодам, у которых нет индивидуального блока (оставьте его пустым). Блок lamp-1 будет применяться к агентской ноде lamp-1.

Добавьте в этот блок следующую строку, которая использует модуль lamp:

Сохраните и закройте файл.

Теперь агентская нода Puppet сможет загрузить настройки с мастер-сервера и установить стек LAMP. Если вы хотите внести изменения прямо сейчас, запустите на агенте команду:

sudo puppet agent --test

Модули – это самый удобный способ повторного использования кода Puppet. Кроме того, модули помогают логически организовать код.

Пример 3: Установка LAMP с помощью общедоступных модулей

Модуль MySQL используется аналогичным образом. Добавьте в блок ноды такие строки:

class { "mysql::server":
root_password => "password",
}

Также можно передать параметры модуля MySQL.

Добавьте ресурс, который скопирует info.php в нужное место. Используйте параметр source. Добавьте в блок node следующие строки:

file { "info.php": # имя файла ресурса
path => "/var/www/html/info.php", # целевой путь
ensure => file,
require => Class["apache"], # класс apache, который нужно использовать
source => "puppet:///modules/apache/info.php", # место, куда нужно скопировать файл
}

В этом объявлении класса используется параметр source вместо content. Этот параметр не только использует содержимое файла, но и копирует его.

Файл puppet:///modules/apache/info.php Puppet скопирует в /etc/puppet/modules/apache/files/info.php.

Сохраните и закройте файл.

Создайте файл info.php.

sudo sh -c "echo "" > /etc/puppet/modules/apache/files/info.php"

Теперь агентская нода Puppet сможет загрузить настройки с мастер-сервера и установить стек LAMP. Если вы хотите внести изменения в среду агента прямо сейчас, запустите на этой ноде команду:

sudo puppet agent --test

Эта команда загрузит все обновления для текущей ноды и установит на неё стек. Чтобы убедиться, что Apache и PHP работают, откройте IP-адрес или домен ноды в браузере:

http://lamp_1_public_IP/info.php

Заключение

Теперь вы имеете базовые навыки работы с модулями и манифестами Puppet. Попробуйте самостоятельно создать простой манифест и модуль.

Puppet отлично подходит для управления конфигурационными файлами приложений.

Tags: ,
Немного лирики. Казалось бы с этой статьи следует начинать весь цикл, но всё же целевой аудиторией являются более опытные пользователи Open Source продуктов Puppet Labs, которых не устраивают отдельные малоинтегрированные модули с Puppet Forge. Как и с любым случаем "library vs. framework", расплатой является следование мировоззрению автора интегрированного решения.

Немного о принципе работы Puppet

Puppet - это в первую очередь специфичный язык декларативного задания конечного состояния системы. Для сравнения крайне подойдёт GNU Makefile, где помимо непосредственного описания зависимостей есть возможность начудить на полную катушку.

Абстракция Puppet примерно следующая (срыв шаблонов - забудьте всё, что вы знали о терминах в программировании! ).

  • Узел (node) - это совокупность конфигурации для конкретной целевой системы. На деле это частный случай класса.
  • Класс (class) - это набор декларативной логики, которая включается в конфигурацию узла или другие классы. У класса нет ни экземпляров, ни методов, зато есть параметры и переменные, определённые внутри логики. На деле, это скорее процедура, которая может наследовать другую процедуру банальным наращиванием кода и не совсем банальной областью видимости переменных.
  • Тип (type) - а вот это уже больше смахивает на классический класс - у него предполагаются экземпляры с именем и определённо заданными параметрами, но ничего более. Конкретная реализация типа может быть написана в виде Puppet скрипта через define , который создаёт экземпляры других типов или же в виде расширения на Ruby с полётом фантазии.
  • Ресурс (resource) - собственно это и есть именованные экземпляры Типов. Имя каждого ресурса уникально в рамках конкретного типа в пределах конфигурации узла (каталога).
  • Переменные (variable) - ну, короче это константы… До версии Puppet 4 с их областью видимости было всё ещё хуже. Теперь она адекватна: для использования извне места определения требуется задавать полностью квалифицированный идентифиактор, за исключением случая наследования классов.
Puppet может использоваться для локального развёртывания без сети и соответствующей инфраструктуры. Это может использоваться для создания образов контейнеров. Есть даже целое направление ратующих за отказ от централизованного сервера.

В идеологически правильном ключе, инфраструктура Puppet состоит из агента - привилегированного сервиса на целевой системе и сервера, раздающего ценные указания в виде декларативных каталогов ресурсов по запросу от агентов. Безопасность реализована на уровне приватной инфраструктуры публичного ключа (X.509). Попросту говоря, тех же механизмов, что и в HTTPS, но с собственным CA и обязательной проверкой клиентского сертификата.

В упрощённом виде процедура развёртывания выглядит примерно так:

  1. Обработка по TLS и X.509 (установка соединения, обновление CRL, проверка ограничений сертификата и т.д)
  2. Агент получает генераторы фактов с сервера с кэшированием и всеми делами (точнее вытягивается всё из папок lib/ в модулях). Не составляет никакого труда добавить свой Ruby скрипт для сбора интересующей информации.
  3. Агент собирает факты о целевой системе и отправляет на сервер. Все факты легко просмотреть вручную через вызов puppet facts . Эти факты доступны в качестве глобальных переменных.
  4. Сервер составляет каталог ресурсов и отправляет агенту. Под этим скрывается целый пласт различных концепций.
  5. Агент вытягивает всё необходимое с сервера и приводит систему к указанном виду. Сам агент при этом не знает как поступать с ресурсами, он полагается на реализацию provider"ов (смысловой перевод будет "воплотитель", а не поставщик) конкретных типов ресурсов. Часть provider"ов являются стандартными и входят в пакеты Puppet, а остальные вытягиваются из модулей.
Для вкушения всех прелестей, существует дополнительные плюшки в виде:
  • Модуль - совокупность декларативных скриптов Puppet, Ruby расширений для Puppet, файлов, шаблонов файлов, Hiera данных и многого другого. Более правильный термин был бы "пакет".
  • Среда (Environment) - совокупность скриптов, модулей и Hiera данных. С усложнением инфраструктуры неминуемо потребовалось разделять конфигурацию далее стандартного деления по узлам. В основном, это требуется для пилотных нововведений и банального контроля доступа (когда не все админы имеют доступ ко всем узлам IT инфраструктуры).
  • Hiera - иерархическая база данных. Такая формулировка может сильно отпугивать. Вероятно поэтому её и поменяли в документации более поздних версий. На деле это крайне простой и удобный механизм вытягивать конфигурацию из YAML или JSON файлов. Иерархия заключается в возможности задать порядок чтения множества конфигурационных файлов - т.е. иерархию/приоритет этих файлов.
    • Помимо вытягивания данных по вызову функции, Puppet вытягивает параметры классов по умолчанию, что является главной изюминкой.
    • Разумеется, Hiera поддерживает интерполяцию фактов и даже вызов специальных функций.
    • В Puppet 4.3 реализовали этот же функционал ещё раз для поддержки не только глобальной базы данных, но и локальной для Среды и Модуля, правда автор уже нашёл несколько проблем в их реализации (PUP-5983 , PUP-5952 и PUP-5899), которые были моментально исправлены Puppet Labs.
    • Поддерживаются несколько стратегий вытягивания значения из всех файлов по иерархии:
      • first - выдаётся первое попавшиеся по приоритету значение
      • unique - собирает все значения в одномерный массив и убирает дубликаты
      • hash - объединяет все найденные YAML Hash. Дубликаты ключей выбираются по приоритету.
      • deep - по сути рекурсивный вариант hash
    • Прелесть в том, что стратегия выборки может задаваться как при вызове функции lookup() , т.к. и в любом файле иерархии через специальный ключ lookup_options , что активно используется в модуле cfnetwork .
  • PuppetDB - по сути слой бизнес логики вокруг реляционной базы данных (PostgreSQL), который позволяет сохранять отчёты о фактах и проделанных развёртываниях и экспортировать ресурсы для последующего импорта в каталоги на других узлах или выборки через специальные функции. Ещё есть и веб-морда в виде Puppet Dashboard.
  • X.509 PKI - уже упомянутая инфраструктура сертификатов, которую крайне удобно использовать для других сервисов без необходимости управления отдельной инфраструктурой.
  • MCollective - вроде бы полезная вещь для событийного запуска задач на серверной ферме, но у автора есть определённое недоверие к безопасности конкретного решения.
  • Puppet Forge - открытая площадка для публикации и скачивания Модулей.
  • некоторые другие фичи в виде управления внешними устройствами типа оборудования Cisco и развёртывания на голом железе, но это уже отдельная история

Заметки по безопасности и доступности

Требуется понимать, что Puppet Server становится уязвимым местом всей IT инфраструктуры, т.к. определяет конечную конфигурацию всех систем. В особых случаях имеет смысл делать разделение - отдельный сервер для критичных элементов инфраструктуры с крайне ограниченным доступов и ручным обновлением и второй для всего остального.

Доступность Puppet Server определяет возможность управления всей инфраструктурой. Имеет смысл размещать Puppet Server на виртуалке в более надёжном и быстро восстанавливаемом стороннем облаке, чем собственные возможности. Или же следует устанавливать несколько серверов.

В любом случае, не следует устанавливать иные сервисы на системе, где будет развёрнут Puppet Server с прибамбасами. Виртуализация и контейнеризация вам в помощь.

Мульти-мастер (несколько обособленных Puppet Server)

  • В данном случае только один сервер выступает в роли CA (Certificate Authority) - его недоступность означает невозможность добавить новые узлы.
    • Puppet допускает использовать стороннюю инфраструктуру X.509, если встроенная не устраивает.
  • Вся конфигурация (Среда) должна храниться в системе контроля версий и развёртываться на каждом сервере одновременно.
  • Единственное общее - это база PostgreSQL, организация высокой доступности которой выходит за рамки данной статьи.
  • Модуль cfpuppetserver поддерживает установки в качестве основного (с CA) и в качестве второстепенного сервера.

Что значимое изменилось с более старых версий

Полное описание есть у производителя .
  • Все сервисы переехали на JVM, JRuby и Jetty. За очевидными плюсами интегрированности есть и минусы по расходу памяти.
  • Добавились лямбда-функции для обработки коллекций - теперь нет необходимости пилить костыли на Ruby или извращаться через create_resources()
  • Появился инструмент обработки шаблонов EPP - по сути тот же ERB , но с Puppet DSL вместо Ruby,
  • Сильно поменялось структура каталогов конфигурационных файлов по умолчанию
  • Появилась поддержка Data Providers для Сред и Модулей (больше не требуются хаки).
  • Принижение роли глобальной Hiera. Новая связанная с этим команда puppet lookup .

Установка

Данный процесс достаточно примитивен, но требует соблюдения определённой последовательности шагов. Поскольку делать это вручную неблагодарное занятие, автор научит плохому, а именно скачивать непонятные скрипты с интернета и запускать под root"ом на своей системе.

Три основных компонента сервера - это сам Puppet Server, PuppetDB и PostgreSQL. Их всех можно запихнуть на один узел или же разбить на две-три системы. Puppet Server и Puppet DB могут быть запущены множество раз, а вот PostgeSQL является единым узлом отказа. Есть разнообразные подход к репликации и кластеризации PostgeSQL.Удобный подход в случае основного и второстепенного серверов будет Master + Read-Only Slave, что поддерживается в самом PuppetDB как основной и read-only узел базы данных, но автоматизация такой настройки требует времени и поэтому пока не входит в модуль cfpuppetserver .

Непосредственно конфигурацию можно просто хранить хоть на файловой системе вместе с Puppet Server, но это как писать скрипты на боевом веб-сервере. Самое подходящее решение - это git репозиторий. Утилита r10k умеет вытягивать все ветки репозитория и развёртывать их на Puppet Server как отдельные Среды. У r10k достаточно плохо с вытягиванием зависимостей, поэтому поверх используется librarian-puppet . Стоит сразу заметить, что основной канонической Средой Puppet является "production". Поэтому в репозитории конфигурации следует использовать ветку с названием "production", а не "master".

Системные требования

По железу описано самим производителем . Модуль cfpuppetserver пока поддерживает только Debian Jessie+ и Ubuntu Trusty+.

Конфигурация в Git

Для самого r10k размещение репозитория не имеет большого значения - главное его доступность. Например, в целях тестирования репозиторий можно разместить на той же системе с доступом через file:// . Хорошим стартом будет пример конфигурации codingfuture/puppet-exampleenv .
  1. Клонируем репозиторий: git clone https://github.com/codingfuture/puppet-exampleenv my-puppet-conf && cd my-puppet-conf
  2. Устанавливаем общие настройки админского доступа, используя подсказки в комментариях:
    • $EDITOR data/common.yaml
  3. Создадим конфигурацию узлов:
    • $MY_DOMAIN - корневое доменной имя (например, example.org)
    • $HOST_NAME - имя клиентского узла без домена
    • mkdir data/$MY_DOMAIN
    • cp data/example.com/puppet.yaml data/${MY_DOMAIN}/puppet.yaml
    • $EDITOR nano -w data/${MY_DOMAIN}/puppet.yaml - настройка узла с Puppet Server по подсказкам в комментариях
    • cp data/example.com/host.yaml data/${MY_DOMAIN}/${HOST_NAME}.yaml
    • $EDITOR nano -w data/${MY_DOMAIN}/${HOST_NAME}.yaml - настройка произвольного узла по подсказкам в комментариях
  4. Пушаем на собственный Git сервер или же делаем доступным локально на узле с Puppet Server через rsync или scp. Локальный репозиторий удобен как промежуточный шаг пока Git сервер не развёрнут с самого же Puppet. В каком-то смысле это напоминает сборку компилятора в несколько этапов.

Ставим с нуля на чистой системе

Модуль cfpuppetserver позволяет установить всё средствами самого же Puppet, но для изначального установки базовые операции продублированы скриптом Bash.

На целевой системе:

  1. Скачиваем скрипт установки: wget https://raw.githubusercontent.com/codingfuture/puppet-cfpuppetserver/master/setup_puppetserver.sh
  2. Просматриваем скрипт и хмурим бровки: less setup_puppetserver.sh
  3. Запускаем: bash setup_puppetserver.sh puppet.${MY_DOMAIN} .
    • Пример с удалённым репозиторием: bash setup_puppetserver.sh ssh://[email protected]/puppet-conf
    • Пример с локальным: bash setup_puppetserver.sh file:///root/puppetconf/
  4. Смотрим как пыжится система и не очень быстро всё устанавливает.
  5. Если удалённый репозиторий:
    • Создаём SSH ключ у root"а: ssh-keygen -t rsa -b 2048
    • Прописываем публичный ключ /root/.ssh/id_rsa.pub на удалённом сервере Git...
    • … и там же настриваем Git hook с вызовом следующей команды: /usr/bin/ssh -T deploypuppet@puppet.${MY_DOMAIN} ./puppetdeploy.sh
  6. Запускаем развёртывание конфигурации вручную: /etc/puppetlabs/deploy.sh
  7. Пробуем как работает на самом сервере: /opt/puppetlabs/bin/puppet agent --test
  8. Проверьте настройки сети, сетевого фильтра и SSH-доступа

Добавляем управляемые узлы

  1. Полное имя Puppet Server должно быть доступно через DNS на управляемом узле или же следует "зашить" в /etc/hosts.
    • Пример: echo "128.1.1.1 puppet.example.com" >> /etc/hosts
  2. На узле с Puppet Server запускаем следующий скрипт /root/genclientinit.sh ${HOST_NAME}.${MY_DOMAIN} .
  3. Результат копируем целиком и вставляем в командную строку на целевой системе.
  4. Ждём окнчания выполнения и запускаем /opt/puppetlabs/bin/puppet agent --test . При первом запуске будет сгенерирован запрос на подпись сертификата.
  5. Идём на узел Puppet Server чтобы подписать сертификат.
    • puppet cert list - сверяем сигнатуру сертификата для пущей параноидальности.
    • puppet cert sign ${HOST_NAME}.${MY_DOMAIN} - собственно, подписываем сертификат.
  6. Возвращаемся на управляемый узел и запускаем: /opt/puppetlabs/bin/puppet agent --test` ещё раз. Это принудительно запустит процедуру развёртывания.
  7. Ждём пока закончится выполнение развёртывания через Puppet Agent.
  8. Всё, у вас готова минимальная инфраструктура Puppet!

Пример вывода /root/genclientinit.sh

bash </etc/cflocation fi if test ! -z ""; then echo -n >/etc/cflocationpool fi if test ! -z "\$http_proxy"; then export http_proxy export https_proxy="\$http_proxy" export HTTP_PROXY="\$http_proxy" export HTTPS_PROXY="\$http_proxy" fi echo host.example.com > /etc/hostname hostname host.example.com if ! which lsb-release | read; then apt-get install lsb-release fi codename=\$(lsb_release -cs) if test -z "\$codename"; then echo "Failed to detect correct codename" exit 1 fi wget https://apt.puppetlabs.com/puppetlabs-release-pc1-\${codename}.deb dpkg -i puppetlabs-release-pc1-\${codename}.deb mkdir -p /etc/puppetlabs/puppet cat > /etc/puppetlabs/puppet/puppet.conf < puppet cert sign host.example.com" echo "Use CTRL+C to stop cycle, if fails due to different reasons" sleep 5 done EOT

Описание модуля

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

~# ./setup_puppetserver.sh Usage: ./setup_puppetserver.sh [ [ [ [] ] ] ]
  • r10k_repo_url - URI Git репозитория
  • certname - полное доменное имя узла
  • cflocation - инициализация факта cf_location
  • cflocationpool - инициализация факта cf_location_pool
  • http_proxy - прокси сервер для HTTP и HTTPS запросов

Полный список параметров Bash скрипта инициализации клиента Puppet

~# /root/genclientinit.sh Usage: ./genclientinit.sh [ [ []]]
Значение параметров такое же, как у предыдущего скрипта.

класс cfpuppetserver

  • deployuser = "deploypuppet" - имя пользователя для автоматического развёртывания обновлений конфигурации
  • deployuser_auth_keys = undef - список ключей для $deployuser
  • repo_url = undef - URI репозитория (пример: ssh://user@host/repo или file:///some/path)
  • puppetserver = true - устанавливать ли компонент Puppet Server на данный узел
  • puppetdb = true - устанавливать ли компонент PuppetDB на данный узел
  • puppetdb_port = 8081 - порт для PuppetDB
  • setup_postgresql = true - устанавливать ли компонент PostgreSQL на данный узел (только если включена установка PuppetDB)
  • service_face = "any" - название ресурса cfnetwork::iface для принятия входящих соединений
  • puppetserver_mem = auto - оперативная память под Puppet Server в мегайбатах (минимум 192MB)
  • puppetdb_mem = auto - оперативная память под PuppetDB в мегайбатах (минимум 192MB)
  • postgresql_mem = auto - оперативная память под PostgreSQL в мегайбатах (минимум 128MB)

класс cfpuppetserver::puppetdb

  • postgresql_host = "localhost" - адрес базы данных
  • postgresql_listen = $postgresql_host - значение идёт прямо в директиву listen_addresses PostgreSQL
  • postgresql_port = 5432 - порт базы данных
  • postgresql_user = "puppetdb" - пользователь PuppetDB в базе данных
  • postgresql_pass = "puppetdb" - пароль пользователя PuppetDB в базе данных
  • postgresql_ssl = false - включение шифрования соединения на основе сертификатов Puppet PKI

класс cfpuppetserver::puppetserver

  • autosign = false - НЕ СТОИТ использовать в боевой среде, разве что в DMZ. Существует исключительно для автоматизации тестирования.
  • global_hiera_config = "cfpuppetserver/hiera.yaml" - путь к файлу конфигурации Hiera по умолчанию по канонам Puppet (первый компонент - название модуля, остальное - путь под папкой files/ в модуле)

Вы можете помочь и перевести немного средств на развитие сайта



Управление большим количеством Unix систем нельзя назвать удобным. Для изменения одного параметра администратору приходится обращаться к каждой машине, скрипты лишь частично могут помочь, да и не во всех ситуациях.

Следует признать, что администраторы Windows сетей находятся все-таки в более выгодном положении. Достаточно изменить настройки групповых политик и через некоторое время все компьютеры сети, в том числе и с недавно установленной операционной системой “узнают” о нововведении, если они их конечно касаются. Оглянувшись на долгий период развития Unix, можно заметить, что ничего подобного так и не прижилось. Есть решения вроде kickstart, которые помогают при первичной установке операционной системы, но дальнейшая доводка потребует значительных усилий. Коммерческие решения вроде BladeLogic и OpsWare , проблему автоматизации настроек решают лишь отчасти, основное их достоинство наличие графического интерфейса, да и позволить их приобрести могут только в крупных организациях. Есть конечно и проекты предлагающие свободные решения, но за все время своего существования они так и не смогли создать большого сообщества. Например Cfengine не очень пользуется популярностью у администраторов, хотя кроме Linux, может использоваться в *BSD, Windows и Mac OS X. Возможно это связано с относительной сложностью в создании конфигураций. При описании заданий приходится учитывать особенности каждой конкретной системы, и вручную контролировать последовательность действий при выполнении команд. То есть администратор должен помнить, что для одних систем следует писать adduser для других useradd, учитывать расположение файлов в разных системах, и так далее. Это на порядок усложняет процесс написания команд, с ходу создать правильную конфигурацию очень сложно, а созданные конфигурации прочитать через некоторое время практически не реально. Не смотря на GPL лицензию Cfengine фактически проект одного человека, который контролирует все изменения и не очень заинтересован в построении открытого общества. В результате возможности cfengine вполне удовлетворяют разработчика, а для остальных администраторов это скорее лишняя головная боль. Чтобы улучшить cfengine сторонними разработчиками были созданы различные дополнения, что часто только ухудшало ситуацию. Автор нескольких таких модулей к cfengine Люке Каниес (Luke Kanies) в итоге решил разработать подобный инструмент, но лишенный многих недостатков cfengine.

Возможности Puppet

Puppet как и cfengine является клиент-серверной системой использующей декларативный, то есть обязательный для выполнения язык для описания задач и библиотеки для их реализации. Клиенты периодически (по умолчанию 30 минут) соединяются с центральным сервером и получают последнюю конфигурацию. Если полученные настройки не совпадают с системным состоянием, они будут выполнены, при необходимости серверу отсылается отчет о произведенных операциях. Сервер сообщения может сохранить в syslog или файл, создать RRD график, отослать на указанный e-mail. Дополнительные уровни абстракции Transactional и Resource обепечивают максимальную совместимость с существующими настройками и приложениями, позволяя сфокусироваться на системных объектах, не заботясь о различиях в реализации и описании подробных команд и форматах файлов. Администратор оперирует лишь с типом объекта, остальное Puppet берет на себя. Так тип packages знает о 17 пакетных системах, нужная автоматически будет распознана на основании информации о версии дистрибутива или системы, хотя при необходимости пакетный менеджер можно задать принудительно.

В отличие от скриптов, которые часто не возможно использовать в других системах, конфигурации Puppet написанные сторонними администраторами будут в большинстве без проблем работать в любой другой сети. В Puppet CookBook [http://www.reductivelabs.com/trac/puppet/tags/puppet%2Crecipe ] уже имеется три десятка готовых рецептов. В настоящее время Puppet официально поддерживает следующие операционные системы и сервисы: Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo и MySQL, LDAP.

Язык Puppet

Чтобы идти дальше, вначале следует разобраться с основными элементами и возможностями языка. Язык это одна из сильных сторон Puppet. С его помощью описываются ресурсы которыми администратор планирует управлять и действия. В отличие от большинства подобных решений, в Puppet язык позволяет упростить обращение ко всем схожим ресурсам на любой системе в гетерогенной среде. Описание ресурса, как правило, состоит из названия, типа и атрибутов. Например укажем на файл /etc/passwd и установим его атрибуты:

file { «/etc/passwd»:

owner => root,

group => root,

Теперь клиенты, подключившись к серверу скопируют файл /etc/passwd и установят указанные аттрибуты. В одном правиле можно определять сразу несколько ресурсов, разделяя их с помощью точки с запятой. А что делать если конфигурационный файл используемый на сервере отличается от клиентских или вообще не используется? Например такая ситуация может возникнуть при настройках VPN соединений. В этом случае следует на файл можно указать директивой source. Здесь два варианта, как обычно указать путь к другому файлу, также поддерживается два URI протокола: file и puppet. В первом случае используется ссылка на внешний NFS сервер, во втором варианте на сервере Puppet, запускается NFS подобный сервис, который и экспортирует ресурсы. В последнем случае по умолчанию путь указывается относительно корневого каталога puppet — /etc/puppet. То есть ссылка puppet://server.domain.com/config/sshd_config будет соответствовать файлу /etc/puppet/config/sshd_config. Переопределить этот каталог, можно с помощью директивы filebucket, хотя более правильно использовать одноименную секцию в файле /etc/puppet/fileserver.conf. В этом случае можно ограничить доступ к сервису только с определенных адресов. Например опишем секцию config.

path /var/puppet/config

allow *.domain.com

allow 192.168.0.*

allow 192.168.1.0/24

deny *.wireless.domain.com

А затем обращаемся к этой секции при описании ресурса.

source => «puppet://server.domain.com/config/sshd_config»

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

file { «/etc/passwd»:

alias => passwd

Другой вариант создания псевдонима, хорошо подходит в том случае, когда приходится иметь дело с разными операционными системами. Например, создадим ресурс описывающий файл sshd_config:

file { sshdconfig:

name => $operatingsystem ? {

solaris => «/usr/local/etc/ssh/sshd_config»,

default => «/etc/ssh/sshd_config»

В этом примере мы столкнулись с возможностью выбора. Отдельно указан файл для Solaris, для всех остальных будет выбран файл /etc/ssh/sshd_config. Теперь к этому ресурсу можно обращаться как к sshdconfig, в зависимости от операционной системы будет выбран нужный путь. Например укажем, что в случае если демон sshd запущен и получен новый файл, следует перезапустить сервис.

ensure => true,

subscribe => File

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

$homeroot = «/home»

Теперь к файлам конкретного пользователя можно обратиться как

${homeroot}/$name

В параметр $name будет подставлено учетное имя пользователя. В некоторых случаях удобно определить значение по умолчанию для некоторого типа. Например для типа exec очень часто указывают каталоги в которых он должен искать исполняемый файл:

Exec { path => «/usr/bin:/bin:/usr/sbin:/sbin» }

В том случе если нужно указать на несколько вложенных файлов и каталогов, можно использовать параметр recurse.

file { «/etc/apache2/conf.d»:

source => «puppet:// puppet://server.domain.com/config/apache/conf.d»,

recurse => «true»

Несколько ресурсов могут быть объеденены в классы или определения. Классы являются законченным описанием системы или сервиса и используются обособленно.

«/etc/passwd»: owner => root, group => root, mode => 644;

«/etc/shadow»: owner => root, group => root, mode => 440

Как и в объектно-ориентированных языках классы могут переопределяться. Например в FreeBSD группой-владельцем этих файлов является wheel. Поэтому чтобы не переписывать ресурс полностью, создадим новый класс freebsd, который будет наследовать класс linux:

class freebsd inherits linux {

File[«/etc/passwd»] { group => wheel };

File[«/etc/shadow»] { group => wheel }

Для удобства все классы можно вынести в отдельный файл, который подключать директивой include. Определения могут принимать многочисленные параметры в качестве аргументов, но не поддерживают наследования и используются в том случае если нужно описать многократно используемые объекты. Например определим домашний каталог пользователей и команды необходимые для создания новой учетной записи.

define user_homedir ($group, $fullname, $ingroups) {

user { «$name»:

ensure => present,

comment => «$fullname»,

gid => «$group»,

groups => $ingroups,

membership => minimum,

shell => «/bin/bash»,

home => «/home/$name»,

require => Group[$group],

exec { «$name homedir»:

command => «/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name»,

creates => «/home/$name»,

require => User[$name],

Теперь чтобы создать новую учетную запись достаточно обратиться к user_homedir.

user_homedir { «sergej»:

group => «sergej»,

fullname => «Sergej Jaremchuk»,

ingroups => [«media», » admin]

Отдельно стоят описания узлов (node), которые поддерживают наследование как и классы. При подключении клиента к серверу Puppet будет произведен поиск соотетсвующей секции node и выданы специфические только для этого компьютера настройки. Для описания всех остальных систем можно использовать node default. Описание всех типов приведено в документе “Type Reference” с которым необходимо ознакомиться в любой случае, хотя бы, для того чтобы понять все возможности языка Puppet. Различные типы позволяют выполнять указанные команды, в том числе и при выполнении определенных условий (например изменение конфигурационного файла), работать с cron, учетными данными и группами пользователей, компьютерами, монтированием ресурсов, запуском и остановкой сервисов, установкой, обновлением и удалением пакетов, работой с SSH ключами, зонами Solaris и так далее. Вот так просто можно заставить обновлять список пакетов в дистрибутивах использующих apt, ежедневно между 2 и 4 часами.

schedule { daily:

period => daily,

range =>

exec { «/usr/bin/apt-get update»:

schedule => daily

Обновление за тот период каждой системой будет выполнено только один раз, после чего задание считается выполненным и будет удалено с клиентского компьютера. Язык Puppet поддерживает другие привычные структуры: условия, функции, массивы, комментарии и подобные.

Установка Puppet

Для работы Puppet потребуются Ruby (>= 1.8.1) с поддержкой OpenSSL и библиотеками XMLRPC, а также библиотека Faster [http://reductivelabs.com/projects/facter ]. В репозитарии Ubuntu 7.04, который использовался при тестовой установке, уже включен пакет puppy.

$ sudo apt-cache search puppet

puppet — centralised configuration management for networks

puppetmaster — centralised configuration manangement control daemon

При инсталляции будут установлены все необходимые зависимости пакеты: facter libopenssl-ruby libxmlrpc-ruby.

$ sudo apt-get install puppet puppetmaster

Проверить наличие библиотек Ruby можно командой.

$ ruby -ropenssl -e «puts:yep»

~$ ruby -rxmlrpc/client -e «puts:yep»

Если не получено ошибок, значит все необходимое уже включено. Файлы в которых описывается желательная конфигурация систем в терминологии Puppet называются манифестами (manifests). При запуске демон пытается прочитать файл /etc/puppet/manifests/site.pp, при его отсутствии выдает предупреждающее сообщение. При тестировании можно указать демону на работу в автоновном режиме при котором манифест не требуется

$ sudo /usr/bin/puppetmasterd —nonodes

При необходимости к site.pp можно подключать другие файлы, например с описаниями классов. Для тестового запуска в этот файл можно занести самую простую инструкцию.

file { «/etc/sudoers»:

owner => root,

group => root,

Все конфигурационный файлы как сервера так и клиентов расположены в /etc/puppet. Файл fileserver.conf о котором мы говорили выше, не обязателен и используется только в том случае когда Puppet будет работать еще и как файл-сервер. В Ubuntu в этом файле экспортируется подкаталог /etc/puppet/files. В подкаталоге ssl расположены сертификаты и ключи, которые будут использоваться для шифрования при подключениях клиентов. Ключи создаются автоматически при первом запуске puppetmasterd, вручную их создать можно командой.

$ sudo /usr/bin/ puppetmasterd —mkusers.

Файлы puppetd.conf и puppetmasterd.conf похожи. В них указываются некоторые параметры работы демонов на клиенской системе и сервере. Клиенский файл отличается только наличием параметра server, указывающего на компьютер на котором запущен puppetmasterd.

server = grinder.com

logdir = /var/log/puppet

vardir = /var/lib/puppet

rundir = /var/run

# отсылаем отчет серверу

Чтобы не печатать все вручную, можно создать шаблон с помощью самого puppetd.

$ puppetd —genconfig > /etc/puppet/puppetd.conf

Аналогично можно создать и site.pp на сервере.

$ puppetd —genmanifest > /etc/puppet/manifests/site.pp

Еще один файл tagmail.conf, позволяет указать почтовые адреса на которые будут отсылаться отчеты. В простейшем случае можно использовать одну строку.

all: [email protected]

Конфигурационных файлов недостаточно, чтобы клиент мог подключаться к серверу. Для этого необходимо еще подписать сертификаты. Сначала чтобы сервер узнал о новом компьютере на клиентской системе вводим команду:

$ sudo puppetd —server grinder.com —waitforcert 60 —test

info: Requesting certificate

warning: peer certificate won’t be verified in this SSL session

notice: Did not receive certificate

Если будет выдана другая строка, следует проверить работу сервера.

$ ps aux | grep puppet

puppet 5779 0.0 1.4 27764 15404 ? Ssl 21:49 0:00 ruby /usr/sbin/puppetmasterd

Межсетевой экран должен разрешать соединения на порт 8140.

На сервере получаем список сертификатов нуждающихся в подписи.

$ sudo puppetca —list

nomad.grinder.com

И подписываем сертификат клиента.

$ sudo puppetca –sign nomad.grinder.com

Теперь клиент может свободно подключаться к серверу и получать настройки.

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

Puppet - это кроссплатформенная структура, позволяющая системным администраторам выполнять общие задачи с использованием кода. Код позволяет выполнять различные задачи от установки новых программ до проверки прав доступа файлов или обновлений пользовательских учетных записей. Puppet превосходна не только в процессе изначальной установки системы, но и на протяжении всего жизненного цикла системы. В большинстве случаев puppet используется в конфигурации клиент/сервер.

Этот раздел показывает установку и настройку Puppet в конфигурации клиент/сервер. Этот простой пример демонстрирует как установить Apache с использованием Puppet .

Установка

Для установки Puppet введите в терминале:

Sudo apt-get install puppetmaster

На клиентской машине (или машинах) введите:

Sudo apt-get install puppet

Настройка

Прежде чем настраивать puppet вам возможно захочется добавить запись DNS CNAME для puppet.example.com , где example.com - это ваш домен. По умолчанию клиенты Puppet проверяют DNS на наличие puppet.example.com в качестве имени puppet сервера (Puppet Master ). Смотрите Служба доменных имен для дополнительных деталей использования DNS .

Если вы не предполагаете использовать DNS , вы можете добавить записи в файл /etc/hosts на сервере и клиенте. Например, в файл /etc/hosts Puppet сервера добавьте:

127.0.0.1 localhost.localdomain localhost puppet 192.168.1.17 meercat02.example.com meercat02

На каждом Puppet клиенте добавьте запись для сервера:

192.168.1.16 meercat.example.com meercat puppet

Замените IP адреса и доменные имена из примера на ваши актуальные адреса и имена сервера и клиентов.

Теперь настроим некоторые ресурсы для apache2 . Создайте файл /etc/puppet/manifests/site.pp , содержащий следующее:

Package { "apache2": ensure => installed } service { "apache2": ensure => true, enable => true, require => Package["apache2"] }

Node "meercat02.example.com" { include apache2 }

Замените meercat02.example.com на актуальное имя вашего Puppet клиента.

Финальным шагом для этого простого Puppet сервера является перезапуск сервиса:

Sudo /etc/init.d/puppetmaster restart

Теперь на Puppet сервере все настроено и время настроить клиента.

Сначала настроим сервис Puppet агента для запуска. Отредактируйте /etc/default/puppet, заменив значение START на yes :

Sudo /etc/init.d/puppet start

Возвращаемся на Puppet сервер для подписи клиентского сертификата с помощью команды:

Sudo puppetca --sign meercat02.example.com

Проверьте /var/log/syslog на любые ошибки конфигурации. Если все прошло хорошо, пакет apache2 и его зависимости будут установлены на Puppet клиенте.

Этот пример очень простой и не показывает многие возможности и преимущества Puppet . Для дополнительной информации смотрите

Сергей Яремчук

Централизованная настройка UNIX-систем с помощью Puppet

Управление большим количеством UNIX-систем нельзя назвать удобным. Для изменения одного параметра администратору приходится обращаться к каждой машине, скрипты лишь частично могут помочь, да и не во всех ситуациях.

Следует признать, что администраторы Windows-сетей находятся все-таки в более выгодном положении. Достаточно изменить настройки групповых политик, и через некоторое время все компьютеры сети, в том числе и с недавно установленной операционной системой, «узнают» о нововведении, если они их, конечно, касаются. Оглянувшись на долгий период развития UNIX, можно заметить, что ничего подобного так и не прижилось. Есть решения вроде kickstart, которые помогают при первичной установке операционной системы, но дальнейшая доводка потребует значительных усилий. Коммерческие решения, вроде BladeLogic и OpsWare , проблему автоматизации настроек решают лишь отчасти, основное их достоинство – наличие графического интерфейса, да и позволить их приобрести могут только крупные организации. Есть, конечно, и проекты, предлагающие свободные решения, но за все время своего существования они так и не смогли создать большого сообщества. Например, Cfengine не очень пользуется популярностью уадминистраторов, хотя, кроме Linux, может использоваться в *BSD, Windows и Mac OS X. Возможно, это связано с относительной сложностью в создании конфигураций. Приописании заданий приходится учитывать особенности каждой конкретной системы и вручную контролировать последовательность действий при выполнении команд. То есть администратор должен помнить, что для одних систем следует писать adduser для других – useradd, учитывать расположение файлов в разных системах и так далее. Это на порядок усложняет процесс написания команд, с ходу создать правильную конфигурацию очень сложно, а созданные конфигурации прочитать через некоторое время практически нереально. Несмотря на GPL-лицензию Cfengine, фактически проект одного человека, который контролирует все изменения и не очень заинтересован в построении открытого общества. В результате возможности Cfengine вполне удовлетворяют разработчика, а для остальных администраторов это скорее лишняя головная боль. Чтобы улучшить Cfengine, сторонними разработчиками были созданы различные дополнения, что часто только ухудшало ситуацию. Автор нескольких таких модулей к Cfengine Люке Каниес (Luke Kanies) витоге решил разработать подобный инструмент, но лишенный многих недостатков Cfengine.

Возможности Puppet

Puppet , как и Cfengine, является клиент-серверной системой, использующей декларативный, то есть обязательный для выполнения язык для описания задач и библиотеки дляихреализации. Клиенты периодически (по умолчанию каждые 30 минут) соединяются с центральным сервером и получают последнюю конфигурацию. Если полученные настройки не совпадают с системным состоянием, они будут выполнены, при необходимости серверу отсылается отчет о произведенных операциях. Сервер сообщения может сохранить вsyslog или файл, создать RRD-график, отослать на указанный e-mail. Дополнительные уровни абстракции Transactional и Resource обеспечивают максимальную совместимость ссуществующими настройками и приложениями, позволяя сфокусироваться на системных объектах, не заботясь о различиях в реализации и описании подробных команд иформатах файлов. Администратор оперирует лишь с типом объекта, остальное Puppet берет на себя. Так, тип packages знает о 17 пакетных системах, нужная автоматически будет распознана на основании информации о версии дистрибутива или системы, хотя при необходимости пакетный менеджер можно задать принудительно.

В отличие от скриптов, которые часто невозможно использовать в других системах, конфигурации Puppet, написанные сторонними администраторами, будут в большинстве безпроблем работать в любой другой сети. В Puppet CookBook уже имеется три десятка готовых рецептов. В настоящее время Puppet официально поддерживает следующие операционные системы и сервисы: Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo и MySQL, LDAP.

Язык Puppet

Чтобы идти дальше, вначале следует разобраться с основными элементами и возможностями языка. Язык – это одна из сильных сторон Puppet. С его помощью описываются ресурсы, которыми администратор планирует управлять, и действия. В отличие от большинства подобных решений, в Puppet язык позволяет упростить обращение ко всем схожим ресурсам на любой системе в гетерогенной среде. Описание ресурса, как правило, состоит из названия, типа и атрибутов. Например, укажем на файл /etc/passwd и установим его атрибуты:

file { "/etc/passwd":

Owner => root,

Group => root,

Mode => 644,

Теперь клиенты, подключившись к серверу, скопируют файл /etc/passwd и установят указанные атрибуты. В одном правиле можно определять сразу несколько ресурсов, разделяя их с помощью точки с запятой. А что делать, если конфигурационный файл, используемый на сервере, отличается от клиентских или вообще не используется? Например, такая ситуация может возникнуть при настройках VPN-соединений. В этом случае следует указать на файл директивой source. Здесь два варианта, можно, как обычно указать путь кдругому файлу, а также с помощью поддерживающихся двух URI протоколов: file и puppet. В первом случае используется ссылка на внешний NFS-сервер, во втором варианте насервере Puppet запускается NFS-подобный сервис, который и экспортирует ресурсы. В последнем случае по умолчанию путь указывается относительно корневого каталога puppet– /etc/puppet. То есть ссылка puppet://server.domain.com/config/sshd_config будет соответствовать файлу /etc/puppet/config/sshd_config. Переопределить этот каталог можно спомощью директивы filebucket, хотя более правильно использовать одноименную секцию в файле /etc/puppet/fileserver.conf. В этом случае можно ограничить доступ к сервису только сопределенных адресов. Например, опишем секцию config:

Path /var/puppet/config

Allow *.domain.com

Allow 127.0.0.1

Allow 192.168.0.*

Allow 192.168.1.0/24

Deny *.wireless.domain.com

А затем обращаемся к этой секции при описании ресурса:

source => "puppet://server.domain.com/config/sshd_config"

Перед двоеточием располагается название ресурса. В самых простых случаях в качестве имени можно просто указать полный путь к файлу. В более сложных конфигурациях лучше использовать псевдоним или переменные. Псевдоним устанавливается с помощью директивы alias:

file { "/etc/passwd":

Alias => passwd

Другой вариант создания псевдонима хорошо подходит в том случае, когда приходится иметь дело с разными операционными системами. Например, создадим ресурс, описывающий файл sshd_config:

file { sshdconfig:

Name => $operatingsystem ? {

Solaris => "/usr/local/etc/ssh/sshd_config",

Default => "/etc/ssh/sshd_config"

В этом примере мы столкнулись с возможностью выбора. Отдельно указан файл для Solaris, для всех остальных будет выбран файл /etc/ssh/sshd_config. Теперь к этому ресурсу можно обращаться как к sshdconfig, в зависимости от операционной системы будет выбран нужный путь. Например, укажем, что в случае, если демон sshd запущен и получен новый файл, следует перезапустить сервис:

service { sshd:

Ensure => true,

Subscribe => File

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

$homeroot = "/home"

Теперь к файлам конкретного пользователя можно обратиться как:

${homeroot}/$name

В параметр $name будет подставлено учетное имя пользователя. В некоторых случаях удобно определить значение по умолчанию для некоторого типа. Например, для типа exec очень часто указывают каталоги, в которых он должен искать исполняемый файл:

Exec { path => "/usr/bin:/bin:/usr/sbin:/sbin" }

В том случае, если нужно указать на несколько вложенных файлов и каталогов, можно использовать параметр recurse:

file { "/etc/apache2/conf.d":

Source => "puppet:// puppet://server.domain.com/config/apache/conf.d",

Recurse => "true"

Несколько ресурсов могут быть объединены в классы или определения. Классы являются законченным описанием системы или сервиса и используются обособленно:

class linux {

File {

"/etc/passwd": owner => root, group => root, mode => 644;

"/etc/shadow": owner => root, group => root, mode => 440

Как и в объектно-ориентированных языках, классы могут переопределяться. Например, в FreeBSD группой-владельцем этих файлов является wheel. Поэтому, чтобы не переписывать ресурс полностью, создадим новый класс freebsd, который будет наследовать класс linux:

class freebsd inherits linux {

File["/etc/passwd"] { group => wheel };

File["/etc/shadow"] { group => wheel }

Для удобства все классы можно вынести в отдельный файл, который нужно подключать директивой include. Определения могут принимать многочисленные параметры в качестве аргументов, но не поддерживают наследования и используются в том случае, если нужно описать многократно используемые объекты. Например, определим домашний каталог пользователей и команды, необходимые для создания новой учетной записи:

define user_homedir ($group, $fullname, $ingroups) {

User { "$name":

Ensure => present,

Comment => "$fullname",

Gid => "$group",

Groups => $ingroups,

Membership => minimum,

Shell => "/bin/bash",

Home => "/home/$name",

Require => Group[$group],

Exec { "$name homedir":

Command => "/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name",

Creates => "/home/$name",

Require => User[$name],

Теперь, чтобы создать новую учетную запись, достаточно обратиться к user_homedir:

user_homedir { "sergej":

Group => "sergej",

Fullname => "Sergej Jaremchuk",

Ingroups => ["media", " admin]

Отдельно стоят описания узлов (node), которые поддерживают наследование, как и классы. При подключении клиента к серверу Puppet будет произведен поиск соответствующей секции node и выданы специфические только для этого компьютера настройки. Для описания всех остальных систем можно использовать node default. Описание всех типов приведено в документе «Type Reference», с которым необходимо ознакомиться в любом случае, хотя бы для того, чтобы понять все возможности языка Puppet. Различные типы позволяют выполнять указанные команды, в том числе и при выполнении определенных условий (например, изменение конфигурационного файла), работать с cron, учетными данными и группами пользователей, компьютерами, монтированием ресурсов, запуском и остановкой сервисов, установкой, обновлением и удалением пакетов, работой с SSH-ключами, зонами Solaris и так далее. Вот так просто можно заставить обновлять список пакетов в дистрибутивах, использующих apt, ежедневно между 2 и 4 часами:

schedule { daily:

Period => daily,

Range =>

exec { "/usr/bin/apt-get update":

Schedule => daily

Обновление за тот период каждой системой будет выполнено только один раз, после чего задание считается выполненным и будет удалено с клиентского компьютера. Язык Puppet поддерживает другие привычные структуры: условия, функции, массивы, комментарии и подобные.

Установка Puppet

Для работы Puppet потребуются Ruby (начиная с версии 1.8.1 и выше) с поддержкой OpenSSL и библиотеками XMLRPC, а также библиотека Faster . В репозитарии Ubuntu 7.04, который использовался при тестовой установке, уже включен пакет puppy:

$ sudo apt-cache search puppet

~$ ruby -rxmlrpc/client -e "puts:yep"

yep

Если не получено ошибок, значит, все необходимое уже включено. Файлы, в которых описывается желательная конфигурация систем, в терминологии Puppet называются манифестами (manifests). При запуске демон пытается прочитать файл /etc/puppet/manifests/site.pp, при его отсутствии выдает предупреждающее сообщение. При тестировании можно указать демону на работу в автономном режиме, при котором манифест не требуется:

$ sudo /usr/bin/puppetmasterd --nonodes

При необходимости к site.pp можно подключать другие файлы, например, с описаниями классов. Для тестового запуска в этот файл можно занести самую простую инструкцию.

class sudo {

File { "/etc/sudoers":

Owner => root,

Group => root,

Mode => 440,

node default {

Include sudo

Все конфигурационные файлы, как сервера так и клиентов, расположены в /etc/puppet. Файл fileserver.conf, о котором мы уже говорили, не обязателен и используется только в том случае, когда Puppet будет работать еще и как файл-сервер. В Ubuntu в этом файле экспортируется подкаталог /etc/puppet/files. В подкаталоге ssl расположены сертификаты и ключи, которые будут использоваться для шифрования при подключениях клиентов. Ключи создаются автоматически при первом запуске puppetmasterd, вручную их можно создать командой:

$ sudo /usr/bin/puppetmasterd --mkusers

Файлы puppetd.conf и puppetmasterd.conf похожи. В них указываются некоторые параметры работы демонов на клиентской системе и сервере. Клиентский файл отличается только наличием параметра server, указывающего на компьютер, на котором запущен puppetmasterd:

server = grinder.com

logdir = /var/log/puppet

vardir = /var/lib/puppet

rundir = /var/run

# отсылаем отчет серверу

report = true

Чтобы не печатать все вручную, можно создать шаблон с помощью самого puppetd:

$ puppetd --genconfig > /etc/puppet/puppetd.conf

Аналогично можно создать и site.pp на сервере:

$ puppetd --genmanifest > /etc/puppet/manifests/site.pp

Еще один файл tagmail.conf, позволяет указать почтовые адреса, на которые будут отсылаться отчеты. В простейшем случае можно использовать одну строку:

all: [email protected]

Конфигурационных файлов недостаточно, чтобы клиент мог подключаться к серверу. Для этого необходимо еще подписать сертификаты.

Сначала, чтобы сервер узнал о новом компьютере, на клиентской системе вводим команду:

$ sudo puppetd --server grinder.com --waitforcert 60 –test

Межсетевой экран должен разрешать соединения на порт 8140.

На сервере получаем список сертификатов, нуждающихся в подписи:

$ sudo puppetca –list

nomad.grinder.com

И подписываем сертификат клиента:

$ sudo puppetca –sign nomad.grinder.com

Теперь клиент может свободно подключаться к серверу и получать настройки.

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

Удачи!

  1. Сайт проекта BladeLogic – http://www.bladelogic.com .
  2. Сайт проекта OpsWare – http://www.opsware.com .
  3. Сайт проекта Cfengine – http://www.cfengine.org .
  4. Сайт проекта Puppet – http://reductivelabs.com/projects/puppet .
  5. Puppet CookBook – http://www.reductivelabs.com/trac/puppet/tagspuppet%2Crecipe .
  6. Библиотека Faster –



Top