Что такое кукольный?
Puppet — это поставщик — кросс-операционное программное обеспечение, которое устанавливает операционные системы, устанавливая и конфигурируя программное обеспечение и т. Д., Основываясь на неких инструкциях. Вот как пример таких инструкций — манифест — для Puppet:
1
2
3
4
5
6
7
|
# my_sample_manifest.pp class my_development_env { package { 'vim' : ensure => 'present' } } # Apply it include my_development_env |
Запуск с
1
|
puppet apply --verbose --debug my_sample_manifest.pp |
установит vim в систему.
Обратите внимание, что, хотя Puppet может запускаться только один раз, он, как правило, предназначен для многократного запуска, чтобы извлечь и применить последнюю конфигурацию (обычно из какой-то системы управления исходным кодом, такой как Git). Поэтому все его операции должны быть идемпотентными — их можно безопасно выполнять несколько раз.
Файл конфигурации Puppet aka Manifest
Кукольные манифесты написаны в Ruby-подобном синтаксисе и состоят из объявления «ресурсов» (пакетов, файлов и т. Д.), Необязательно сгруппированных в один или несколько классов (т. Е. Шаблоны, которые можно применять к системе). Каждый конкретный ресурс имеет заголовок (например, ‘vim’), за которым следуют разделенные запятыми пары свойств = значение. У вас может быть несколько ресурсов одного типа (например, пакета), если они имеют разные названия.
Значения свойств чаще всего представляют собой строки, заключенные в «одинарные кавычки» или, альтернативно, в «двойные кавычки», если вы хотите, чтобы переменные внутри них заменялись их значениями. (Переменная начинается со знака доллара.)
Вместо имени или значения вы также можете использовать массив заголовков / значений, заключенный в [].
(Примечание. Обычная практика — оставлять запятую за последней парой свойство => значение.)
Вы можете сгруппировать ресурсы в классах ( класс my_class_name {…} ), а затем применить класс либо с помощью include ( include my_class_name ), либо с более сложным классом ( class {‘my_class_name’:} ). Вы также можете включить класс в другой класс, как этот.
Doing Things With Puppet Установка программного обеспечения с пакетом
Наиболее используемый способ установки пакетов программного обеспечения — это простое использование пакета :
1
|
package {[ 'vim' , 'apache2' ]: ensure => 'present' } |
Puppet поддерживает различных поставщиков пакетов и по умолчанию выбирает системного (например, apt в Ubuntu или rpm в RedHat). Вы можете явно указать другого поддерживаемого поставщика пакетов, такого как гем Ruby или пункт Python.
Вы также можете запросить определенную версию пакета (если она поддерживается) с помощью sure => ‘<version>’ или последнюю версию с sure => ‘latest’ (это также будет переустанавливать ее всякий раз, когда выпускается новая версия и запускается Puppet). ). В случае sure => ‘present’ (также называемого ‘install’): если пакет уже установлен, ничего не происходит, в противном случае устанавливается последняя версия. Копирование и создание файлов с файлом
Создайте файл с содержимым, указанным в строке:
1
2
3
4
|
file { '/etc/myfile.example' : ensure => 'file' , content => 'line1\nline2\n' , } |
Копировать каталог, включая его содержимое, установить владельца и т. Д .:
1
2
3
4
5
6
7
8
|
file { '/etc/apache2' : ensure => 'directory' , source => '/vagrant/files/etc/apache2' , recurse => 'remote' , owner => 'root' , group => 'root' , mode => '0755' , } |
Для этого требуется, чтобы существовал каталог / vagrant / files / etc / apache2. (Vagrant автоматически делится каталогом с Vagrantfile как / vagrant на виртуальной машине, так что это на самом деле копирует файлы с хост-машины. С настройкой главного агента Puppet вы также можете получать файлы удаленно, с мастера, используя puppet: // протокол в источнике.)
Вы также можете создавать файлы на основе шаблонов ERB (с источником => шаблон («относительный / путь / к / этому»)), но мы не будем обсуждать это здесь.
Вы также можете создавать символические ссылки (с помощью кнопки sure => link, target => ‘path / to / it’) и делать другие вещи, читая больше в документации по файловым ресурсам .
(Re) Запуск демонов с помощью сервиса
Когда вы установили необходимые пакеты и скопировали их файлы конфигурации, вы, вероятно, захотите запустить программное обеспечение, что делается с помощью сервиса :
1
2
3
4
|
service { 'apache2' :· ensure => running,· require => Package[ 'apache2' ], } |
(Мы поговорим о require позже; он гарантирует, что мы не пытаемся запустить Apache до его установки.)
В Linux Puppet удостоверяется, что служба зарегистрирована в системе для запуска после перезагрузки ОС, и запускает ее. Puppet повторно использует поддержку ОС для сервисов, таких как скрипты запуска сервиса в /etc/init.d/ (где service = имя скрипта) или выскочка Ubuntu.
Вы также можете объявить свои собственные команды запуска / остановки / состояния со свойствами с такими же именами, например, f.ex. start => ‘/ bin / myapp start’.
Когда все терпит неудачу: выполнение команд
Вы также можете выполнить любую команду оболочки с exec :
1
2
3
4
5
6
|
exec { 'install hive' : creates => '/tmp/hive-0.8.1-bin' , path => '/bin:/usr/bin' , user => 'root' , } |
Программы должны иметь полностью определенные пути, или вы должны указать, где искать их с помощью пути .
Крайне важно, чтобы все такие команды могли выполняться многократно без вреда, т. Е. Они являются идемпотентными. Для этого вы можете указать Puppet пропустить команду, если файл существует с create =>… или если команда выполнена успешно или не выполнена, если только / onlyif .
Вы также можете запустить команду в ответ на изменение зависимого объекта, комбинируя refreshonly и подписку .
Другие вещи, чтобы сделать
Вы можете создавать пользователей и группы, регистрировать авторизованные ssh-ключи, определять записи cron, монтировать диски и многое другое — ознакомьтесь со справочником типов кукол .
Принудительное выполнение распоряжения с требованием, до, уведомить и т. Д.
Puppet обрабатывает ресурсы, указанные в случайном порядке, а не в порядке спецификации. Поэтому, если вам нужен определенный порядок — например, сначала установить пакет, затем скопировать файлы конфигурации, запустить третий сервис — тогда вы должны сообщить Puppet об этих зависимостях. Существует несколько способов выражения зависимостей и несколько типов зависимостей:
- До и требуют — простая зависимость порядка выполнения
- Уведомить и подписаться — расширенная версия before / require, которая также уведомляет зависимый ресурс всякий раз, когда ресурс зависит от изменений, используется с обновляемыми ресурсами, такими как сервисы; обычно используется между службой и ее файлом конфигурации (Puppet обновит его, перезапустив)
Напр .:
1
2
3
4
5
|
service { 'apache2' : ensure => running, subscribe => File[ '/etc/apache2' ], require => [ Package[ 'apache2' ], File[ 'some/other/file' ] ], } |
Обратите внимание, что в отличие от объявления ресурса ссылка на ресурс имеет имя ресурса в верхнем регистре, а заголовок ресурса находится в пределах [].
Puppet достаточно умен, чтобы вывести зависимость «требовать» между неким ресурсом, которым он управляет, таким как файл и его родительская папка или exec и его пользователь — это хорошо задокументировано для каждого ресурса в справочнике типов Puppet в параграфах, озаглавленных «Автозапросы». :».
Вы также можете выражать зависимости между отдельными классами, определяя этапы , назначая им выбранные классы и объявляя порядок этапов, используя before & require. Надеюсь, вам это не понадобится.
Bonus Advanced Topic: Использование Puppet-модулей
Модули — это отдельные части конфигурации Puppet (манифесты, шаблоны, файлы), которые вы можете легко включить в свою конфигурацию, поместив их в каталог манифеста Puppet. Puppet автоматически находит их и делает их классы доступными для использования в ваших манифестах. Вы можете скачать модули из Puppet Forge .
Посмотрите примеры на странице модуля puppetlabs / mysql о том, как такой модуль будет использоваться в вашем манифесте.
С помощью Vagrant вы должны указать Vagrant предоставить модули из определенного каталога, доступного для Puppet с
1
2
3
4
|
config.vm.provision :puppet, :module_path => 'my_modules' do |puppet| puppet.manifest_file = 'my_manifest.pp' end |
(в этом случае вам потребуется манифест / рядом с вашим Vagrantfile), а затем в вашем манифесте Puppet вы можете иметь класс {‘mysql’:} и т. д.
Куда пойти дальше?
Я не рассмотрел некоторые вещи, с которыми вы можете столкнуться, такие как переменные и условные выражения , встроенные функции, такие как шаблон (..), параметризованные классы , наследование классов. Я также пропустил все связанные с мастер-агентом вещи, такие как узлы и факты. Возможно, лучше всего узнать их, когда вы сталкиваетесь с ними.
В каждом случае вы должны взглянуть на справочник типов кукол, и если у вас будет достаточно времени, вы можете начать читать Руководство по языку . В он-лайн Puppet CookBook вы можете найти много полезных фрагментов. Вы также можете загрузить учебную виртуальную машину Puppet для экспериментов с Puppet (или просто попробовать Vagrant ).
Ссылка: минималистичное практическое введение в кукольную деятельность (не только) для бродячих пользователей от нашего партнера по JCG Якуба Холи в блоге Holy Java .