Я не смог найти хорошего, краткого, практического введения в Puppet, которое дает вам базовые рабочие знания за минимальное время, так что вот оно. Вы узнаете, как делать простейшие вещи с Puppet — устанавливать пакеты, копировать файлы, запускать службы, выполнять команды. Я не буду вдаваться в установку Puppet, узлы и т. Д., Так как это введение ориентировано на пользователей Vagrant , который поставляется с предварительно установленным Puppet и работает в конфигурации без сервера.
Что такое кукольный?
Puppet является поставщиком — кросс-операционным программным обеспечением, которое устанавливает операционные системы, устанавливая и конфигурируя программное обеспечение и т. Д., Основываясь на некоторой форме инструкций. Вот как пример таких инструкций — манифест — для Puppet:
# my_sample_manifest.pp class my_development_env { package {'vim': ensure => 'present' } } # Apply it include my_development_env
Запуск с
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’:} ). Вы также можете включить класс в другой класс, как этот.
Делать вещи с куклой
Установка программного обеспечения с пакетом
Наиболее используемый способ установки пакетов программного обеспечения — это простое использование пакета :
package {['vim', 'apache2']: ensure => 'present' }
Puppet поддерживает различных поставщиков пакетов и по умолчанию выбирает системного (например, apt в Ubuntu или rpm в RedHat). Вы можете явно указать другого поддерживаемого поставщика пакетов, такого как гем Ruby или пункт Python.
Вы также можете запросить определенную версию пакета (если она поддерживается) с помощью sure => ‘<version>’ или последнюю версию с sure => ‘latest’ (это также будет переустанавливать ее всякий раз, когда выпускается новая версия и запускается Puppet). ). В случае sure => ‘present’ (также называемого ‘install’): если пакет уже установлен, ничего не происходит, в противном случае устанавливается последняя версия.
Копирование и создание файлов с файлом
Создайте файл с содержимым, указанным в строке:
file {'/etc/myfile.example': ensure => 'file', content => "line1\nline2\n", }
Копировать каталог, включая его содержимое, установить владельца и т. Д .:
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) Запуск демонов с помощью сервиса
Когда вы установили необходимые пакеты и скопировали их файлы конфигурации, вы, вероятно, захотите запустить программное обеспечение, что делается с помощью сервиса :
service { 'apache2':· ensure => running,· require => Package['apache2'], }
(Мы поговорим о require позже; он гарантирует, что мы не пытаемся запустить Apache до его установки.)
В Linux Puppet удостоверяется, что служба зарегистрирована в системе для запуска после перезагрузки ОС, и запускает ее. Puppet повторно использует поддержку ОС для сервисов, таких как скрипты запуска сервиса в /etc/init.d/ (где service = имя скрипта) или выскочка Ubuntu.
Вы также можете объявить свои собственные команды запуска / остановки / состояния со свойствами с такими же именами, например, f.ex. start => ‘/ bin / myapp start’.
Когда все терпит неудачу: выполнение команд
Вы также можете выполнить любую команду оболочки с exec :
exec { 'install hive': command => 'wget http://apache.uib.no/hive/hive-0.8.1/hive-0.8.1-bin.tar.gz -O - | tar -xzC /tmp', creates => '/tmp/hive-0.8.1-bin', path => '/bin:/usr/bin', user => 'root', }
Программы должны иметь полностью определенные пути, или вы должны указать, где искать их с помощью пути .
Крайне важно, чтобы все такие команды могли выполняться многократно без вреда, т. Е. Они являются идемпотентными. Для этого вы можете указать Puppet пропустить команду, если файл существует с create =>… или если команда выполнена успешно или не выполнена, если только / onlyif .
Вы также можете запустить команду в ответ на изменение зависимого объекта, комбинируя refreshonly и подписку .
Другие вещи, чтобы сделать
Вы можете создавать пользователей и группы, регистрировать авторизованные ssh-ключи, определять записи cron, монтировать диски и многое другое — ознакомьтесь со справочником типов кукол .
Принудительное выполнение распоряжения с требованием, до, уведомить и т. Д.
Puppet обрабатывает ресурсы, указанные в случайном порядке, а не в порядке спецификации. Поэтому, если вам нужен определенный порядок — например, сначала установить пакет, затем скопировать файлы конфигурации, запустить третий сервис — тогда вы должны сообщить Puppet об этих зависимостях. Существует несколько способов выражения зависимостей и несколько типов зависимостей:
- До и требуют — простая зависимость порядка выполнения
- Уведомить и подписаться — расширенная версия before / require, которая также уведомляет зависимый ресурс всякий раз, когда ресурс зависит от изменений, используется с обновляемыми ресурсами, такими как сервисы; обычно используется между службой и ее файлом конфигурации (Puppet обновит его, перезапустив)
Напр .:
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 с
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 ).