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

Содержимое удалено Содержимое добавлено
м викификация
Строка 1:
В данном учебнике пойдёт речь об установке, базовой настройке и основных командах для кроссплатформенного клиент-серверного приложения, позволяющего централизованно управлять конфигурацией программ и операционных систем (как UNIX-подобных, так и семейства Microsoft Windows), установленных на нескольких компьютерах - — [[w:puppet|puppet]]. Для удобства клиентскую часть будем называть клиентом, серверную - — мастером (т.к.так как серверная часть программы называется puppetmaster).
{{wikipedia|Puppet}}
 
== Установка ==
 
Как правило, пакеты puppet входят в стандартные репозитории операционных систем, и называются puppet и puppet-server. Их установка требует наличия ruby.
 
Строка 31 ⟶ 30 :
Подписать сертификат и, соответственно, разрешить доступ клиенту можно командой:
<source lang="bash">puppetca --sign puppet-client.domain</source>
где "«puppet-client.domain" -» — имя клиента.
Удалить сертификат с сервера:
<source lang="bash">puppetca --clean puppet-client.domain</source>
При этом puppet позволяет пользоваться своими утилитами через подкоманды, т.е.то есть '''puppet cert = puppetca'''.
 
=== puppet.conf ===
Может содержать следующие настройки:
* '''node_name''' - — определяет, как мастер будет идентифицировать клиента для использования в манифестах, а также определяет переменные ''hostname'', ''fqdn'' и ''domain''. Возможные значения ''cert'' (использует значение '''certname''') и ''facter'' (использует ''hostname'' клиента). По умолчанию : ''cert''.
* '''manifest''' - — входной манифест который открывает puppet. По умолчанию: ''$manifestdir/site.pp''.
* '''manifestdir''' - — папка, где мастер ищет манифесты. По умолчанию: ''$confdir/manifests''.
* '''runinterval''' - — количество секунд, через которое клиент будет опрашивать мастера. По умолчанию: ''1800'' (30 минут).
* '''puppetport''' - — порт, по которому происходит обмен. По умолчанию: 8139.
* '''puppetdlockfile''' - — адрес, по которому размещается lock - — файл, запрещающий запуск нескольких копий puppet на клиенте. По умолчанию: ''$statedir/puppetdlock''.
* '''templatedir''' - — папка, где мастер ищет шаблоны.
* '''modulepath''' - — папка, где мастер ищет модули.
 
== Консольные команды ==
* '''puppet apply --configprint modulepath''' - — выводит значение конкретной настройки '''puppet.conf''' (в данном случае ''modulepath''), если ввести '''--configprint all''' можно получить полный текущий конфиг. (И сохранить перед тем как начать что-то править...править…)
* '''puppet resource <type> <id>''' - — позволяет получить описание ресурса определённого типа <type> с идентификатором <id> сразу на декларативном языке puppet. Например '''puppet resource user root'''. Тип ресурса '''user''' а его идентификатор (адрес) '''root'''
* '''puppet describe -s <type>''' - — позволяет получить описание типа, имеющихся для него команд.
* '''puppet apply <my_test_manifest.pp>''' - — выполняет указанный манифест.
* '''puppet apply -e "«include undeclaredclass"»''' - — выполнит незадекларированный класс ''undeclaredclass'', находящийся в одном из написанных вами модулей (естественно, расположенном в папке ''$modulepath'').
 
== Манифесты ==
 
Их иногда называют рецептами, представляют собой текстовые файлы с расширением '''.pp''' (По умолчанию выполняется ''$confdir/manifests/site.pp''). В манифесте могут и должны содержаться:
* Классы (class)
* Узлы (node)
* Ресурсы (т.е.то есть типы file, user и др.)
* Ссылки на другие манифесты (import)
 
Строка 65 ⟶ 64 :
 
Встроенные переменные становятся доступными благодаря утилите '''facter''', устанавливаемой вместе с puppet, которая берёт информацию из системы. Если набрать в командной строке facter, то можно получить полный список доступных переменных. Вот некоторые из них:
* '''$operatingsystem''' - — операционная система.
* '''$fqdn''' - — полное доменное имя.
* '''$hostname''' - — имя хоста.
* '''$ipaddress''' - — IP адрес.
* '''$osfamily''' - — семейство операционных систем.
* '''$is_virtual''' - — запущена ли ОС в виртуальной машине.
 
=== Гид по языку ===
Строка 145 ⟶ 144 :
 
== Основные типы ==
 
=== Общие атрибуты ===
* '''before''' - — определяет, что данный ресурс должен отработать до какого-то другого. Задаётся в виде '''метапараметра''': ''Type['title']''. Можно задавать массив метапараметров ''[Type1['title1'],Type2['title2']]''. В метапараметрах (или ссылках на ресурсы) тип ресурса обязательно указывается с большой буквы.
* '''notify''' - — создаёт отношение, аналогичное ''before'', но определяет, что следующий ресурс отработает только после того, как данный изменится. Задаётся метапараметром.
* '''require''' - — определяет, что данный ресурс должен отработать только после другого. Задаётся метапараметром.
* '''subscribe''' - — создаёт отношение, аналогичное ''require'', но определяет, что данный ресурс должен отработать только после того, как ресурс на который подписались изменится. Задаётся метапараметром.
* '''schedule''' - — определяет расписание (интервал) для запуска данного ресурса. См. тип ''shedule''.
* '''noop''' - — определяет, должен ли отработать данный ресурс. Равно ''true'' (по умолчанию) или ''false''.
 
=== notify ===
Записывает определённое сообщение в лог. Не выводит никакой информации пользователю.
 
* '''name''' - — Тэг на Ваше усмотрение, задаёт имя сообщения.
* '''message''' - — Текст, который будет отправлен в лог. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
* '''withpath''' - — Показывать или нет полный путь к объекту, если включено, то в логе будет 2 строки: само сообщение и ещё полный путь по вложениям откуда оно запускалось. Равно ''true'' или ''false'' (в мануалах пишут что по умолчанию равно ''false'', но на практике наблюдается обратное).
 
=== file ===
Позволяет управлять файлами и директориями.
* '''ensure''' - — проверка на существование файла и его тип. Имеет значения ''present'' (существует), ''absent'' (отсутствует), ''file'' (является файлом), ''directory'' (является директорией), ''link'' (является ссылкой).
* '''path''' - — Полный адрес к файлу. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
* '''source''' - — Откуда качать файл. Это адрес на мастере ''puppet:///'' или локальный.
* '''mode''' - — Права на файл (например, ''0740''). Должны задаваться числовым значением. Работает так же и с директориями.
* '''target''' - — Символьная ссылка (когда задано ''ensure => link'').
* '''recurse''' - — Определяет, обрабатывать директорию рекурсивно с подкаталогами и всем содержимым (когда задано ''ensure => directory''). Равно ''true'', ''false'' или ''remote''. ''Remote''  — указывает, что надо перебрать рекурсивно каталог на сервере и обработать на клиенте все найденные на сервере файлы. Рекурсивно на клиенте каталог обрабатываться не будет.
* '''recurselimit''' - — Определяет, как глубоко уходить в подкаталоги. Может принимать значения /^[0-9]+$/ (натуральные числа).
* '''owner''' - — Пользователь-владелец файла, задаётся по имени или UID.
* '''group''' - — Группа-владелец файла, задаётся по имени или GID.
* '''content''' - — Задаёт строку, устанавливаемую в качестве содержимого файла. Наиболее полезны в работе с шаблонами, но вы также можете использовать функции файлового вывода (консольные команды).
* '''purge''' - — Удалять ли файлы из директории которых нет на мастере у клиента (работает когда ''recurse => true''). Равно true (в директории будут только те файлы что есть на мастере, остальные удалятся) или false (синхронизируются те файлы, что есть на сервере, остальные останутся без изменений).
* '''mtime''' - — проверка на время последнего изменения файла.
* '''ctime''' - — проверка на время последнего изменения владельца или прав доступа к файлу.
* '''backup''' - — Нужно ли делать бэкап файла перед его заменой. Равно ''false'' (не надо делать резервной копии), ''.ваш_текст_начинающийся_с_точки'' (сделает резервную копию в том же месте где и был файл добавлением к нему суффикса ''.ваш_текст_начинающийся_с_точки''), ''ваш_текст_без_точки_вначале'' (сархивирует в filebucket с именем ''ваш_текст_без_точки_вначале'').
* '''force''' - — позволяет выполнить операцию даже если она уничтожит одну или несколько директорий. Требуется использовать: совместно с параметром ''purge'' (будут также удаляться и поддиректории), когда необходимо заменить директорию файлом или ссылкой, и когда удаляется директория (''ensure => absent''). Равно ''true'' или ''false''.
* Также: checksum, ignore, links, provider, recurselimit, replace, selrange, selrole, seltype, seluser, sourceselect, type.
 
=== package ===
В зависимости от системы клиента, установщик пакетов выбирается автоматически и имеет определённые свойства, полное описание на сайте [http://docs.puppetlabs.com/references/stable/type.html#package docs.puppetlabs.com]{{ref-en}}.
* '''name''' - — имя пакета. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
* '''ensure''' - — состояние данного пакета, равно ''present'' (или ''installed'', т.е.то есть пакет установлен), ''absent'' (отсутствует), ''latest'' (установлен и является последней версией), ''purged'', ''held'' (только для некоторых установщиков пакетов).
* '''provider''' - — можно вручную указать установщика пакетов из возможных aix, appdmg, apple, apt, aptitude, aptrpm, blastwave, dpkg, fink, freebsd, gem, hpux, macports, msi, nim, openbsd, pacman, pip, pkg, pkgdmg, pkgutil, portage, ports, portupgrade, rpm, rug, sun, sunfreeware, up2date, urpmi, yum (по умолчанию для ''operatingsystem == fedora, centos, redhat''), zypper.
* '''source''' - — дополнительно можно указать где взять пакет, это может быть ''URL'' или как в управлении файлами адрес ''puppet:///''.
 
=== yumrepo ===
Позволяет управлять подключенными репозиториями, посредством изменения ''/etc/yum.conf''. Большинство параметров аналогичны ''man yum.conf''.
* '''baseurl''' - — URL данного репозитория. Значение ''absent'' удалит данные репозиторий из файла полностью. Возможные значения ''absent'' и по маске ''/.*/''.
* cost
* descr
Строка 213:
=== service ===
Позволяет управлять системными службами.
* '''enable''' - — включена ли служба на автозагрузку, равно ''true'', ''false'', ''manual''.
* '''ensure''' - — текущее состояние, равно ''stopped'' (или ''false''), ''running'' (или ''true'').
* '''start, stop, restart, status''' - — позволяет задать соответственно команды на старт, остановку, перезапуск и проверку статуса вручную. Заданные команды будут использоваться при изменении статуса с помощью команды ''ensure''. Для атрибута ''status'' команда должна возвращать 0 если служба запущена и работает без ошибок, и возвращать ненулевое значение в остальных случаях.
* '''binary''' - — путь к службе (демону). Используется только в системах, которые не поддерживают init скрипт.
 
=== exec ===
Позволяет выполнять консольные команды, скрипты непосредственно при запуске puppet.
* '''command''' - — команда для запуска. Если опущена, равна заголовку. Адрес команд должен быть задан полностью, если не прописаны пути для поиска в атрибуте ''path''.
* '''path''' - — пути для поиска команд. Можно задать сразу несколько разделяя их двоеточием ':'. Чтобы не указывать этот параметр у каждого ресурса ''exec'', можно задать этот параметр по умолчанию в самом начале манифеста, например, так: ''Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin' }''.
* '''cwd''' - — текущая директория (переменная окружения $PWD в bash). Если директория не существует, команда не запустится.
* '''creates''' - — файл, который создаёт команда. Если атрибут задан, то команда не запустится, если файл существует.
* '''environment''' - — любые другие переменные окружения, которые необходимя для запуска команды. Имеет преимущество над арибутом ''path'', т.е.то есть данную переменную можно переопределить.
* '''group, user''' - — группа и пользователь с правами которых выполнять данную команду.
* '''logoutput''' - — включать ли вывод команды в лог, равно ''true'', ''false'' и ''on_failure'' (только в случае выхода с ошибкой).
* '''onlyif''' - — задаёт проверочную команду. Основная команда (атрибут ''command'') будет выполнена, только если эта команда выполнится без ошибок (код выхода будет 0), например:
<source lang="ruby">exec { "logrotate":
path => "/usr/bin:/usr/sbin:/bin",
Строка 237:
=== cron ===
Позволяет управлять планировщиком ''cron'' в Linux. К сожалению, удалить или изменить созданные вами вручную задания не сможет, так как определяет свои задания по вставляемому перед ними комментарию.
* '''command''' - — команда, которую будет выполнять ''cron''.
* '''ensure''' - — управляет наличием задания, равно ''present'' или ''absent''.
* '''hour''' - — час, равно от 0 до 23. Время здесь и далее в типе ''cron'' может быть задано как '' '2', ['2-4'], ['2,4']'', '' '*/2' '' (последнее если только ваш cron поддерживает подобное указание). По умолчанию равно '''*'''.
* '''minute''' - — минута, равно от 0 до 59.
* '''month''' - — месяц, равно от 1 до 12 или от ''january'' до ''december''.
* '''weekday''' - — день недели, равно от 0 до 7 (0 и 7 - — это воскресенье) или от ''monday'' до ''sunday''.
* '''name''' - — имя задания. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
* '''user''' - — пользователь, в задания которого оно будет включено.
 
=== schedule ===
Строка 250:
Определяет расписания отработки ресурсов. К ресурсу расписание может быть присвоено с помощью одноименного параметра (''schedule'')
В настоящее время, расписания могут использоваться только для того, чтобы предотвратить применение ресурса. Они не позволяют выполняться ресурсу вне заданных рамок и не могут назначить время когда ресурс будет запущен (для этого необходимо ипользовать '''sheduled_task''' или '''cron''').<br />
Каждый раз, когда puppet отрабатывает манифесты, она проверяет, попадает ли текущий момент времени в указанное расписание. Если попадает, то ресурс отработает, иначе будет просто пропущен. При этом puppet '''НЕ создаст себе никакого задания отработать ресурс в будущем'''. Т.е.То есть если создать расписание "«Х"» скажем ежедневно с 12:20 до 12:30, а по умолчанию puppet применяет конфигурацию раз в 30 минут, а компьютер был включен в 12:10...10… то следующий раз puppet отработает в 12:40 и все ресурсы, которым было назначено расписание "«Х"», просто не сработают. Или puppet будет отрабатывать какой-нибудь ресурс продолжительное время (загружать файлы или  т. п.) с 12:15 по 12:35, и данное расписание тоже "«выпадет"» и может вообще никогда не сработает. <br />
Поэтому, лучше использовать широкие расписания...расписания… (с интервалом в несколько часов). Например, чтобы запускать задание 1 раз в сутки между 2 и 4 часами утра надо задать следующее расписание:
<source lang="bash">schedule { 'maint':
range => "2 - 4",
Строка 257:
repeat => 1,
}</source>
* '''period''' - — Период повторения. Равно hourly, daily, weekly, monthly, never (никогда, т.е.то есть параметр ''repeat'' задаст сколько всего раз выполнится данный ресурс).
* '''periodmatch''' - — Конкретизирует параметр ''period''. Равно ''number'' (когда учитываются количество срабатываний ''в течение'' определённого период, например, в час) или ''distance'' (когда учитывается срабатывание ''через'' определённый период).
* '''range''' - — Интервал времени суток, в который действует расписание. Задаётся как "«HH:MM:SS - — HH:MM:SS"» (кавычки тоже нужны), минуты и секунды могут быть опущены.
* '''repeat''' - — Как часто срабатывать в указанный период. Должно задаваться целым числом. По умолчанию: 1.
 
=== user ===
Позволяет управлять пользователями.
* '''name''' - — Если не задан, puppet по умолчанию считывает из заголовка ресурса.
* '''uid''' - — UID пользователя. Должен задаваться цифрой, если опущено, то задаётся автоматически (или остаётся без изменений, если пользователь уже существует).
* '''ensure''' - — проверка статуса пользователя, равно ''present'' (существует), ''absent'' (отсутствует), ''role''.
* '''gid''' - — Основная группа пользователя. Задаётся по имени или GID.
* '''groups''' - — Массив дополнительных групп пользователя, через запятую. '''!!!'''Не надо включать группу, заданную как '''gid'''.
* '''home''' - — Домашняя директория пользователя.
* '''shell''' - — Оболочка пользователя (например, ''/bin/bash'')
* managehome - — Whether to manage the home directory when managing the user; if you don’t set this to true, you’ll need to create the user’s home directory manually. true or false
 
=== group ===
Позволяет управлять группами пользователей.
* '''name''' - — Если не задан, puppet по умолчанию считывает из заголовка ресурса.
* '''gid''' - — GID группы. Должен задаваться цифрой, если опущено, то задаётся автоматически (или остаётся без изменений, если группа уже существует).
* '''ensure''' - — проверка статуса группы, равно ''present'' (существует), ''absent'' (отсутствует).
 
== Модули ==
Модули - — это возможность использовать классы и функции в puppet. Модуль - — это всего лишь директория с предопреденённой структурой каталогов и файлов. Выглядит структура модуля примерно так:
<code>{имя_модуля}/
files/ - содержит различные файлы
Строка 298:
имя_модуля::класс1::под_класс1 { ... }</source>
Для того, чтобы модуль вообще заработал достаточно иметь папку с именем модуля, папку с манифесты и начальный манифест ''init.pp''.<br />
По аналогии выстраиваем под_под_классы и под_под_...под_классыпод_под_…под_классы, пока не надоест. <br />
Требуется, чтобы в каждом из файлов "«''класс1''"» ... "«''под_класс1''"» был один и только один класс с соответствующим именем: "«''имя_модуля::класс1''"» ... "«''имя_модуля::класс1::под_класс1''"». При этом файл ''init.pp'' должен содержать класс с именем "«''имя_модуля''"». <br />
Получить доступ к файлам модуля можно, например, по адресу '''puppet:///modules/имя_модуля/'''. <br />
Из директории lib можно запускать исполняемые файлы с Ruby-кодом, чтобы расширить возможности '''Puppet''' и '''Facter''' (поставщика переменных).