Статьи

Введение в Puppet For Vagrant Users

Я не смог найти хорошего, краткого, практического введения в Puppet, которое дает вам базовые рабочие знания за минимальное время, так что вот оно. Вы узнаете, как делать простейшие вещи с Puppet — устанавливать пакеты, копировать файлы, запускать службы, выполнять команды. Я не буду вдаваться в установку Puppet, узлы и т. Д., Так как это введение ориентировано на пользователей Vagrant , который поставляется с предварительно установленным Puppet и работает в конфигурации без сервера.

Что такое кукольный?

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':
  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 обновит его, перезапустив)

Напр .:

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 .