Puppet: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
м <source> -> <syntaxhighlight> (phab:T237267)
Строка 11:
Для того, чтобы puppet работал:
* у клиента должна быть возможность соединиться с мастером по IP адресу и имени компьютера (последнее особенно важно, так как SSL сертификаты подписываются с учётом указанного имени). Для этого может потребоваться у клиента в файле /etc/hosts прописать строку с IP адресом и именем host или корректная настройка dns-сервера:
<sourcesyntaxhighlight lang="vim">192.168.0.15 puppet-master.domain</sourcesyntaxhighlight>
* должны быть открыты исходящие соединения для Puppet на порту 8140 для работы и 8139 для передачи обратных отчётов (или фаервол полностью отключен);
* должны быть синхронизированы часы (из практических соображений, так как часть команд может задаваться с привязкой ко времени и используемое SSL шифрование тоже имеет привязку к времени существования сертификатов).
Строка 17:
=== Настройка клиентов ===
Для того чтобы клиенту знать, где собственно искать мастера, необходимо в файле '''puppet.conf''' добавить строку:
<sourcesyntaxhighlight lang="bash">
[agent]
server = puppet-master.domain
node_name = cert
certname = workstation</sourcesyntaxhighlight>
вы заставите клиента при аутентификации на мастере всегда представляться как '''workstation'''. Данная настройка упрощает управление, позволяя задавать имена, соответствующие определённой целевой группе клиентов.
 
Запрос сертификата у сервера и тестовый запуск puppet (без активации службы), но при этом происходит подключение к серверу и применение всех доступных конфигураций можно выполнить как: <sourcesyntaxhighlight lang="bash">puppet agent --test</sourcesyntaxhighlight>
 
=== Подписывание сертификатов ===
В первой попытке соединиться с мастером клиенту будет отказано по причине отсутствия подписанного [[w:SSL|SSL]] сертификата, поэтому, получив отказ, клиент оставит запрос на его получение. Посмотреть список запросов можно с помощью команды:
<sourcesyntaxhighlight lang="bash">puppet cert --list</sourcesyntaxhighlight>
Подписать сертификат и, соответственно, разрешить доступ клиенту можно командой:
<sourcesyntaxhighlight lang="bash">puppet cert sign puppet-client.domain</sourcesyntaxhighlight>
где «puppet-client.domain» — имя клиента.
Удалить сертификат с сервера:
<sourcesyntaxhighlight lang="bash">puppet cert clean puppet-client.domain</sourcesyntaxhighlight>
В версиях менее третьей надо было использовать эти команды в двух вариантах, заменив '''puppet cert = puppetca'''.
 
Строка 74:
=== Гид по языку ===
* '''Условие'''
<sourcesyntaxhighlight lang="ruby">if condition {
block of code
}
Строка 82:
else {
block of code
}</sourcesyntaxhighlight>
* '''Перечисление'''
<sourcesyntaxhighlight lang="ruby">case $operatingsystem {
centos, redhat: { $apache = "httpd" }
debian, ubuntu: { $apache = "apache2" }
default: { fail("Unrecognized operating system for webserver") }
}</sourcesyntaxhighlight>
* '''Выбор'''
<sourcesyntaxhighlight lang="ruby">$apache = $operatingsystem ? {
centos => 'httpd',
redhat => 'httpd',
/(?i)(ubuntu|debian)/ => "apache2",
default => undef,
}</sourcesyntaxhighlight>
* '''Атрибуты по умолчанию'''
<sourcesyntaxhighlight lang="ruby">Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin' }
exec { 'echo this works': }</sourcesyntaxhighlight>
 
==== Классы ====
* '''Наследование классов'''
<sourcesyntaxhighlight lang="ruby">class unix {
file { '/etc/passwd':
owner => 'root',
Строка 116:
class freebsd inherits unix {
File['/etc/passwd', '/etc/shadow'] { group => 'wheel', owner => undef }
}</sourcesyntaxhighlight>
При вызове класса freebsd для файлов атрибут group изменится на wheel, а вот атрибут owner не будет проверяться вообще.
Значение атрибутов можно не заменять а добавлять:
<sourcesyntaxhighlight lang="ruby">class apache {
service { 'apache': require => Package['httpd'] }
}
Строка 125:
# host certificate is required for SSL to function
Service['apache'] { require +> File['apache.pem'] }
}</sourcesyntaxhighlight>
* '''Зависимости между классами'''
<sourcesyntaxhighlight lang="ruby">class apache {
service { 'apache': require => Class['squid'] }
}</sourcesyntaxhighlight>
Но таких конструкций лучше избегать, так как это может привести к циклам. Следующий пример позволяет этого избежать и сохраняет правило, когда один ресурс объявляется только один раз:
<sourcesyntaxhighlight lang="ruby">class myservice {
service { foo: ensure => running }
}
Строка 137:
include myservice
file { '/foo': notify => Service[foo] }
}</sourcesyntaxhighlight>
* '''Параметризированные классы'''
<sourcesyntaxhighlight lang="ruby">class apache($version , $home = '/var/www') {
# Содержимое класса
}
node webserver {
class { 'apache': version => '1.3.13' }
}</sourcesyntaxhighlight>
 
== Основные типы ==
Строка 258:
* '''logoutput''' — включать ли вывод команды в лог, равно ''true'', ''false'' и ''on_failure'' (только в случае выхода с ошибкой).
* '''onlyif''' — задаёт проверочную команду. Основная команда (атрибут ''command'') будет выполнена, только если эта команда выполнится без ошибок (код выхода будет 0), например:
<sourcesyntaxhighlight lang="ruby">exec { "logrotate":
path => "/usr/bin:/usr/sbin:/bin",
onlyif => "test `du /var/log/messages | cut -f1` -gt 100000"
}</sourcesyntaxhighlight>
При этом onlyif может проверять массив команд и выполнить основную команду только тогда, когда все команды массива выполнятся:
<sourcesyntaxhighlight lang="ruby">onlyif => ["test -f /tmp/file1", "test -f /tmp/file2"]</sourcesyntaxhighlight>
 
=== cron ===
Строка 282:
Каждый раз, когда puppet отрабатывает манифесты, она проверяет, попадает ли текущий момент времени в указанное расписание. Если попадает, то ресурс отработает, иначе будет просто пропущен. При этом puppet '''НЕ создаст себе никакого задания отработать ресурс в будущем'''. То есть если создать расписание «Х» скажем ежедневно с 12:20 до 12:30, а по умолчанию puppet применяет конфигурацию раз в 30 минут, а компьютер был включен в 12:10… то следующий раз puppet отработает в 12:40 и все ресурсы, которым было назначено расписание «Х», просто не сработают. Или puppet будет отрабатывать какой-нибудь ресурс продолжительное время (загружать файлы или т. п.) с 12:15 по 12:35, и данное расписание тоже «выпадет» и может вообще никогда не сработает. <br />
Поэтому, лучше использовать широкие расписания… (с интервалом в несколько часов). Например, чтобы запускать задание 1 раз в сутки между 2 и 4 часами утра надо задать следующее расписание:
<sourcesyntaxhighlight lang="bash">schedule { 'maint':
range => "2 - 4",
period => daily,
repeat => 1,
}</sourcesyntaxhighlight>
* '''period''' — Период повторения. Равно hourly, daily, weekly, monthly, never (никогда, то есть параметр ''repeat'' задаст сколько всего раз выполнится данный ресурс).
* '''periodmatch''' — Конкретизирует параметр ''period''. Равно ''number'' (когда учитываются количество срабатываний ''в течение'' определённого период, например, в час) или ''distance'' (когда учитывается срабатывание ''через'' определённый период).
Строка 324:
tests/</code>
Обращение в коде puppet к классам будет выглядеть как:
<sourcesyntaxhighlight lang="ruby">имя_модуля { ... }
имя_модуля::класс1 { ... }
имя_модуля::класс1::под_класс1 { ... }</sourcesyntaxhighlight>
Для того, чтобы модуль вообще заработал достаточно иметь папку с именем модуля, папку с манифестами и начальным манифестом ''init.pp''.<br />
По аналогии выстраиваем под_под_классы и под_под_…под_классы, пока не надоест. <br />