Учебники

Кукольный — Краткое руководство

Кукольный — Обзор

Puppet — это инструмент управления конфигурацией, разработанный Puppet Labs для автоматизации управления инфраструктурой и ее конфигурации. Puppet — очень мощный инструмент, который помогает понять концепцию инфраструктуры как кода. Этот инструмент написан на языке Ruby DSL, который помогает конвертировать полную инфраструктуру в формат кода, которым легко управлять и настраивать.

Puppet следует модели клиент-сервер, где один компьютер в любом кластере действует как клиент, известный как мастер-кукловод, а другой — как сервер, известный как подчиненный узел. Puppet имеет возможность управлять любой системой с нуля, начиная с начальной конфигурации и заканчивая сроком службы любой конкретной машины.

Особенности кукольной системы

Ниже приведены наиболее важные функции Puppet.

идемпотентность

Puppet поддерживает Idempotency, что делает его уникальным. Как и в Chef, в Puppet можно безопасно запускать один и тот же набор конфигурации несколько раз на одной и той же машине. В этом потоке Puppet проверяет текущее состояние целевой машины и вносит изменения только при наличии каких-либо конкретных изменений в конфигурации.

Idempotency помогает в управлении любой конкретной машиной на протяжении всего ее жизненного цикла, начиная с создания машины, изменений конфигурации машины и заканчивая сроком службы. Функция марионеточной идемпотентности очень полезна для постоянного обновления машины в течение нескольких лет, а не для многократной перестройки одной и той же машины при любых изменениях конфигурации.

Кросс-платформенная

В Puppet с помощью Resource Abstraction Layer (RAL), который использует ресурсы Puppet, можно ориентироваться на указанную конфигурацию системы, не беспокоясь о деталях реализации и о том, как команда конфигурации будет работать внутри системы, которые определены в базовой конфигурации. файл.

Кукольный — Рабочий процесс

Puppet использует следующий рабочий процесс для применения конфигурации в системе.

Workflow

  • В Puppet первое, что делает мастер Puppet, это собирает информацию о целевой машине. Используя коэффициент, который присутствует на всех узлах Puppet (аналогично Ohai в Chef), он получает все детали конфигурации уровня машины. Эти данные собираются и отправляются обратно Хозяину Марионеток.

  • Затем мастер марионеток сравнивает извлеченную конфигурацию с определенными деталями конфигурации и с определенной конфигурацией создает каталог и отправляет его целевым агентам Puppet.

  • Затем агент Puppet применяет эти конфигурации, чтобы привести систему в нужное состояние.

  • Наконец, когда целевой узел находится в желаемом состоянии, он отправляет отчет мастеру Puppet, который помогает мастеру Puppet понять, где находится текущее состояние системы, как определено в каталоге.

В Puppet первое, что делает мастер Puppet, это собирает информацию о целевой машине. Используя коэффициент, который присутствует на всех узлах Puppet (аналогично Ohai в Chef), он получает все детали конфигурации уровня машины. Эти данные собираются и отправляются обратно Хозяину Марионеток.

Затем мастер марионеток сравнивает извлеченную конфигурацию с определенными деталями конфигурации и с определенной конфигурацией создает каталог и отправляет его целевым агентам Puppet.

Затем агент Puppet применяет эти конфигурации, чтобы привести систему в нужное состояние.

Наконец, когда целевой узел находится в желаемом состоянии, он отправляет отчет мастеру Puppet, который помогает мастеру Puppet понять, где находится текущее состояние системы, как определено в каталоге.

Кукольный — Ключевые компоненты

Ниже приведены ключевые компоненты Puppet.

Ключевые компоненты

Кукольные Ресурсы

Кукольные ресурсы являются ключевыми компонентами для моделирования любой конкретной машины. Эти ресурсы имеют свою собственную модель реализации. Puppet использует ту же модель, чтобы получить любой конкретный ресурс в желаемом состоянии.

Провайдеры

Поставщики в основном являются исполнителями любого конкретного ресурса, используемого в Puppet. Например, типы пакетов ‘apt-get’ и ‘yum’ допустимы для управления пакетами. Иногда на конкретной платформе может быть доступно более одного поставщика. Хотя у каждой платформы всегда есть поставщик по умолчанию.

манифест

Манифест — это набор ресурсов, которые связаны внутри функции или классов для настройки любой целевой системы. Они содержат набор кода Ruby для настройки системы.

Модули

Модуль является ключевым строительным блоком Puppet, который может быть определен как набор ресурсов, файлов, шаблонов и т. Д. Они могут быть легко распределены по различным типам ОС, если они определены как имеющие один и тот же вид. Поскольку они могут быть легко распределены, один модуль может использоваться несколько раз с одной и той же конфигурацией.

Шаблоны

Шаблоны используют выражения Ruby для определения настраиваемого содержимого и ввода переменных. Они используются для разработки пользовательского контента. Шаблоны определяются в манифестах и ​​копируются в место в системе. Например, если кто-то хочет определить httpd с настраиваемым портом, то это можно сделать с помощью следующего выражения.

Listen <% = @httpd_port %>

Переменная httpd_port в этом случае определяется в манифесте, который ссылается на этот шаблон.

Статические файлы

Статические файлы могут быть определены как общий файл, который иногда требуется для выполнения определенных задач. Их можно просто скопировать из одного места в другое с помощью Puppet. Все статические файлы находятся внутри директории файлов любого модуля. Любые манипуляции с файлом в манифесте выполняются с использованием файлового ресурса.

Кукольный — Архитектура

Ниже приводится схематическое представление архитектуры Puppet.

Архитектура

Хозяин Марионеток

Puppet Master — это ключевой механизм, который обрабатывает все, что связано с конфигурацией. Он применяет конфигурацию к узлам с помощью агента Puppet.

Кукольный агент

Агенты Puppet — это фактические рабочие машины, которыми управляет мастер Puppet. В них работает служба демона Puppet Agent.

Репозиторий Конфиг

Это репозиторий, в котором все узлы и связанные с сервером конфигурации сохраняются и извлекаются при необходимости.

факты

Факты — это детали, относящиеся к узлу или главному компьютеру, которые в основном используются для анализа текущего состояния любого узла. На основании фактов изменения делаются на любой целевой машине. В Puppet есть заранее определенные и настраиваемые факты.

Каталог

Все файлы манифеста или конфигурации, записанные в Puppet, сначала преобразуются в скомпилированный формат, называемый каталогом, а затем эти каталоги применяются на целевом компьютере.

Кукольный — Установка

Puppet работает на архитектуре клиент-сервер, в которой мы называем сервер хозяином Puppet, а клиент — узлом Puppet. Эта настройка достигается путем установки Puppet как на клиенте, так и на всех серверах.

Для большинства платформ Puppet может быть установлен с помощью выбранного менеджера пакетов. Однако для некоторых платформ это можно сделать, установив tarball или RubyGems .

Предпосылки

Фактор является единственным предварительным условием, которое не сопровождает Ohai, который присутствует в Chef.

Стандартная библиотека ОС

Нам нужно иметь стандартный набор библиотек любой базовой ОС. Оставшаяся вся система поставляется вместе с версиями Ruby 1.8.2 +. Ниже приведен список элементов библиотеки, из которых должна состоять ОС.

  • base64
  • CGI
  • дайджест / md5
  • так далее
  • FileUtils
  • IPADDR
  • OpenSSL
  • strscan
  • системный журнал
  • URI
  • WEBrick
  • WEBrick / HTTPS
  • XMLRPC

Установка Facter

Как уже говорилось, в комплект поставки не входит стандартная версия Ruby. Таким образом, для того, чтобы получить facter в целевой системе, необходимо установить его вручную из источника, поскольку библиотека facter является предпосылкой Puppet.

Этот пакет доступен для нескольких платформ, но для большей безопасности его можно установить с помощью tarball , который помогает в получении последней версии.

Сначала скачайте тарбол с официального сайта Puppet с помощью утилиты wget .

$ wget http://puppetlabs.com/downloads/facter/facter-latest.tgz  ------: 1 

Затем распакуйте файл tar. Зайдите в каталог Untarred с помощью команды CD. Наконец, установите facter с помощью файла install.rb, который находится внутри каталога facter .

$ gzip -d -c facter-latest.tgz | tar xf - -----: 2 
$ cd facter-* ------: 3 
$ sudo ruby install.rb # or become root and run install.rb -----:4 

Установка Puppet из источника

Сначала установите архив Puppet с сайта Puppet с помощью wget . Затем извлеките тарбол в нужное место. Переместитесь в созданный каталог с помощью команды CD . Используя файл install.rb , установите Puppet на базовый сервер.

# get the latest tarball 
$ wget http://puppetlabs.com/downloads/puppet/puppet-latest.tgz -----: 1

# untar and install it 
$ gzip -d -c puppet-latest.tgz | tar xf - ----: 2 
$ cd puppet-* ------: 3 
$ sudo ruby install.rb # or become root and run install.rb -------: 4 

Установка Puppet и Facter с использованием Ruby Gem

# Installing Facter 
$ wget http://puppetlabs.com/downloads/gems/facter-1.5.7.gem 
$ sudo gem install facter-1.5.7.gem

# Installing Puppet 
$ wget http://puppetlabs.com/downloads/gems/puppet-0.25.1.gem 
$ sudo gem install puppet-0.25.1.gem 

Кукольный — Конфигурация

Как только в системе будет установлен Puppet, следующим шагом будет его настройка для выполнения определенных начальных операций.

Открытые порты брандмауэра на машинах

Чтобы сервер Puppet централизованно управлял сервером клиента, необходимо открыть указанный порт на всех машинах, т. Е. Можно использовать 8140 , если он не используется ни на одной из машин, которые мы пытаемся настроить. Нам нужно включить как TCP, так и UDP связь на всех машинах.

Конфигурационный файл

Основной файл конфигурации для Puppet это etc / puppet / puppet.conf . Все файлы конфигурации создаются в пакетной конфигурации Puppet. Большая часть конфигурации, необходимой для настройки Puppet, хранится в этих файлах, и после запуска Puppet эти конфигурации автоматически выбираются. Однако для некоторых конкретных задач, таких как настройка веб-сервера или внешнего центра сертификации (CA), Puppet имеет отдельную конфигурацию для файлов и настроек.

Файлы конфигурации сервера находятся в каталоге conf.d, который также называется мастером Puppet. Эти файлы по умолчанию расположены в /etc/puppetlabs/puppetserver/conf.d path. Эти файлы конфигурации имеют формат HOCON, который сохраняет базовую структуру JSON, но он более читабелен. Когда происходит запуск Puppet, он берет все файлы .cong из каталога conf.d и использует их для внесения любых изменений в конфигурацию. Любые изменения в этих файлах имеют место только при перезапуске сервера.

Файл списка и файл настроек

  • global.conf
  • webserver.conf
  • веб-routes.conf
  • puppetserver.conf
  • auth.conf
  • master.conf (устарело)
  • ca.conf (устарело)

В Puppet есть разные конфигурационные файлы, специфичные для каждого компонента в Puppet.

Puppet.conf

Файл Puppet.conf является основным файлом конфигурации Puppet. Puppet использует один и тот же файл конфигурации для настройки всех необходимых команд и служб Puppet. В этом файле определены все параметры, связанные с Puppet, такие как определение мастера Puppet, агента Puppet, применение Puppet и сертификаты. Марионетка может отослать их согласно требованию.

Конфигурационный файл напоминает стандартный INI-файл, в котором настройки можно перейти в конкретный раздел приложения основного раздела.

Главный раздел конфигурации

[main] 
certname = Test1.vipin.com 
server = TestingSrv 
environment = production 
runinterval = 1h 

Файл конфигурации Puppet Master

[main] 
certname = puppetmaster.vipin.com 
server = MasterSrv 
environment = production 
runinterval = 1h 
strict_variables = true  
[master] 

dns_alt_names = MasterSrv,brcleprod01.vipin.com,puppet,puppet.test.com 
reports = puppetdb 
storeconfigs_backend = puppetdb 
storeconfigs = true 
environment_timeout = unlimited 

Подробный обзор

В конфигурации Puppet файл, который будет использоваться, имеет несколько разделов конфигурации, в которых каждый раздел имеет различные виды множества параметров.

Раздел конфигурации

Файл конфигурации Puppet в основном состоит из следующих разделов конфигурации.

  • Main — Это называется глобальным разделом, который используется всеми командами и службами в Puppet. Один определяет значения по умолчанию в главном разделе, которые могут быть переопределены любым разделом, присутствующим в файле puppet.conf.

  • Мастер — этот раздел передается мастером Puppet и командой Puppet cert.

  • Агент — этот раздел упоминается службой Puppet.

  • Пользователь — в основном используется командой Puppet apply, а также многими менее распространенными командами.

Main — Это называется глобальным разделом, который используется всеми командами и службами в Puppet. Один определяет значения по умолчанию в главном разделе, которые могут быть переопределены любым разделом, присутствующим в файле puppet.conf.

Мастер — этот раздел передается мастером Puppet и командой Puppet cert.

Агент — этот раздел упоминается службой Puppet.

Пользователь — в основном используется командой Puppet apply, а также многими менее распространенными командами.

[main] 
certname = PuppetTestmaster1.example.com 

Ключевые компоненты файла конфигурации

Ниже приведены ключевые компоненты файла конфигурации.

Строки комментариев

В Puppet любая строка комментария начинается со знака ( # ). Это может быть связано с любым количеством места. Мы можем иметь частичный комментарий в той же строке.

# This is a comment. 
Testing = true #this is also a comment in same line 

Линии настроек

Строка настроек должна состоять из —

  • Любое количество пробелов (необязательно)
  • Наименование настроек
  • Знак равенства =, который может быть окружен любым количеством пробелов
  • Значение для настройки

Установка переменных

В большинстве случаев значение настроек будет одним словом, но в некоторых особых случаях специальных значений немного.

пути

В настройках файла конфигурации возьмите список каталогов. При определении этих каталогов следует иметь в виду, что они должны быть разделены символом системного пути, который является символом (:) в * nix платформах и точкой с запятой (;) в Windows.

# *nix version: 
environmentpath = $codedir/special_environments:$codedir/environments 
# Windows version: 
environmentpath = $codedir/environments;C:\ProgramData\PuppetLabs\code\environment 

В определении каталог файлов, который указан первым, сканируется, а затем перемещается в другой каталог в списке, если он не найден.

Файлы и каталоги

Все параметры, которые принимают один файл или каталог, могут принимать необязательный хэш разрешений. Когда сервер запускается, Puppet задействует эти файлы или каталоги в списке.

ssldir = $vardir/ssl {owner = service, mode = 0771} 

В приведенном выше коде разрешенный хэш — это владелец, группа и режим. Есть только два допустимых значения ключа владельца и группы.

Кукольный — Окружающая среда Conf

В Puppet все среды имеют файл environment.conf . Этот файл может переопределить несколько настроек по умолчанию, когда мастер обслуживает любой из узлов или все узлы, назначенные для этой конкретной среды.

Место нахождения

В Puppet для всех определенных сред среда file.conf находится на верхнем уровне домашней среды, рядом с директорами манифеста и модулей. Рассматривая пример, если ваша среда находится в каталогах по умолчанию (Vipin / testing / environment) , то файл конфигурации тестовой среды находится в Vipin / testing / environment / test / environment.conf .

пример

 # /etc/testingdir/code/environments/test/environment.conf  
 # Puppet Enterprise требует $ basemodulepath;  см. примечание ниже под modulepath ". 
 modulepath = site: dist: modules: $ basemodulepath  
 # Используйте наш пользовательский скрипт, чтобы получить git commit для текущего состояния кода: 
 config_version = get_environment_commit.sh 

Формат

Все файлы конфигурации в Puppet одинаково используют один и тот же INI-подобный формат. Файл environment.conf имеет тот же INI-подобный формат, что и другие, например, файл puppet.conf. Единственная разница между environment.conf и puppet.conf в том, что файл environment.conf не может содержать раздел [main]. Все настройки в файле environment.conf должны быть вне любого раздела конфигурации.

Относительный путь в ценностях

Большинство разрешенных настроек принимают путь к файлу или список путей в качестве значения. Если какой-либо из путей является релевантным путем, они начинаются без косой черты или буквы диска — они будут в основном разрешены относительно основного каталога этой среды.

Интерполяция в ценностях

Файл настроек Environment.conf может использовать значения других настроек в качестве переменных. Существует несколько полезных переменных, которые можно вставить в файл environment.conf. Вот список нескольких важных переменных —

  • $ basemodulepath — полезно для включения каталогов в настройки пути модуля. Пользователь Puppet Enterprise обычно должен включать это значение modulepath, поскольку ядро Puppet использует модуль в базовом модуле path .

  • $ environment — Используется в качестве аргумента командной строки для вашего скрипта config_version. Вы можете интерполировать эту переменную только в настройке config_version.

  • $ codedir — Полезно для поиска файлов.

$ basemodulepath — полезно для включения каталогов в настройки пути модуля. Пользователь Puppet Enterprise обычно должен включать это значение modulepath, поскольку ядро Puppet использует модуль в базовом модуле path .

$ environment — Используется в качестве аргумента командной строки для вашего скрипта config_version. Вы можете интерполировать эту переменную только в настройке config_version.

$ codedir — Полезно для поиска файлов.

Разрешенные настройки

По умолчанию в файле Puppet environment.conf разрешено переопределять только четыре параметра в конфигурации, как указано в списке.

  • ModulePath
  • манифест
  • Config_version
  • Environment_timeout

ModulePath

Это один из ключевых параметров в файле environment.conf. Все директора, определенные в modulepath, по умолчанию загружаются Puppet. Это путь, откуда Puppet загружает свои модули. Нужно явно настроить это. Если этот параметр не установлен, путь модуля по умолчанию для любой среды в Puppet будет —

 <СПРАВОЧНИК МОДУЛЕЙ ИЗ ОКРУЖАЮЩЕЙ СРЕДЫ>: $ basemodulepath 

манифест

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

Необходимо явно определить этот параметр в файле environment.conf. Если нет, то Puppet будет использовать каталог манифеста по умолчанию в качестве основного манифеста.

Config_version

Config_version может быть определена как определенная версия, используемая для идентификации каталогов и событий. Когда Puppet компилирует любой файл манифеста по умолчанию, он добавляет версию конфигурации в сгенерированные каталоги, а также в отчеты, которые генерируются, когда мастер Puppet применяет любой определенный каталог к ​​узлам Puppet. Puppet запускает скрипт для выполнения всех вышеперечисленных шагов и использует весь сгенерированный вывод как Config_version.

Тайм-аут среды

Он используется для получения подробной информации о количестве времени, которое Puppet должен использовать для загрузки данных для данной среды. Если значение определено в файле puppet.conf, то эти значения переопределят значение тайм-аута по умолчанию.

Образец файла environment.conf

 [мастер] 
    manifest = $ confdir / environment / $ environment / manifts / site.pp 
    modulepath = $ confdir / environment / $ environment / modules

В приведенном выше коде $ confdir — это путь к каталогу, в котором находятся файлы конфигурации среды. $ environment — это имя среды, для которой выполняется конфигурация.

Файл конфигурации рабочей среды

 # Файл конфигурации среды  
 # Главный каталог или файл манифеста, где Puppet начинает оценивать код  
 # Это значение по умолчанию.  Работает только с файлом site.pp или любым другим  
 манифест = манифест /  
 # Каталоги, добавленные в путь к модулю, выглядят в порядке первого совпадения:  
 # modules - Каталог для внешних модулей, заполняемый r10k на основе Puppetfile  
 # $ basemodulepath - Начиная с: конфигурация puppet print basemodulepath  
 modulepath = site: modules: $ basemodulepath  
 # Установите тайм-аут кэша для этой среды.  
 # Это переопределяет то, что установлено прямо в puppet.conf для всего сервера Puppet  
 # environment_timeout = неограничено  
 # При кешировании вам нужно очищать кеш при каждом развертывании нового кода Puppet  
 # Это также можно сделать вручную: bin / puppet_flush_environment_cache.sh  
 # Чтобы отключить кэширование каталога:  
 environment_timeout = 0  
 # Здесь мы переходим к одному в контрольном репозитории Puppet environment (и git branch)  
 # чтобы получить заголовок и необходимую информацию о последнем коммите git
 config_version = 'bin / config_script.sh $ environment' 

Кукольный — Мастер

В Puppet архитектура клиент-сервер мастера Puppet рассматривается как контролирующий орган всей установки. Хозяин Puppet действует как сервер в настройке и контролирует все действия на всех узлах.

Для любого сервера, который должен выступать в качестве мастера Puppet, на нем должно быть запущено программное обеспечение сервера Puppet. Это серверное программное обеспечение является ключевым компонентом контроля всех действий на узлах. В этой настройке следует помнить один ключевой момент — иметь доступ суперпользователя ко всем машинам, которые планируется использовать в настройке. Ниже приведены шаги по настройке Puppet master.

Предпосылки

DNS для частной сети — необходимо настроить прямую и обратную передачу, при этом каждый сервер должен иметь уникальное имя хоста. Если у вас нет настроенного DNS, то вы можете использовать частную сеть для связи с инфраструктурой.

Открытый порт брандмауэра — мастер Puppet должен быть открыт на определенном порту, чтобы он мог прослушивать входящие запросы на конкретном порту. Мы можем использовать любой порт, открытый на брандмауэре.

Создание Puppet Master Server

Мастер Puppet, который мы создаем, будет на компьютере CentOS 7 × 64 с именем Puppet в качестве имени хоста. Минимальная конфигурация системы для создания Puppet master — это два ядра процессора и 1 ГБ памяти. Конфигурация также может иметь больший размер в зависимости от количества узлов, которыми мы будем управлять с помощью этого мастера. В инфраструктуре больше, чем настроено с использованием 2 ГБ оперативной памяти.

Имя хоста Роль Частное полное доменное имя
Brcleprod001 Кукольный мастер bnrcleprod001.brcl.com

Затем необходимо сгенерировать главный SSL-сертификат Puppet, и имя главного компьютера будет скопировано в файл конфигурации всех узлов.

Установка NTP

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

Если возникает проблема временного конфликта, тогда сертификаты могут оказаться устаревшими, если есть расхождения во времени между ведущим и узлом. Протокол сетевого времени является одним из ключевых механизмов, позволяющих избежать подобных проблем.

Список доступных часовых поясов

$ timedatectl list-timezones

Приведенная выше команда предоставит полный список доступных часовых поясов. Это обеспечит регионы доступностью часового пояса.

Следующая команда может быть использована для установки необходимого часового пояса на машине.

$ sudo timedatectl set-timezone India/Delhi 

Установите NTP на компьютере сервера Puppet, используя утилиту yum компьютера CentOS.

$ sudo yum -y install ntp 

Синхронизируйте NTP с системным временем, которое мы установили в приведенных выше командах.

$ sudo ntpdate pool.ntp.org 

В обычной практике мы будем обновлять конфигурацию NTP, чтобы использовать общие пулы, которые доступны ближе к центрам обработки данных компьютеров. Для этого нам нужно отредактировать файл ntp.conf в / etc.

$ sudo vi /etc/ntp.conf 

Добавьте сервер времени из доступных часовых поясов пула NTP. Вот как выглядит файл ntp.conf.

brcleprod001.brcl.pool.ntp.org 
brcleprod002.brcl.pool.ntp.org 
brcleprod003.brcl.pool.ntp.org
brcleprod004.brcl.pool.ntp.org 

Сохраните конфигурацию. Запустите сервер и включите демон.

$ sudo systemctl restart ntpd 
$ sudo systemctl enable ntpd 

Настройка программного обеспечения Puppet Server

Программное обеспечение сервера Puppet — это программное обеспечение, которое работает на главном компьютере Puppet. Это машина, которая передает конфигурации на другие машины, на которых запущено программное обеспечение агента Puppet.

Включите официальный репозиторий Puppet labs collection с помощью следующей команды.

$ sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el7.noarch.rpm

Установите пакет puppetserver.

$ sudo yum -y install puppetserver 

Настройте распределение памяти на сервере Puppet

Как мы уже говорили, по умолчанию сервер Puppet настраивается на 2 ГБ ОЗУ. Можно настроить настройку в соответствии со свободной памятью, доступной на машине, и количеством узлов, которыми будет управлять сервер.

Отредактируйте конфигурацию сервера марионеток в режиме vi

$ sudo vi /etc/sysconfig/puppetserver  
Find the JAVA_ARGS and use the –Xms and –Xms options to set the memory allocation. 
We will allocate 3GB of space  
JAVA_ARGS="-Xms3g -Xmx3g" 

После этого сохраните и выйдите из режима редактирования.

После того, как все вышеперечисленные настройки завершены, мы готовы запустить сервер Puppet на главном компьютере с помощью следующей команды.

$ sudo systemctl start puppetserver 

Далее мы выполним настройку так, чтобы марионеточный сервер запускался при загрузке главного сервера.

$ sudo systemctl enable puppetserver 

Puppet.conf Мастер Раздел

[master] 
autosign = $confdir/autosign.conf { mode = 664 } 
reports = foreman 
external_nodes = /etc/puppet/node.rb 
node_terminus = exec 
ca = true 
ssldir = /var/lib/puppet/ssl 
certname = sat6.example.com 
strict_variables = false 
manifest = 
/etc/puppet/environments/$environment/manifests/site.pp 
modulepath = /etc/puppet/environments/$environment/modules 
config_version = 

Puppet — установка агента

Puppet agent — это программное приложение, предоставленное лабораториями Puppet, которое работает на любом узле в кластере Puppet. Если кто-то хочет управлять каким-либо сервером с помощью мастера Puppet, на этом конкретном сервере должно быть установлено программное обеспечение агента Puppet. В общем случае агент Puppet будет установлен на всех машинах, за исключением главного компьютера Puppet в любой данной инфраструктуре. Программное обеспечение агента Puppet может работать на большинстве компьютеров с Linux, UNIX и Windows. В следующих примерах мы используем программное обеспечение Puppet для установки на компьютере CentOS.

Шаг 1. Включите официальный репозиторий Puppet labs collection с помощью следующей команды.

$ sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el7.noarch.rpm

Шаг 2 — Установите пакет агента Puppet.

$ sudo yum -y install puppet-agent

Шаг 3. После установки агента Puppet включите его с помощью следующей команды.

$ sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable = true

Одна из ключевых функций агента Puppet заключается в том, что, когда агент Puppet впервые начинает работать, он генерирует сертификат SSL и отправляет его мастеру Puppet, который будет управлять им для подписания и утверждения. Как только мастер Puppet одобрит запрос подписи сертификата агента, он сможет связываться и управлять узлом агента.

Примечание. Необходимо повторить вышеуказанные шаги на всех узлах, которые необходимо настроить и управлять любым заданным мастером Puppet.

Puppet — Настройка SSL-сертификата

Когда программное обеспечение агента Puppet запускается впервые на любом узле Puppet, оно генерирует сертификат и отправляет запрос на подпись сертификата мастеру Puppet. Прежде чем сервер Puppet сможет связываться с узлами агента и управлять ими, он должен подписать сертификат этого конкретного узла агента. В следующих разделах мы опишем, как подписать и проверить запрос на подпись.

Список текущих запросов сертификатов

На хозяине Puppet выполните следующую команду, чтобы увидеть все неподписанные запросы сертификатов.

$ sudo /opt/puppetlabs/bin/puppet cert list

Поскольку мы только что настроили новый агентский узел, мы увидим один запрос на утверждение. Ниже будет вывод .

"Brcleprod004.brcl.com" (SHA259) 
15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:ll:
B5:1C:33:F7:76:67:F3:F6:45:AE:07:4B:F 6:E3:ss:04:11:8d 

Он не содержит + (знак) в начале, который указывает, что сертификат все еще не подписан.

Подпишите запрос

Чтобы подписать новый запрос сертификата, который был сгенерирован при запуске агента Puppet на новом узле, будет использоваться команда знака Puppet cert с именем хоста сертификата, который был создан вновь сконфигурированным узлом, которому требуется должен быть подписан. Поскольку у нас есть сертификат Brcleprod004.brcl.com, мы будем использовать следующую команду.

$ sudo /opt/puppetlabs/bin/puppet cert sign Brcleprod004.brcl.com 

Ниже будет вывод .

Notice: Signed certificate request for Brcle004.brcl.com 
Notice: Removing file Puppet::SSL::CertificateRequest Brcle004.brcl.com at 
'/etc/puppetlabs/puppet/ssl/ca/requests/Brcle004.brcl.com.pem' 

Сервер марионеток теперь может связываться с узлом, которому принадлежит сертификат подписи.

$ sudo /opt/puppetlabs/bin/puppet cert sign --all 

Отмена хоста из настроек Puppet

Существуют условия конфигурации ядра, когда требуется удалить хост из установки и добавить его снова. Это те условия, которыми не может управлять сама Марионетка. Это можно сделать с помощью следующей команды.

$ sudo /opt/puppetlabs/bin/puppet cert clean hostname 

Просмотр всех подписанных запросов

Следующая команда создаст список подписанных сертификатов со знаком + (знак), который указывает, что запрос утвержден.

$ sudo /opt/puppetlabs/bin/puppet cert list --all

Следующим будет его вывод .

+ "puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:
BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:B 
B:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:Brcle004.nyc3.example.com")  

+ "Brcle004.brcl.com" (SHA259) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:
1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:F E:24:11:24:54:6A 

+ " Brcle004.brcl.com" (SHA259) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3 

После того как все вышеперечисленное выполнено, у нас есть готовая инфраструктура, в которой мастер Puppet теперь может управлять вновь добавленными узлами.

Puppet — Установка и настройка r10K

В Puppet у нас есть инструмент управления кодом, известный как r10k, который помогает в управлении конфигурациями среды, связанной с различными типами сред, которые мы можем настроить в Puppet, такими как разработка, тестирование и производство. Это помогает хранить конфигурацию, связанную со средой, в хранилище исходного кода. Используя ветви репозитория управления исходным кодом, r10k создает среды на главной машине Puppet для установки и обновления среды, используя модули, присутствующие в репо.

Gem-файл может быть использован для установки r10k на любой машине, но для модульности и для получения последней версии мы будем использовать менеджер пакетов rpm и rpm. Ниже приведен пример для того же.

$ urlgrabber -o /etc/yum.repos.d/timhughes-r10k-epel-6.repo
https://copr.fedoraproject.org/coprs/timhughes/yum -y install rubygem-r10k 

Настройте среду в /etc/puppet/puppet.conf

[main] 
environmentpath = $confdir/environments 

Создайте файл конфигурации для конфигурации r10k

cat <<EOF >/etc/r10k.yaml 
# The location to use for storing cached Git repos 
:cachedir: '/var/cache/r10k' 
# A list of git repositories to create 
:sources: 
# This will clone the git repository and instantiate an environment per 
# branch in /etc/puppet/environments 
:opstree: 
#remote: 'https://github.com/fullstack-puppet/fullstackpuppet-environment.git' 
remote: '/var/lib/git/fullstackpuppet-environment.git' 
basedir: '/etc/puppet/environments' 
EOF

Установка Puppet Manifest и модуля

r10k deploy environment -pv 

Поскольку нам нужно продолжать обновлять среду каждые 15 минут, мы создадим для нее задание cron.

cat << EOF > /etc/cron.d/r10k.conf 
SHELL = /bin/bash 
PATH = /sbin:/bin:/usr/sbin:/usr/bin 
H/15 * * * * root r10k deploy environment -p 
EOF

Тестирование Установка

Чтобы проверить, все ли работает как принято, нужно скомпилировать манифест Puppet для модуля Puppet. Выполните следующую команду и получите результат YAML в качестве результата.

curl --cert /etc/puppet/ssl/certs/puppet.corp.guest.pem \ 
--key /etc/puppet/ssl/private_keys/puppet.corp.guest.pem \ 
--cacert /etc/puppet/ssl/ca/ca_crt.pem \ 
-H 'Accept: yaml' \ 
https://puppet.corp.guest:8140/production/catalog/puppet.corp.guest 

Puppet — Проверка настроек кукол

В Puppet, установка может быть проверена локально. Следовательно, как только мы настроили мастер и узел Puppet, пришло время проверить настройки локально. Нам нужно, чтобы Vagrant и Vagrant box были установлены локально, что помогает в локальном тестировании установки.

Настройка виртуальной машины

Поскольку мы тестируем настройки локально, нам фактически не требуется работающий мастер Puppet. Это означает, что без фактического запуска мастера Puppet на сервере мы можем просто использовать Puppet, чтобы применить команду для проверки правильности настройки Puppet. Команда Puppet apply применяет изменения из локального / etc / puppet в зависимости от имени хоста виртуальной машины в файле конфигурации.

Первый шаг, который нам нужно выполнить, чтобы протестировать установку, — это создать следующий Vagrantfile, запустить машину и смонтировать папку / etc / puppet на место. Все необходимые файлы будут помещены в систему контроля версий со следующей структурой.

Структура каталогов

- manifests 
   \- site.pp 
- modules 
   \- your modules  
- test 
   \- update-puppet.sh 
   \- Vagrantfile 
- puppet.conf 

Бродячий файл

# -*- mode: ruby -*- 
# vi: set ft = ruby : 
Vagrant.configure("2") do |config| 
   config.vm.box = "precise32" 
   config.vm.box_url = "http://files.vagrantup.com/precise64.box" 
   config.vm.provider :virtualbox do |vb| 
      vb.customize ["modifyvm", :id, "--memory", 1028, "--cpus", 2] 
   end 
  
   # Mount our repo onto /etc/puppet 
   config.vm.synced_folder "../", "/etc/puppet"  
   
   # Run our Puppet shell script   
   config.vm.provision "shell" do |s| 
      s.path = "update-puppet.sh" 
   end  
 
   config.vm.hostname = "localdev.example.com" 
end 

В приведенном выше коде мы использовали поставщика оболочки, в котором мы пытаемся запустить сценарий оболочки с именем update-puppet.sh . Сценарий находится в том же каталоге, где находится файл Vagrant, а содержимое сценария указано ниже.

!/bin/bash 
echo "Puppet version is $(puppet --version)" 
if [ $( puppet --version) != "3.4.1" ]; then  
   echo "Updating puppet" 
   apt-get install --yes lsb-release 
   DISTRIB_CODENAME = $(lsb_release --codename --short) 
   DEB = "puppetlabs-release-${DISTRIB_CODENAME}.deb" 
   DEB_PROVIDES="/etc/apt/sources.list.d/puppetlabs.list"  
   
   if [ ! -e $DEB_PROVIDES ] 
   then 
      wget -q http://apt.puppetlabs.com/$DEB 
      sudo dpkg -i $DEB 
   fi  
sudo apt-get update 
   sudo apt-get install -o Dpkg::Options:: = "--force-confold" 
   --force-yes -y puppet 
else 
   echo "Puppet is up to date!" 
fi 

Для дальнейшей обработки пользователю необходимо создать файл манифеста в каталоге Manifests с именем site.pp, который установит некоторое программное обеспечение на ВМ.

node 'brclelocal03.brcl.com' { 
   package { ['vim','git'] : 
      ensure => latest 
   } 
} 
echo "Running puppet" 
sudo puppet apply /etc/puppet/manifests/site.pp 

Как только пользователь подготовит вышеуказанный сценарий с необходимой конфигурацией файла Vagrant, он сможет перейти в тестовый каталог и выполнить команду vagrant up . Это загрузит новую виртуальную машину, позже установит Puppet, а затем запустит ее, используя скрипт Shell.

Ниже будет вывод.

Notice: Compiled catalog for localdev.example.com in environment production in 0.09 seconds 
Notice: /Stage[main]/Main/Node[brclelocal03.brcl.com]/Package[git]/ensure: created 
Notice: /Stage[main]/Main/Node[brcllocal03.brcl.com]/Package[vim]/ensure: ensure changed 'purged' to 'latest'

Проверка конфигурации нескольких машин

Если нам нужно проверить конфигурацию нескольких машин локально, это можно сделать, внеся изменения в файл конфигурации Vagrant.

Новый настроенный бродячий файл

config.vm.define "brclelocal003" do |brclelocal003| 
   brclelocal03.vm.hostname = "brclelocal003.brcl.com" 
end  

config.vm.define "production" do |production| 
   production.vm.hostname = "brcleprod004.brcl.com" 
end

Предположим, у нас есть новый производственный сервер, для которого требуется утилита SSL. Нам просто нужно расширить старый манифест следующей конфигурацией.

node 'brcleprod004.brcl.com' inherits 'brcleloacl003.brcl.com' { 
   package { ['SSL'] : 
      ensure => latest 
   } 
} 

После внесения изменений в конфигурационный файл манифеста нам просто нужно перейти в тестовый каталог и запустить базовую команду vagrant up, которая вызовет как машины brclelocal003.brcl.com, так и машину brcleprod004.brcl.com . В нашем случае мы пытаемся запустить производственную машину, что можно сделать, выполнив команду vagrant up production . Будет создан новый компьютер с именем производства, как определено в файле Vagrant, и на нем будет установлен пакет SSL.

Кукольный стиль кодирования

В Puppet стиль кодирования определяет все стандарты, которым необходимо следовать при попытке преобразовать инфраструктуру конфигурации машины в код. Puppet работает и выполняет все свои определенные задачи, используя ресурсы.

Определение языка Puppet помогает структурировать все ресурсы, что необходимо для управления любой целевой машиной, которой нужно управлять. Puppet использует Ruby в качестве языка кодирования, который имеет несколько встроенных функций, которые позволяют очень легко выполнить работу с помощью простой конфигурации на стороне кода.

Основные единицы

Puppet использует несколько основных стилей кодирования, которые просты для понимания и управления. Ниже приведен список немногих.

Ресурсы

В Puppet ресурсы известны как фундаментальный модуль моделирования, который используется для управления или изменения любой целевой системы. Ресурсы охватывают все аспекты системы, такие как файл, служба и пакет. Puppet имеет встроенную возможность, которая позволяет пользователям или разработчикам разрабатывать собственные ресурсы, которые помогают в управлении любым конкретным узлом машины.

В Puppet все ресурсы объединяются либо с помощью «define», либо «классы» . Эти функции агрегирования помогают в организации модуля. Ниже приведен пример ресурса, который состоит из нескольких типов, заголовка и списка атрибутов, с которыми Puppet может поддерживать несколько атрибутов. Каждый ресурс в Puppet имеет свое собственное значение по умолчанию, которое может быть переопределено при необходимости.

Образец кукольного ресурса для файла

В следующей команде мы пытаемся указать разрешение для определенного файла.

file {  
   '/etc/passwd': 
   owner => superuser, 
   group => superuser, 
   mode => 644, 
}

Всякий раз, когда вышеуказанная команда выполняется на любом компьютере, она проверяет, что файл passwd в системе настроен, как описано. Файл before: двоеточие — это заголовок ресурса, который может называться ресурсом в других частях конфигурации Puppet.

Указание локального имени в дополнение к заголовку

file { 'sshdconfig': 
   name => $operaSystem ? { 
      solaris => '/usr/local/etc/ssh/sshd_config', 
      default => '/etc/ssh/sshd_config', 
   }, 
   owner => superuser, 
   group => superuser, 
   mode => 644, 
}

Используя заголовок, который всегда один и тот же, очень легко ссылаться на файловый ресурс в конфигурации без необходимости повторения логики, связанной с ОС.

Другим примером может быть использование службы, которая зависит от файла.

service { 'sshd': 
   subscribe => File[sshdconfig], 
} 

С этой зависимостью служба sshd всегда перезапускается после изменения файла sshdconfig . Следует помнить, что File [sshdconfig] является объявлением File, как в нижнем регистре, но если мы изменим его на FILE [sshdconfig], то это будет ссылка.

При объявлении ресурса следует помнить один фундаментальный момент: он может быть объявлен только один раз для каждого файла конфигурации. Повторное объявление одного и того же ресурса более одного раза вызовет ошибку. Благодаря этой фундаментальной концепции Puppet гарантирует, что конфигурация хорошо смоделирована.

У нас даже есть возможность управлять зависимостью от ресурсов, которая помогает управлять несколькими отношениями.

service { 'sshd': 
   require => File['sshdconfig', 'sshconfig', 'authorized_keys']
}   

Metaparameters

Метапараметры известны как глобальные параметры в Puppet. Одной из ключевых особенностей метапараметра является то, что он работает с любым типом ресурсов в Puppet.

Ресурс по умолчанию

Когда нужно определить значение атрибута ресурса по умолчанию, Puppet предоставляет набор синтаксиса для его архивирования, используя спецификацию ресурса с заглавной буквы, которая не имеет заголовка.

Например, если мы хотим установить путь по умолчанию для всех исполняемых файлов, это можно сделать с помощью следующей команды.

Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin' } 
exec { 'echo Testing mataparamaters.': } 

В приведенной выше команде первый оператор Exec установит значение по умолчанию для ресурса exec. Ресурсу Exec требуется полный путь или путь, который выглядит как исполняемый файл. При этом можно определить один путь по умолчанию для всей конфигурации. По умолчанию работает с любым типом ресурса в Puppet.

Значения по умолчанию не являются глобальными значениями, однако они влияют только на область, в которой они определены, или ближайшую к нему переменную. Если кто-то хочет определить default для полной конфигурации, тогда мы определим default и класс в следующем разделе.

Коллекции Ресурсов

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

Классы и определения

Классы отвечают за моделирование фундаментальных аспектов узла. Они могут сказать, что узел — это веб-сервер, и этот конкретный узел — один из них. В Puppet классы программирования являются одноэлементными, и их можно оценивать один раз для каждого узла.

Определение, с другой стороны, может использоваться много раз на одном узле. Они работают так же, как каждый создал свой собственный тип Puppet, используя язык. Они созданы для многократного использования с разными входами каждый раз. Это означает, что в определение можно передавать значения переменных.

Разница между классом и определением

Единственное ключевое различие между классом и определением заключается в том, что при определении структуры здания и распределении ресурсов класс оценивается только один раз на узел, а с другой стороны, определение используется несколько раз на одном и том же узле.

Классы

Классы в Puppet вводятся с использованием ключевого слова class, а содержимое этого конкретного класса заключено в фигурные скобки, как показано в следующем примере.

class unix { 
   file { 
      '/etc/passwd': 
      owner => 'superuser', 
      group => 'superuser', 
      mode => 644; 
      '/etc/shadow': 
      owner => 'vipin', 
      group => 'vipin', 
      mode => 440; 
   } 
}

В следующем примере мы использовали некоторую короткую руку, которая похожа на вышеприведенную.

class unix { 
   file { 
      '/etc/passwd': 
      owner => 'superuser', 
      group => 'superuser', 
      mode => 644; 
   }  
   
   file {'/etc/shadow': 
      owner => 'vipin', 
      group => 'vipin', 
      mode => 440; 
   } 
} 

Наследование в кукольных классах

В Puppet концепция ООП наследования поддерживается по умолчанию, в которой классы могут расширять функциональность предыдущего, не копируя и не вставляя бит полного кода снова во вновь созданный класс. Наследование позволяет подклассу переопределять настройки ресурса, определенные в родительском классе. При использовании наследования следует помнить о том, что класс может наследовать функции только от одного родительского класса, но не от одного.

class superclass inherits testsubclass { 
   File['/etc/passwd'] { group => wheel } 
   File['/etc/shadow'] { group => wheel } 
}

Если есть необходимость отменить некоторую логику, указанную в родительском классе, мы можем использовать команду undef .

class superclass inherits testsubcalss { 
   File['/etc/passwd'] { group => undef } 
} 

Альтернативный способ использования наследования

class tomcat { 
   service { 'tomcat': require => Package['httpd'] } 
} 
class open-ssl inherits tomcat { 
   Service[tomcat] { require +> File['tomcat.pem'] } 
}

Вложенный класс в кукольный

Puppet поддерживает концепцию вложенности классов, в которой он позволяет использовать вложенные классы, что означает один класс внутри другого. Это помогает в достижении модульности и объема.

class testclass { 
   class nested { 
      file {  
         '/etc/passwd': 
         owner => 'superuser', 
         group => 'superuser', 
         mode => 644; 
      } 
   } 
} 
class anotherclass { 
   include myclass::nested 
} 

Параметризованные классы

В Puppet классы могут расширять свои функциональные возможности, чтобы разрешить передачу параметров в класс.

Чтобы передать параметр в классе, можно использовать следующую конструкцию —

class tomcat($version) { 
   ... class contents ... 
} 

В Puppet следует помнить один ключевой момент: классы с параметрами не добавляются с помощью функции include, скорее результирующий класс можно добавить в качестве определения.

node webserver { 
   class { tomcat: version => "1.2.12" } 
}

Значения по умолчанию как параметры в классе

class tomcat($version = "1.2.12",$home = "/var/www") { 
   ... class contents ... 
} 

Run Stages

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

Этап запуска очень полезен для управления зависимостями ресурсов. Это может быть сделано путем добавления классов на определенных этапах, где определенный класс содержит коллекцию ресурсов. С этапом выполнения Puppet гарантирует, что определенные этапы будут выполняться в указанном предсказуемом порядке каждый раз, когда каталог запускается и применяется к любому узлу Puppet.

Чтобы использовать это, нужно объявить дополнительные этапы помимо уже существующих этапов, и тогда Puppet может быть настроен для управления каждым этапом в указанном порядке, используя тот же синтаксис отношения ресурсов, прежде чем требовать «->» и «+>» . Отношения затем гарантируют порядок классов, связанных с каждым этапом.

Объявление дополнительных этапов с кукольным декларативным синтаксисом

stage { "first": before => Stage[main] } 
stage { "last": require => Stage[main] } 

После того, как этапы были объявлены, класс может быть связан с этапом, отличным от основного, используя этап.

class { 
   "apt-keys": stage => first; 
   "sendmail": stage => main; 
   "apache": stage => last; 
}

Все ресурсы, связанные с классом apt-key, будут запущены первыми. Все ресурсы в Sendmail будут основным классом, а ресурсы, связанные с Apache, будут последним этапом.

Определения

В Puppet сбор ресурсов в любом файле манифеста осуществляется с помощью классов или определений. Определения очень похожи на класс в Puppet, однако они вводятся с ключевым словом define (не class) и поддерживают аргумент, а не наследование. Они могут работать в одной системе несколько раз с разными параметрами.

Например, если кто-то хочет создать определение, управляющее репозиториями исходного кода, в которых он пытается создать несколько репозиториев в одной системе, то можно использовать определение, а не класс.

define perforce_repo($path) { 
   exec {  
      "/usr/bin/svnadmin create $path/$title": 
      unless => "/bin/test -d $path", 
   } 
} 
svn_repo { puppet_repo: path => '/var/svn_puppet' } 
svn_repo { other_repo: path => '/var/svn_other' }

Ключевой момент, который следует здесь отметить, заключается в том, как можно использовать переменную с определением. Мы используем ( $ ) переменную знака доллара. Выше мы использовали $ title. Определения могут иметь как $ title, так и $ name, которыми могут быть представлены имя и заголовок. По умолчанию $ title и $ name установлены на одно и то же значение, но можно установить атрибут title и передать другое имя в качестве параметра. $ title и $ name работают только в определении, а не в классе или другом ресурсе.

Модули

Модуль может быть определен как совокупность всех конфигураций, которые будут использоваться мастером Puppet для применения изменений конфигурации к любому конкретному узлу Puppet (агенту). Они также известны как переносимые коллекции различных видов конфигураций, которые необходимы для выполнения конкретной задачи. Например, модуль может содержать все ресурсы, необходимые для настройки Postfix и Apache.

Вершины

Узлы — это очень простой оставшийся шаг, который позволяет нам сопоставить то, что мы определили («так выглядит веб-сервер») с тем, какие машины выбраны для выполнения этих инструкций.

Определение узла в точности похоже на классы, включая вспомогательное наследование, однако они являются особыми, так что когда узел (управляемый компьютер, на котором работает клиент puppet) подключается к главному демону Puppet, его имя будет отображаться в определенном списке узлов. Определенная информация будет оценена для узла, а затем узел отправит эту конфигурацию.

Имя узла может быть коротким именем хоста или полным доменным именем (FQDN).

node 'www.vipin.com' { 
   include common 
   include apache, squid 
}

Приведенное выше определение создает узел с именем www.vipin.com и включает в себя общий, Apache и Squid.

Мы можем отправить одну и ту же конфигурацию разным узлам, разделяя их запятыми.

node 'www.testing.com', 'www.testing2.com', 'www3.testing.com' { 
   include testing 
   include tomcat, squid 
}

Регулярное выражение для совпадающих узлов

node /^www\d+$/ { 
   include testing 
}

Наследование узлов

Узел поддерживает модель ограниченного наследования. Как и классы, узлы могут наследовать только от одного другого узла.

node 'www.testing2.com' inherits 'www.testing.com' { 
   include loadbalancer 
}

В приведенном выше коде www.testing2.com наследует все функциональные возможности от www.testing.com в дополнение к дополнительному классу loadbalancer.

Расширенные поддерживаемые функции

Цитирование — В большинстве случаев нам не нужно цитировать строку в Puppet. Любая буквенно-цифровая строка, начинающаяся с буквы, должна быть оставлена ​​без кавычек. Однако всегда лучше заключать в кавычки строку для любых неотрицательных значений.

Переменная интерполяция с кавычками

До сих пор мы упоминали переменную с точки зрения определения. Если нужно использовать эти переменные со строкой, используйте двойные кавычки, а не одинарные. Строка одинарных кавычек не будет выполнять никакой переменной интерполяции, строка двойных кавычек будет делать. Переменная может заключаться в квадратные скобки в {}, что упрощает их совместное использование и облегчает понимание.

$value = "${one}${two}" 

Рекомендуется использовать одинарные кавычки для всех строк, которые не требуют интерполяции строк.

капитализация

Использование заглавных букв — это процесс, который используется для ссылки, наследования и установки атрибутов по умолчанию для конкретного ресурса. Есть два основных способа его использования.

  • Ссылки — это способ ссылки на уже созданный ресурс. Он в основном используется для целей зависимости, нужно использовать заглавную букву имени ресурса. Пример, require => file [sshdconfig]

  • Наследование — при переопределении параметра родительского класса из подкласса используйте версию имени ресурса в верхнем регистре. Использование строчной версии приведет к ошибке.

  • Установка значения атрибута по умолчанию — Использование заглавного ресурса без заголовка работает для установки ресурса по умолчанию.

Ссылки — это способ ссылки на уже созданный ресурс. Он в основном используется для целей зависимости, нужно использовать заглавную букву имени ресурса. Пример, require => file [sshdconfig]

Наследование — при переопределении параметра родительского класса из подкласса используйте версию имени ресурса в верхнем регистре. Использование строчной версии приведет к ошибке.

Установка значения атрибута по умолчанию — Использование заглавного ресурса без заголовка работает для установки ресурса по умолчанию.

Массивы

Puppet позволяет использовать массивы в нескольких областях [Один, два, три].

Несколько членов типа, таких как псевдоним в определении хоста, принимают массивы в своих значениях. Ресурс хоста с несколькими псевдонимами будет выглядеть примерно так:

host { 'one.vipin.com': 
   alias => [ 'satu', 'dua', 'tiga' ], 
   ip => '192.168.100.1', 
   ensure => present, 
}

Приведенный выше код добавит хост ‘one.brcletest.com’ в список хостов с тремя псевдонимами ‘satu’ ‘dua’ ‘tiga’ . Если кто-то хочет добавить несколько ресурсов к одному ресурсу, это можно сделать, как показано в следующем примере.

resource { 'baz': 
   require => [ Package['rpm'], File['testfile'] ], 
}

переменные

Puppet поддерживает несколько переменных, как и большинство других языков программирования. Переменные кукол обозначаются символом $ .

$content = 'some content\n' 
file { '/tmp/testing': content => $content } 

Как указывалось ранее, Puppet является декларативным языком, что означает, что его область действия и правила назначения отличаются от императивного языка. Основное отличие состоит в том, что нельзя изменить переменную в одной области видимости, поскольку они определяют порядок в файле для определения значения переменной. Порядок не имеет значения на декларативном языке.

$user = root 
file {  
   '/etc/passwd': 
   owner => $user, 
} 

$user = bin 
   file {  
      '/bin': 
      owner => $user, 
      recurse => true, 
   }

Переменная сфера

Область действия переменных определяет, являются ли все переменные, которые определены, действительными. Как и в случае с последними функциями, в настоящее время Puppet имеет динамическую область действия, что в терминах Puppet означает, что все определяемые переменные оцениваются по их области видимости, а не по месту, в котором они определены.

$test = 'top' 
class Testclass { 
   exec { "/bin/echo $test": logoutput => true } 
} 

class Secondtestclass { 
   $test = 'other' 
   include myclass 
} 

include Secondtestclass 

Квалифицированная переменная

Puppet поддерживает использование квалифицированных переменных внутри класса или определения. Это очень полезно, когда пользователь хочет использовать ту же переменную в других классах, которые он определил или собирается определить.

class testclass { 
   $test = 'content' 
} 

class secondtestclass { 
   $other = $myclass::test 
} 

В приведенном выше коде значение переменной $ other оценивает содержимое.

Conditionals

Условия — это ситуации, когда пользователь желает выполнить набор операторов или кода, когда определенное условие или требуемое условие выполнены. Puppet поддерживает два типа условий.

Условие выбора, которое можно использовать только в пределах определенных ресурсов для выбора правильного значения машины.

Условия оператора — это более широко используемые условия в манифесте, которые помогают включать дополнительные классы, которые пользователь желает включить в тот же файл манифеста. Определите отдельный набор ресурсов внутри класса или примите другие структурные решения.

Селекторы

Селекторы полезны, когда пользователь желает указать атрибут ресурса и переменные, которые отличаются от значений по умолчанию на основе фактов или других переменных. В Puppet индекс селектора работает как многозначный трехсторонний оператор. Селекторы также могут определять пользовательские значения по умолчанию без значений, которые определены в манифесте и соответствуют условию.

$owner = $Sysoperenv ? { 
   sunos => 'adm', 
   redhat => 'bin', 
   default => undef, 
}

В более поздних версиях Puppet 0.25.0 селекторы могут использоваться как регулярные выражения.

$owner = $Sysoperenv ? { 
   /(Linux|Ubuntu)/ => 'bin', 
   default => undef, 
}

В приведенном выше примере значение селектора $ Sysoperenv соответствует либо Linux, либо Ubuntu, тогда выбранным будет результат bin, в противном случае для пользователя будет задано значение undefined.

Состояние заявления

Условие оператора — это другой тип условного оператора в Puppet, который очень похож на условие переключения в сценарии Shell. При этом определяется несколько наборов регистров, и заданные входные значения сопоставляются с каждым условием.

Оператор case, который соответствует данному входному условию, выполняется. Это условие оператора case не имеет никакого возвращаемого значения. В Puppet очень распространенным случаем использования оператора условия является запуск набора битов кода, основанных на базовой операционной системе.

case $ Sysoperenv { 
   sunos: { include solaris }  
   redhat: { include redhat }  
   default: { include generic}  
}

Оператор Case также может указывать несколько условий, разделяя их запятой.

case $Sysoperenv { 
   development,testing: { include development } testing,production: { include production }
   default: { include generic }  
} 

If-Else Заявление

Puppet поддерживает концепцию условной операции. Для этого оператор If / else предоставляет параметры ветвления, основанные на возвращаемом значении условия. Как показано в следующем примере —

if $Filename { 
   file { '/some/file': ensure => present } 
} else { 
   file { '/some/other/file': ensure => present } 
} 

Последняя версия Puppet поддерживает переменное выражение, в котором оператор if также может переходить в зависимости от значения выражения.

if $machine == 'production' { 
   include ssl 
} else { 
   include nginx 
}

Чтобы добиться большего разнообразия в коде и выполнять сложные условные операции, Puppet поддерживает вложенный оператор if / else, как показано в следующем коде.

if $ machine == 'production' { 
   include ssl 
} elsif $ machine == 'testing' { 
   include nginx
} else { 
   include openssl 
} 

Виртуальный ресурс

Виртуальные ресурсы — это те, которые не отправляются клиенту, если не реализованы.

Ниже приводится синтаксис использования виртуального ресурса в Puppet.

@user { vipin: ensure => present } 

В приведенном выше примере пользователь vipin определен виртуально, чтобы реализовать определение, которое можно использовать в коллекции.

User <| title == vipin |>

Комментарии

Комментарии используются в любом бите кода для создания дополнительного узла о наборе строк кода и его функциональности. В Puppet в настоящее время поддерживаются два типа комментариев.

  • Комментарии в стиле оболочки Unix. Они могут быть на своей или следующей строке.
  • Многострочные комментарии в стиле c.

Ниже приведен пример комментария в стиле оболочки.

# this is a comment

Ниже приведен пример многострочного комментария.

/* 
This is a comment 
*/ 

Приоритет оператора

Приоритет оператора Puppet соответствует стандартному приоритету в большинстве систем, от самого высокого до самого низкого.

Ниже приведен список выражений

  • ! = нет
  • / = раз и разделить
  • — + = минус, плюс
  • << >> = сдвиг влево и вправо
  • ==! = = не равно, равно
  • > = <=> <= больше равно, меньше или равно, больше чем, меньше чем

Выражение сравнения

Выражение сравнения используется, когда пользователь хочет выполнить набор операторов, когда данное условие удовлетворяется. Выражения сравнения включают тесты на равенство с использованием выражения ==.

if $environment == 'development' { 
   include openssl 
} else { 
   include ssl 
} 

Не равный пример

if $environment != 'development' { 
   $otherenvironment = 'testing' 
} else { 
   $otherenvironment = 'production' 
} 

Арифметическое выражение

$one = 1 
$one_thirty = 1.30 
$two = 2.034e-2 $result = ((( $two + 2) / $one_thirty) + 4 * 5.45) - 
   (6 << ($two + 4)) + (0×800 + -9)

Логическое выражение

Логические выражения возможны с использованием или, и, & not.

$one = 1 
$two = 2 
$var = ( $one < $two ) and ( $one + 1 == $two ) 

Регулярное выражение

Puppet поддерживает сопоставление регулярных выражений, используя = ~ (совпадение) и! ~ (Не совпадение).

if $website =~ /^www(\d+)\./ { 
   notice('Welcome web server #$1') 
}

Как в случае с регулярным выражением выбора, так и с помощью селектора создается ограниченная переменная области видимости для каждого регулярного выражения.

exec { "Test": 
   command => "/bin/echo now we don’t have openssl installed on machine > /tmp/test.txt", 
   unless => "/bin/which php" 
}

Точно так же мы можем использовать, если, если только не выполнить команду все время, кроме команды, если не завершается успешно.

exec { "Test": 
   command => "/bin/echo now we don’t have openssl installed on machine > /tmp/test.txt", 
   unless => "/bin/which php" 
}

Работа с шаблонами

Шаблоны используются, когда кто-то хочет иметь заранее заданную структуру, которая будет использоваться для нескольких модулей в Puppet, и эти модули будут распределены на нескольких машинах. Первый шаг для использования шаблона — создать тот, который отображает содержимое шаблона с помощью методов шаблона.

file { "/etc/tomcat/sites-available/default.conf": 
   ensure => "present", 
   content => template("tomcat/vhost.erb")  
}

Puppet делает несколько предположений при работе с локальными файлами, чтобы обеспечить организацию и модульность. Puppet ищет шаблон vhost.erb внутри папки apache / templates, внутри каталога модулей.

Определение и запуск сервисов

В Puppet у него есть ресурс под названием service, который способен управлять жизненным циклом всех сервисов, работающих на любой конкретной машине или среде. Сервисные ресурсы используются, чтобы убедиться, что сервисы инициализированы и включены. Они также используются для перезапуска службы.

Например, в предыдущем шаблоне tomcat, который у нас есть, где мы устанавливаем виртуальный хост apache. Если кто-то хочет убедиться, что apache перезапускается после смены виртуального хоста, нам нужно создать ресурс службы для службы apache, используя следующую команду.

service { 'tomcat': 
   ensure => running, 
   enable => true 
}

При определении ресурсов нам нужно включить опцию уведомления, чтобы запустить перезапуск.

file { "/etc/tomcat/sites-available/default.conf": 
   ensure => "present", 
   content => template("vhost.erb"), 
   notify => Service['tomcat']  
}

Кукольный — Манифест

В Puppet все программы, написанные на языке программирования Ruby и сохраненные с расширением .pp , называются манифестами . В общих чертах, все программы Puppet, созданные с целью создания или управления любым целевым хостом, называются манифестом. Все программы, написанные на Puppet, следуют стилю кодирования Puppet.

Суть Puppet — это способ объявления ресурсов и то, как эти ресурсы представляют их состояние. В любом манифесте пользователь может иметь коллекцию ресурсов различного типа, которые сгруппированы с использованием класса и определения.

В некоторых случаях манифест Puppet может даже иметь условное выражение для достижения желаемого состояния. Однако в конечном итоге все сводится к тому, чтобы убедиться, что все ресурсы определены и используются правильно, а определенный манифест при применении после преобразования в каталог способен выполнить задачу, для которой он был разработан.

Рабочий процесс файла манифеста

Кукольный манифест состоит из следующих компонентов —

  • Файлы (это обычные файлы, в которых Puppet не имеет ничего общего с ними, просто чтобы взять их и поместить в нужное место)

  • Ресурсы

  • Шаблоны (их можно использовать для создания файлов конфигурации на узле).

  • Узлы (все определения, относящиеся к клиентскому узлу, определены здесь)

  • Классы

Файлы (это обычные файлы, в которых Puppet не имеет ничего общего с ними, просто чтобы взять их и поместить в нужное место)

Ресурсы

Шаблоны (их можно использовать для создания файлов конфигурации на узле).

Узлы (все определения, относящиеся к клиентскому узлу, определены здесь)

Классы

Указывает на заметку

  • В Puppet все файлы манифеста используют Ruby в качестве языка кодирования и сохраняются с расширением .pp .

  • Оператор «import» во многих манифестах используется для загрузки файлов при запуске Puppet.

  • Для того чтобы импортировать все файлы, содержащиеся в каталоге, вы можете использовать оператор импорта другим способом, например, import «clients / *». Это позволит импортировать все файлы .pp внутри этого каталога.

В Puppet все файлы манифеста используют Ruby в качестве языка кодирования и сохраняются с расширением .pp .

Оператор «import» во многих манифестах используется для загрузки файлов при запуске Puppet.

Для того чтобы импортировать все файлы, содержащиеся в каталоге, вы можете использовать оператор импорта другим способом, например, import «clients / *». Это позволит импортировать все файлы .pp внутри этого каталога.

манифест

Письменные манифесты

Работа с переменными

При написании манифеста пользователь может определить новую переменную или использовать существующую переменную в любой точке манифеста. Puppet поддерживает различные типы переменных, но некоторые из них часто используются, такие как строки и массив строк. Помимо них, другие форматы также поддерживаются.

Пример строковой переменной

$package = "vim"  

package {  $package: 
   ensure => "installed" 
}

Использование циклов

Циклы используются, когда нужно пройти несколько итераций на одном и том же наборе кода, пока не будет выполнено определенное условие. Они также используются для выполнения повторяющихся задач с различным набором значений. Создание 10 заданий для 10 разных вещей. Можно создать одну задачу и использовать цикл для повторения задачи с разными пакетами, которые нужно установить.

Чаще всего массив используется для повторения теста с разными значениями.

$packages = ['vim', 'git', 'curl']  

package { $packages: 
   ensure => "installed" 
}

Использование условных выражений

Puppet поддерживает большую часть условной структуры, которую можно найти в традиционных языках программирования. Условие может использоваться для динамического определения, выполнять ли конкретную задачу или набор кода должен выполняться. Например if / else и case. Кроме того, такие условия, как execute, также поддерживают атрибуты, которые работают как условие, но принимают только вывод команды в качестве условия.

if $OperatingSystem != 'Linux' { 
   warning('This manifest is not supported on this other OS apart from linux.') 
} else { 
   notify { 'the OS is Linux. We are good to go!': }
} 

Кукольный — Модуль

В Puppet модуль может быть определен как набор ресурсов, классов, файлов, определений и шаблонов. Puppet поддерживает простое перераспределение модулей, что очень полезно при модульности кода, поскольку можно написать указанный универсальный модуль и использовать его несколько раз с минимальными изменениями кода. Например, это включит конфигурацию сайта по умолчанию в / etc / puppet, а модули, поставляемые собственно Puppet, находятся в / etc / share / puppet.

Конфигурация модуля

В любом модуле Puppet у нас есть два раздела, которые помогают определить структуру кода и управлять деноминациями.

  • Путь поиска модулей настраивается с использованием разделенного двоеточиями списка каталогов в puppetmasterd или masterd , последнем разделе главного файла конфигурации Puppet с параметром modulepath .

Путь поиска модулей настраивается с использованием разделенного двоеточиями списка каталогов в puppetmasterd или masterd , последнем разделе главного файла конфигурации Puppet с параметром modulepath .

[puppetmasterd] 
... 
modulepath = /var/lib/puppet/modules:/data/puppet/modules 

    Путь поиска можно добавить во время выполнения, установив переменную среды PUPPETLAB, которая также должна быть разделенным двоеточиями списком переменных.

  • Настройки контроля доступа для модулей файлового сервера в fileserver.conf, конфигурация пути для этого модуля всегда игнорируется, и при указании пути будет выдано предупреждение.

Путь поиска можно добавить во время выполнения, установив переменную среды PUPPETLAB, которая также должна быть разделенным двоеточиями списком переменных.

Настройки контроля доступа для модулей файлового сервера в fileserver.conf, конфигурация пути для этого модуля всегда игнорируется, и при указании пути будет выдано предупреждение.

Модули Источник

Puppet поддерживает другое место для хранения модулей. Любой модуль может храниться в другой файловой системе любого конкретного компьютера. Однако все пути, в которых хранятся модули, должны быть указаны в переменной конфигурации, известной как modulepath, которая в общем случае является переменной пути, где Puppet сканирует все каталоги модулей и загружает их при загрузке.

Разумный путь по умолчанию может быть настроен как —

/etc/puppet/modules:/usr/share/puppet:/var/lib/modules. 

В качестве альтернативы каталог / etc / puppet может быть установлен как специальный анонимный модуль, который всегда ищется первым.

Наименование модуля

Puppet следует тем же стандартам именования конкретного модуля, где имя модуля должно быть обычными словами, соответствующими [- \\ w +] (буква, слово, число, подчеркивание и тире) и не содержащими разделитель пространства имен:: или /. Хотя это может быть разрешено в отношении иерархий модулей, для новых модулей оно не может быть вложенным.

Модуль Внутренняя Организация

Когда пользователь создает новый модуль в Puppet, он следует той же структуре и содержит манифест, распределенный файл, плагины и шаблоны, расположенные в определенной структуре каталогов, как показано в следующем коде.

MODULE_PATH/ 
   downcased_module_name/ 
      files/ 
      manifests/ 
         init.pp 
      lib/ 
         puppet/ 
            parser/ 
               functions 
            provider/ 
            type/ 
         facter/ 
      templates/ 
      README 

Всякий раз, когда модуль создается, он содержит файл манифеста init.pp в указанном месте исправления в каталоге манифестов. Этот файл манифеста является файлом по умолчанию, который выполняется первым в любом конкретном модуле и содержит коллекцию всех классов, связанных с этим конкретным модулем. Дополнительный файл .pp можно добавить прямо в папку манифестов. Если мы добавляем дополнительные файлы .pp, они должны быть названы в честь класса.

Одной из ключевых особенностей, достигаемых с помощью модулей, является совместное использование кода. Модуль по своей природе должен быть автономным, что означает, что нужно иметь возможность включать любой модуль из любого места и помещать его в путь к модулю, который загружается при загрузке Puppet. С помощью модулей можно получить модульность в кодировании инфраструктуры Puppet.

модуль

пример

Рассмотрим модуль autofs, который устанавливает фиксированную карту auto.homes и генерирует auto.master из шаблонов.

class autofs { 
   package { autofs: ensure => latest } 
   service { autofs: ensure => running } 
   
   file { "/etc/auto.homes": 
      source => "puppet://$servername/modules/autofs/auto.homes" 
   } 
   file { "/etc/auto.master": 
      content => template("autofs/auto.master.erb") 
   } 
}

Файловая система будет иметь следующие файлы.

MODULE_PATH/ 
autofs/ 
manifests/ 
init.pp 
files/ 
auto.homes 
templates/ 
auto.master.erb 

Модуль Поиск

Puppet следует предварительно определенной структуре, в которой он содержит несколько каталогов и подкаталогов в определенной структуре. Эти каталоги содержат файлы различного типа, которые требуются модулю для выполнения определенных действий. Небольшое закулисное волшебство гарантирует, что правильный файл связан с правильным контекстом. Все поиски модуля находятся в модульном пути, разделенном двоеточиями списке каталогов.

Для ссылок на файл на файловом сервере используется аналогичная ссылка, так что ссылка на puppet: //$servername/modules/autofs/auto.homes преобразуется в файл autofs / files / auto.homes в пути модуля.

Чтобы сделать модуль пригодным для использования как с клиентом командной строки, так и с мастером марионеток, можно использовать URL-адрес пути from puppet: ///. т.е. URL без явного имени сервера. Такие URL немного различаются в Puppet и puppetd . Puppet ищет бессерверный URL в локальной файловой системе.

Поиск в файлах шаблонов осуществляется аналогично манифесту и файлам: упоминание шаблона («autofs / auto.master.erb») заставит puppetmaster сначала найти файл в $ templatedir / autofs / auto.master.erb, а затем autofs / templates / auto.master.erb в пути к модулю. С Puppet-версиями всего под Puppet он доступен для использования. Это называется автоматической загрузкой модуля. Puppet попытается автоматически загрузить классы и определения из модуля.

Кукольный — Файловый сервер

Puppet следует концепции клиента и сервера, где один компьютер в установке работает как серверный компьютер с запущенным на нем программным обеспечением Puppet, а остальные работают как клиент с запущенным программным обеспечением агента Puppet. Эта функция файлового сервера помогает копировать файлы на нескольких компьютерах. Эта функция функции обслуживания файлов в Puppet входит в состав центрального демона Puppet. Puppetmasterd и клиентская функция играют ключевую роль в поиске атрибутов файла как объекта файла.

class { 'java':  
   package               => 'jdk-8u25-linux-x64',  
   java_alternative      => 'jdk1.8.0_25',  
   java_alternative_path => '/usr/java/jdk1.8.0_25/jre/bin/java'  
}

Как и в приведенном выше фрагменте кода, функции обслуживания файлов Puppet абстрагируют топологию локальной файловой системы, поддерживая модуль файловой службы. Мы будем указывать модуль обслуживания файлов следующим образом.

“puppet://server/modules/module_name/sudoers”

Формат файла

В структуре каталогов Puppet по умолчанию конфигурация файлового сервера находится в каталоге /etc/puppet/fileserver.config. Если пользователь желает изменить этот путь к файлу конфигурации по умолчанию, это можно сделать с помощью нового флага конфигурации для puppetmasterd . Файл конфигурации напоминает INI-файлы, но не точно такой же.

[module] 
path /path/to/files 
allow *.domain.com 
deny *.wireless.domain.com 

Как показано в приведенном выше фрагменте кода, все три параметра представлены в файле конфигурации. Название модуля несколько в скобках. Путь является единственным обязательным параметром. Параметр безопасности по умолчанию запрещает весь доступ, поэтому, если разрешенные строки не указаны, модуль, который будет настроен, будет доступен любому.

Путь может содержать любой или все% d,% h и% H, которые динамически заменяются его доменным именем, именем хоста и полным именем хоста. Все они взяты из SSL-сертификата клиента (поэтому будьте осторожны, если есть несоответствие имени хоста и имени сертификата). Это полезно при создании модулей, в которых файлы каждого клиента хранятся совершенно отдельно. Пример для приватных ключей хоста.

[private] 
path /data/private/%h 
allow * 

В приведенном выше фрагменте кода код пытается найти файл /private/file.txt с клиента client1.vipin.com . Он будет искать его в /data/private/client1/file.txt, а тот же запрос для client2.vipin.com попытается получить файл /data/private/client2/file.txt на файловом сервере.

Безопасность

Puppet поддерживает две основные концепции защиты файлов на файловом сервере Puppet. Это достигается путем предоставления доступа к определенным файлам и отказа в доступе к тем, которые не требуются. По умолчанию Puppet не разрешает доступ ни к одному из файлов. Это должно быть определено явно. Формат, который можно использовать в файлах для разрешения или запрета доступа, заключается в использовании IP-адреса, имени или глобального разрешения.

Если клиент не подключен к файловому серверу Puppet напрямую, например, с использованием обратного прокси-сервера и Mongrel, то файловый сервер будет видеть все подключения как с прокси-сервера, а не клиента Puppet. В указанных выше случаях ограничение имени хоста на основе имени хоста является наилучшей практикой.

При определении структуры файла следует отметить один ключевой момент: все операторы deny анализируются перед оператором allow. Следовательно, если какой-либо оператор deny совпадает с хостом, то этому хосту будет отказано, и если в следующих файлах не будет записан оператор allow, то хост будет отклонен. Эта функция помогает установить приоритет любого конкретного сайта.

Имя хоста

В любой конфигурации файлового сервера имя хоста файла можно указать двумя способами: либо с использованием полного имени хоста, либо путем указания полного имени домена с использованием подстановочного знака *, как показано в следующем примере.

[export] 
path /usr 
allow brcleprod001.brcl.com 
allow *.brcl.com 
deny brcleprod002.brcl.com

Айпи адрес

В любой конфигурации файлового сервера адрес файла может быть указан как аналогичный именам хостов, используя либо полный IP-адрес, либо подстановочный адрес. Можно также использовать системную нотацию CIDR.

[export] 
path /usr 
allow 127.0.0.1 
allow 172.223.30.* 
allow 172.223.30.0/24 

Глобальный Разрешить

Глобальное разрешение используется, когда пользователь хочет, чтобы каждый мог получить доступ к определенному модулю. Для этого один подстановочный знак помогает каждому получить доступ к модулю.

[export] 
path /export 
allow * 

Кукольный — Facter & Facts

Puppet поддерживает хранение нескольких значений в качестве переменной среды. Эта функция поддерживается в Puppet с помощью Facter . В Puppet facter — это автономный инструмент, который содержит переменную уровня среды. In можно рассматривать как переменную env в Bash или Linux. Иногда может происходить дублирование информации, хранящейся в фактах, и переменной среды машины. В Puppet пара ключ-значение называется «факт». Каждый ресурс имеет свои собственные факты, и в Puppet у пользователя есть возможности для создания своих собственных пользовательских фактов.

# facter 

Команда Facter может использоваться для вывода списка всех переменных среды и связанных с ними значений. Эта коллекция фактов поставляется с готовой информацией и упоминается как основные факты. Можно добавить пользовательские факты в коллекцию.

Если кто-то хочет просмотреть только одну переменную. Это можно сделать с помощью следующей команды.

# facter {Variable Name}  

Example 
[root@puppetmaster ~]# facter virtual 
virtualbox 

Причина, по которой facter важен для Puppet, заключается в том, что facter и факты доступны во всем коде Puppet как «глобальная переменная» , что означает, что он может использоваться в коде в любой момент времени без каких-либо других ссылок.

Пример для тестирования

[root@puppetmaster modules]# tree brcle_account 
brcle_account 
└── manifests  └── init.pp [root@puppetmaster modules]# cat brcle_account/manifests/init.pp  
class brcle_account {  
   user { 'G01063908': 
      ensure => 'present', 
      uid => '121', 
      shell => '/bin/bash', 
      home => '/home/G01063908', 
   }  
   
   file {'/tmp/userfile.txt': 
      ensure => file, 
      content => "the value for the 'OperatingSystem' fact is: $OperatingSystem \n", 
   } 
} 

Тестирование Это

[root@puppetmaster modules]# puppet agent --test 
Notice: /Stage[main]/Activemq::Service/Service[activemq]/ensure: 
ensure changed 'stopped' to 'running' 
Info: /Stage[main]/Activemq::Service/Service[activemq]: 
Unscheduling refresh on Service[activemq] 

Notice: Finished catalog run in 4.09 seconds  
[root@puppetmaster modules]# cat /tmp/testfile.txt  
the value for the 'OperatingSystem' fact is: Linux   

[root@puppetmaster modules]# facter OperatingSystem 
Linux

Как мы можем заметить в приведенном выше фрагменте кода, мы не определили OperatingSystem . Мы только что заменили значение мягким кодированным значением $ OperatingSystem в качестве обычной переменной.

В Puppet есть три типа фактов, которые можно использовать и определить:

  • Основные факты
  • Пользовательские факты
  • Внешние факты

Основные факты определены на верхнем уровне и доступны всем в любой точке кода.

Кукольные Факты

Непосредственно перед тем, как агент запрашивает каталог у мастера, он сначала составляет полный список информации, доступной сам по себе, в форме пары ключ-значение. Информация об агенте собирается инструментом под названием facter, и каждая пара ключ-значение называется фактом. Ниже приводится общий вывод фактов об агенте.

[root@puppetagent1 ~]# facter
architecture => x86_64 
augeasversion => 1.0.0 
bios_release_date => 13/09/2012 
bios_vendor => innotek GmbH 
bios_version => VirtualBox 
blockdevice_sda_model => VBOX HARDDISK 
blockdevice_sda_size => 22020587520 
blockdevice_sda_vendor => ATA 
blockdevice_sr0_model => CD-ROM 
blockdevice_sr0_size => 1073741312 
blockdevice_sr0_vendor => VBOX 
blockdevices => sda,sr0 
boardmanufacturer => Oracle Corporation 
boardproductname => VirtualBox 
boardserialnumber => 0 

domain => codingbee.dyndns.org  
facterversion => 2.1.0 
filesystems => ext4,iso9660 
fqdn => puppetagent1.codingbee.dyndns.org 
hardwareisa => x86_64 
hardwaremodel => x86_64 
hostname => puppetagent1 
id => root 
interfaces => eth0,lo 
ipaddress => 172.228.24.01 
ipaddress_eth0 => 172.228.24.01 
ipaddress_lo => 127.0.0.1 
is_virtual => true 
kernel => Linux 
kernelmajversion => 2.6 
kernelrelease => 2.6.32-431.23.3.el6.x86_64 
kernelversion => 2.6.32 
lsbdistcodename => Final 
lsbdistdescription => CentOS release 6.5 (Final) 
lsbdistid => CentOS 
lsbdistrelease => 6.5 
lsbmajdistrelease => 6 
lsbrelease => :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0noarch:graphics-4.0-amd64:
graphics-4.0-noarch:printing-4.0-amd64:printing-4.0noarch 
macaddress => 05:00:22:47:H9:77 
macaddress_eth0 => 05:00:22:47:H9:77 
manufacturer => innotek GmbH 
memoryfree => 125.86 GB 
memoryfree_mb => 805.86 
memorysize => 500 GB 
memorysize_mb => 996.14 
mtu_eth0 => 1500 
mtu_lo => 16436 
netmask => 255.255.255.0 
netmask_eth0 => 255.255.255.0  

network_lo => 127.0.0.0 
operatingsystem => CentOS 
operatingsystemmajrelease => 6 
operatingsystemrelease => 6.5 
osfamily => RedHat 
partitions => {"sda1"=>{
"uuid"=>"d74a4fa8-0883-4873-8db0-b09d91e2ee8d", "size" =>"1024000", 
"mount" => "/boot", "filesystem" => "ext4"}, "sda2"=>{"size" => "41981952", 
"filesystem" => "LVM2_member"}
} 
path => /usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 
physicalprocessorcount => 1 
processor0 => Intel(R) Core(TM) i7 CPU         920  @ 2.67GHz 
processor1 => Intel(R) Core(TM) i7 CPU         920  @ 2.67GHz 
processor2 => Intel(R) Core(TM) i7 CPU         920  @ 2.67GHz 
processorcount => 3 
productname => VirtualBox 
ps => ps -ef 
puppetversion => 3.6.2 
rubysitedir => /usr/lib/ruby/site_ruby/1.8 
rubyversion => 1.8.7
selinux => true 
selinux_config_mode => enforcing 
selinux_config_policy => targeted 
selinux_current_mode => enforcing 
selinux_enforced => true 
selinux_policyversion => 24 
serialnumber => 0 
sshdsakey => AAAAB3NzaC1kc3MAAACBAK5fYwRM3UtOs8zBCtRTjuHLw56p94X/E0UZBZwFR3q7
WH0x5+MNsjfmdCxKvpY/WlIIUcFJzvlfjXm4qDaTYalbzSZJMT266njNbw5WwLJcJ74KdW92ds76pjgm
CsjAh+R9YnyKCEE35GsYjGH7whw0gl/rZVrjvWYKQDOmJA2dAAAAFQCoYABgjpv3EkTWgjLIMnxA0Gfud
QAAAIBM4U6/nerfn6Qvt43FC2iybvwVo8ufixJl5YSEhs92uzsW6jiw68aaZ32q095/gEqYzeF7a2knr
OpASgO9xXqStYKg8ExWQVaVGFTR1NwqhZvz0oRSbrN3h3tHgknoKETRAg/imZQ2P6tppAoQZ8wpuLrXU
CyhgJGZ04Phv8hinAAAAIBN4xaycuK0mdH/YdcgcLiSn8cjgtiETVzDYa+jF 
swapfree => 3.55 GB 
swapfree_mb => 2015.99 
swapsize => 3.55 GB 
swapsize_mb => 2015.99 
timezone => GMT 
type => Other 
uniqueid => a8c0af01 
uptime => 45:012 hours 
uptime_days => 0 
uptime_hours => 6 
uptime_seconds => 21865 
uuid => BD8B9D85-1BFD-4015-A633-BF71D9A6A741 
virtual => virtualbox 

В приведенном выше коде мы видим, что некоторые данные перекрываются с небольшим количеством информации, доступной в переменной bash «env». Puppet напрямую не использует данные, вместо этого он использует данные Facter, данные Facter обрабатываются как глобальная переменная.

Затем факты доступны как переменные верхнего уровня, и мастер Puppet может использовать их для составления каталога Puppet для запрашивающего агента. Фасеты вызываются в манифесте как обычная переменная с префиксом $.

пример

if ($OperatingSystem == "Linux") { 
   $message = "This machine OS is of the type $OperatingSystem \n" 
} else { 
   $message = "This machine is unknown \n" 
} 

file { "/tmp/machineOperatingSystem.txt": 
   ensure => file, 
   content => "$message" 
}

Приведенный выше файл манифеста беспокоит только об одном файле с именем machineOperatingSystem.txt , где содержимое этого файла вычитается фактом, называемым OperatingSystem .

[root@puppetagent1 /]# facter OperatingSystem 
Linux  

[root@puppetagent1 /]# puppet apply /tmp/ostype.pp 
Notice: Compiled catalog for puppetagent1.codingbee.dyndns.org 
in environment production in 0.07 seconds 
Notice: /Stage[main]/Main/File[/tmp/machineOperatingSystem.txt]/ensure: 
defined content as '{md5}f59dc5797d5402b1122c28c6da54d073' 
Notice: Finished catalog run in 0.04 seconds  

[root@puppetagent1 /]# cat /tmp/machinetype.txt 
This machine OS is of the type Linux

Пользовательские факты

Все вышеперечисленные факты, которые мы видели, являются основными фактами машины. Можно добавить эти пользовательские факты в узел следующими способами —

  • Использование «экспорта FACTER… Синтаксис»
  • Использование настроек $ LOAD_PATH
  • FACTERLIB
  • Pluginsync

Использование синтаксиса «export FACTER»

Можно вручную добавить факты, используя синтаксис экспорта FACTER_ {имя факта}.

пример

[root@puppetagent1 facter]# export FACTER_tallest_mountain="Everest" 
[root@puppetagent1 facter]# facter tallest_mountain Everest

Использование настроек $ LOAD_PATH

В Ruby $ LOAD_PATH эквивалентно специальному параметру Bash. Хотя она похожа на переменную bash $ PATH, в действительности $ LOAD_PATH не является переменной окружения, а предопределенной переменной.

$ LOAD_PATH имеет синоним «$:». Эта переменная является массивом для поиска и загрузки значений.

[root@puppetagent1 ~]# ruby -e 'puts $LOAD_PATH'            
# note you have to use single quotes.  
/usr/lib/ruby/site_ruby/1.6 
/usr/lib64/ruby/site_ruby/1.6 
/usr/lib64/ruby/site_ruby/1.6/x86_64-linux 
/usr/lib/ruby/site_ruby 
/usr/lib64/ruby/site_ruby 
/usr/lib64/site_ruby/1.6 
/usr/lib64/site_ruby/1.6/x86_64-linux 
/usr/lib64/site_ruby 
/usr/lib/ruby/1.6 
/usr/lib64/ruby/1.6 
/usr/lib64/ruby/1.6/x86_64-linux 

Давайте рассмотрим пример создания директории каталогов, добавления файла .pp и добавления к нему содержимого.

[root@puppetagent1 ~]# cd /usr/lib/ruby/site_ruby/ 
[root@puppetagent1 site_ruby]# mkdir facter 
[root@puppetagent1 site_ruby]# cd facter/ 
[root@puppetagent1 facter]# ls 
[root@puppetagent1 facter]# touch newadded_facts.rb 

Добавьте следующее содержимое в файл custom_facts.rb.

[root@puppetagent1 facter]# cat newadded_facts.rb 
Facter.add('tallest_mountain') do 
   setcode "echo Everest" 
end 

Facter работает методом сканирования всех папок, перечисленных в $ LOAD_PATH, и ищет директора с именем facter. Как только он найдет эту конкретную папку, он загрузит их в любом месте структуры папки. Если он находит эту папку, он ищет любой Ruby-файл в этой папке Facter и загружает все определенные факты о любой конкретной конфигурации в память.

Использование FACTERLIB

В Puppet FACTERLIB работает очень похоже на $ LOAD_PATH, но с одним ключевым отличием — это параметр среды уровня ОС, а не специальная переменная Ruby. По умолчанию переменная среды может быть не установлена.

[root@puppetagent1 facter]# env | grep "FACTERLIB" 
[root@puppetagent1 facter]# 

Чтобы протестировать FACTERLIB, нам нужно выполнить следующие шаги.

Создайте папку с именем test_facts в следующей структуре.

[root@puppetagent1 tmp]# tree /tmp/test_facts/ 
/tmp/some_facts/ 
├── vipin 
│   └── longest_river.rb 
└── testing 
   └── longest_wall.rb 

Добавьте следующее содержимое в файлы .rb.

[root@puppetagent1 vipin]# cat longest_river.rb 
Facter.add('longest_river') do 
   setcode "echo Nile" 
end 

[root@puppetagent1 testing]# cat longest_wall.rb 
Facter.add('longest_wall') do 
   setcode "echo 'China Wall'" 
end 

Используйте оператор экспорта.

[root@puppetagent1 /]# export 
FACTERLIB = "/tmp/some_facts/river:/tmp/some_facts/wall" 
[root@puppetagent1 /]# env | grep "FACTERLIB" 
FACTERLIB = /tmp/some_facts/river:/tmp/some_facts/wall 

Протестируйте новый фактер.

[root@puppetagent1 /]# facter longest_river 
Nile 
[root@puppetagent1 /]# facter longest_wall 
China Wall 

Внешние факты

Внешние факты очень полезны, когда пользователь желает применить некоторые новые факты, созданные во время предоставления. Внешние факты являются одним из ключевых способов применения метаданных к ВМ на этапе ее подготовки (например, с использованием vSphere, OpenStack, AWS и т. Д.)

Все метаданные и созданные ими детали могут использоваться Puppet для определения того, какие детали должны присутствовать в каталоге, который будет применяться.

Создание внешнего факта

На агентском компьютере нам нужно создать каталог, как указано ниже.

$ mkdir -p /etc/facter/facts.d

Создайте сценарий оболочки в каталоге со следующим содержимым.

$ ls -l /etc/facter/facts.d 
total 4 
-rwxrwxrwx. 1 root root 65 Sep 18 13:11 external-factstest.sh 
$ cat /etc/facter/facts.d/external-factstest.sh 
#!/bin/bash 
echo "hostgroup = dev" 
echo "environment = development"

Измените разрешение файла сценария.

$ chmod u+x /etc/facter/facts.d/external-facts.sh

После этого мы можем видеть переменную, присутствующую в паре ключ / значение.

$ facter hostgroup 
dev 
$ facter environment 
development 

Можно написать пользовательские факты в Puppet. В качестве ссылки используйте следующую ссылку с сайта Puppet.

https://docs.puppet.com/facter/latest/fact_overview.html#writing-structured-facts

Кукольный — Ресурс

Ресурсы являются одним из ключевых фундаментальных элементов Puppet, используемых для проектирования и создания любой конкретной инфраструктуры или машины. Они в основном используются для моделирования и поддержки конфигурации системы. Puppet имеет несколько типов ресурсов, которые можно использовать для определения архитектуры системы, или пользователь может использовать для создания и определения нового ресурса.

Блок кода Puppet в файле манифеста или любом другом файле называется объявлением ресурса. Блок кода написан на языке декларативного языка моделирования (DML). Ниже приведен пример того, как это выглядит.

user { 'vipin': 
   ensure => present, 
   uid    => '552', 
   shell  => '/bin/bash', 
   home   => '/home/vipin', 
}

В Puppet объявление ресурса для любого конкретного типа ресурса выполняется в блоке кода. В следующем примере пользователь состоит в основном из четырех предварительно определенных параметров.

  • Тип ресурса — в приведенном фрагменте кода это пользователь.

  • Параметр ресурса — в приведенном фрагменте кода это Vipin.

  • Атрибуты — в приведенном фрагменте кода это обеспечивает, uid, shell, home.

  • Значения — это значения, которые соответствуют каждому свойству.

Тип ресурса — в приведенном фрагменте кода это пользователь.

Параметр ресурса — в приведенном фрагменте кода это Vipin.

Атрибуты — в приведенном фрагменте кода это обеспечивает, uid, shell, home.

Значения — это значения, которые соответствуют каждому свойству.

Каждый тип ресурса имеет свой собственный способ определения определений и параметров, и пользователь имеет право выбирать, как он хочет, чтобы его ресурс выглядел.

Тип ресурса

В Puppet доступны различные типы ресурсов, которые имеют свой собственный способ работы. Эти типы ресурсов можно просмотреть с помощью команды «description» и опции «-list».

[root@puppetmaster ~]# puppet describe --list 
These are the types known to puppet: 
augeas          - Apply a change or an array of changes to the  ... 
computer        - Computer object management using DirectorySer ... 
cron            - Installs and manages cron jobs 
exec            - Executes external commands 
file            - Manages files, including their content, owner ... 
filebucket      - A repository for storing and retrieving file  ... 
group           - Manage groups 
host            - Installs and manages host entries 
interface       - This represents a router or switch interface 
k5login         - Manage the ‘.k5login’ file for a user 
macauthorization - Manage the Mac OS X authorization database 
mailalias       - .. no documentation .. 
maillist        - Manage email lists 
mcx             - MCX object management using DirectoryService  ... 
mount           - Manages mounted filesystems, including puttin ... 
nagios_command  - The Nagios type command 
nagios_contact  - The Nagios type contact 
nagios_contactgroup - The Nagios type contactgroup 
nagios_host     - The Nagios type host 
nagios_hostdependency - The Nagios type hostdependency 
nagios_hostescalation - The Nagios type hostescalation 
nagios_hostextinfo - The Nagios type hostextinfo 
nagios_hostgroup - The Nagios type hostgroup 

nagios_service  - The Nagios type service 
nagios_servicedependency - The Nagios type servicedependency 
nagios_serviceescalation - The Nagios type serviceescalation 
nagios_serviceextinfo - The Nagios type serviceextinfo  
nagios_servicegroup - The Nagios type servicegroup 
nagios_timeperiod - The Nagios type timeperiod 
notify          - .. no documentation .. 
package         - Manage packages 
resources       - This is a metatype that can manage other reso ... 
router          - .. no documentation .. 
schedule        - Define schedules for Puppet 
scheduled_task  - Installs and manages Windows Scheduled Tasks 
selboolean      - Manages SELinux booleans on systems with SELi ... 
service         - Manage running services 
ssh_authorized_key - Manages SSH authorized keys 
sshkey          - Installs and manages ssh host keys 
stage           - A resource type for creating new run stages 
tidy            - Remove unwanted files based on specific crite ... 
user            - Manage users 
vlan            - .. no documentation .. 
whit            - Whits are internal artifacts of Puppet's curr ... 
yumrepo         - The client-side description of a yum reposito ... 
zfs             - Manage zfs 
zone            - Manages Solaris zones 
zpool           - Manage zpools 

Название ресурса

В приведенном выше фрагменте кода у нас есть заголовок ресурса как vipin, который уникален для каждого ресурса, используемого в одном и том же файле кода. Это уникальный заголовок для этого типа ресурса пользователя. У нас не может быть ресурса с тем же именем, потому что это вызовет конфликты.

Команда Resource может использоваться для просмотра списка всех ресурсов, используя тип user.

[root@puppetmaster ~]# puppet resource user 
user { 'abrt': 
   ensure           => 'present', 
   gid              => '173', 
   home             => '/etc/abrt', 
   password         => '!!', 
   password_max_age => '-1', 
   password_min_age => '-1', 
   shell            => '/sbin/nologin', 
   uid              => '173', 
} 

user { 'admin': 
   ensure           => 'present', 
   comment          => 'admin', 
   gid              => '444', 
   groups           => ['sys', 'admin'], 
   home             => '/var/admin', 
   password         => '*', 
   password_max_age => '99999', 
   password_min_age => '0', 
   shell            => '/sbin/nologin', 
   uid              => '55', 
} 

user { 'tomcat': 
   ensure           => 'present', 
   comment          => 'tomcat', 
   gid              => '100', 
   home             => '/var/www', 
   password         => '!!', 
   password_max_age => '-1', 
   password_min_age => '-1', 
   shell            => '/sbin/nologin', 
   uid              => '100', 
} 

Перечисление ресурсов конкретного пользователя

[root@puppetmaster ~]# puppet resource user tomcat 
user { 'apache': 
   ensure           => 'present', 
   comment          => 'tomcat', 
   gid              => '100', 
   home             => '/var/www', 
   password         => '!!', 
   password_max_age => '-1', 
   password_min_age => '-1', 
   shell            => '/sbin/nologin', 
   uid              => '100’, 
}

Атрибуты и ценности

Основная часть любого ресурса состоит из набора пар атрибут-значение. Здесь можно указать значения для свойства данного ресурса. Каждый тип ресурса имеет свой собственный набор атрибутов, которые можно настроить с помощью пар ключ-значение.

Опишите подкоманду, которая может использоваться для получения более подробной информации о конкретном атрибуте ресурсов. В следующем примере у нас есть детали о пользовательском ресурсе вместе со всеми его настраиваемыми атрибутами.

[root@puppetmaster ~]# puppet describe user 
user 
==== 
Manage users.  This type is mostly built to manage system users, 
so it is lacking some features useful for managing normal users. 

This resource type uses the prescribed native tools for creating groups 
and generally uses POSIX APIs for retrieving information about them.
It does not directly modify ‘/etc/passwd or anything. 

**Autorequires:** If Puppet is managing the user's primary group 
(as provided in the ‘gid’ attribute), 
the user resource will autorequire that group. 
If Puppet is managing any role accounts corresponding to the user's roles, 
the user resource will autorequire those role accounts.  

Parameters 
---------- 
- **allowdupe** 
   Whether to allow duplicate UIDs. Defaults to false’. 
   Valid values are true’, false’, yes’, no’.  

- **attribute_membership** 
   Whether specified attribute value pairs should be treated as the 
   **complete list** (‘inclusive’) or the **minimum list** (‘minimum’) of 
   attribute/value pairs for the user. Defaults to minimum’. 
   Valid values are inclusive’, minimum’.  

- **auths** 
   The auths the user has.  Multiple auths should be 
   specified as an array. 
   Requires features manages_solaris_rbac.  

- **comment** 
   A description of the user.  Generally the user's full name.  

- **ensure** 
   The basic state that the object should be in. 
   Valid values are ‘present’, ‘absent’, ‘role’.  

- **expiry**
   The expiry date for this user. Must be provided in 
   a zero-padded YYYY-MM-DD format --- e.g. 2010-02-19. 
   If you want to make sure the user account does never 
   expire, you can pass the special value ‘absent’. 
   Valid values are ‘absent’. Values can match ‘/^\d{4}-\d{2}-\d{2}$/’. 
   Requires features manages_expiry.  

- **forcelocal** 
   Forces the mangement of local accounts when accounts are also 
   being managed by some other NSS  

- **gid** 
   The user's primary group. Can be specified numerically or by name. 
   This attribute is not supported on Windows systems; use the groups 
   attribute instead. (On Windows, designating a primary group is only 
   meaningful for domain accounts, which Puppet does not currently manage.)  

- **groups** 
   The groups to which the user belongs. The primary group should 
   not be listed, and groups should be identified by name rather than by 
   GID.  Multiple groups should be specified as an array.  

- **home** 
   The home directory of the user.  The directory must be created 
   separately and is not currently checked for existence.  

- **ia_load_module** 
   The name of the I&A module to use to manage this user. 
   Requires features manages_aix_lam.  

- **iterations** 
   This is the number of iterations of a chained computation of the 
   password hash (http://en.wikipedia.org/wiki/PBKDF2).  This parameter 
   is used in OS X. This field is required for managing passwords on OS X 
   >= 10.8. 
   Requires features manages_password_salt. 

- **key_membership**  

- **managehome** 
   Whether to manage the home directory when managing the user. 
   This will create the home directory when ensure => present’, and 
   delete the home directory when ensure => absent’. Defaults to false’. 
   Valid values are true’, false’, yes’, no’.  

- **membership** 
   Whether specified groups should be considered the **complete list** 
   (‘inclusive’) or the **minimum list** (‘minimum’) of groups to which 
   the user belongs. Defaults to minimum’. 
   Valid values are inclusive’, minimum’.  

- **name** 
   The user name. While naming limitations vary by operating system, 
   it is advisable to restrict names to the lowest common denominator, 
   which is a maximum of 8 characters beginning with a letter. 
   Note that Puppet considers user names to be case-sensitive, regardless 
   of the platform's own rules; be sure to always use the same case when 
   referring to a given user.  

- **password** 
   The user's password, in whatever encrypted format the local 
   system requires. 
   * Most modern Unix-like systems use salted SHA1 password hashes. You can use 
      Puppet's built-in ‘sha1’ function to generate a hash from a password. 
   * Mac OS X 10.5 and 10.6 also use salted SHA1 hashes.  

Windows API 
   for setting the password hash. 
   [stdlib]: https://github.com/puppetlabs/puppetlabs-stdlib/ 
   Be sure to enclose any value that includes a dollar sign ($) in single 
   quotes (') to avoid accidental variable interpolation. 
   Requires features manages_passwords.  

- **password_max_age** 
   The maximum number of days a password may be used before it must be changed. 
   Requires features manages_password_age.  

- **password_min_age** 
   The minimum number of days a password must be used before it may be changed. 
   Requires features manages_password_age.  

- **profile_membership** 
   Whether specified roles should be treated as the **complete list** 
   (‘inclusive’) or the **minimum list** (‘minimum’) of roles 
   of which the user is a member. Defaults to minimum’. 
   Valid values are inclusive’, minimum’.  

- **profiles** 
   The profiles the user has.  Multiple profiles should be 
   specified as an array. 
   Requires features manages_solaris_rbac.  

- **project** 
   The name of the project associated with a user. 
   Requires features manages_solaris_rbac.  

- **uid** 
   The user ID; must be specified numerically. If no user ID is 
   specified when creating a new user, then one will be chosen 
   automatically. This will likely result in the same user having 
   different UIDs on different systems, which is not recommended. This is 
   especially noteworthy when managing the same user on both Darwin and 
   other platforms, since Puppet does UID generation on Darwin, but 
   the underlying tools do so on other platforms. 
   On Windows, this property is read-only and will return the user's 
   security identifier (SID). 

Puppet — слой абстракции ресурсов

В Puppet Resource Abstraction Layer (RAL) можно рассматривать как основную концептуализированную модель, на которой работает вся инфраструктура и настройка Puppet. В RAL каждый алфавит имеет свое значимое значение, которое определяется следующим образом.

Ресурс [R]

Ресурс может рассматриваться как все ресурсы, которые используются для моделирования любой конфигурации в Puppet. Это в основном встроенные ресурсы, которые по умолчанию присутствуют в Puppet. Их можно рассматривать как набор ресурсов, принадлежащих к предопределенному типу ресурса. Они похожи на концепцию ООП в любом другом языке программирования, где объект является экземпляром класса. В Puppet его ресурс является экземпляром типа ресурса.

Абстракция [A]

Абстракция может рассматриваться как ключевая особенность, где ресурсы определяются независимо от целевой ОС. Другими словами, при написании любого файла манифеста пользователю не нужно беспокоиться о целевой машине или ОС, которая присутствует на этой конкретной машине. В абстракции ресурсы дают достаточно информации о том, что должно существовать в агенте Puppet.

Puppet позаботится обо всех функциях или магии, происходящих за сценой. Независимо от ресурсов и ОС, Puppet позаботится о реализации конфигурации на целевой машине, при этом пользователю не нужно беспокоиться о том, как Puppet делает это за кулисами.

В абстракции Puppet отделяет ресурсы от своей реализации. Эта специфичная для платформы конфигурация существует от поставщиков. Мы можем использовать несколько подкоманд вместе со своими провайдерами.

Слой [L]

Вполне возможно, что каждый задает настройку и конфигурацию всей машины с точки зрения сбора ресурсов, и он может просматриваться и управляться через интерфейс CLI Puppet.

Пример для типа ресурса пользователя

[root@puppetmaster ~]# puppet describe user --providers 
user 
==== 
Manage users.
This type is mostly built to manage systemusers, 
so it is lacking some features useful for managing normalusers. 
This resource type uses the prescribed native tools for 
creating groups and generally uses POSIX APIs for retrieving informationabout them.
It does not directly modify '/etc/passwd' or anything. 

- **comment** 
   A description of the user.  Generally the user's full name.  

- **ensure** 
   The basic state that the object should be in. 
   Valid values are 'present', 'absent', 'role'.  

- **expiry** 
   The expiry date for this user. 
   Must be provided in a zero-padded YYYY-MM-DD format --- e.g. 2010-02-19. 
   If you want to make sure the user account does never expire, 
   you can pass the special value 'absent'. 
   Valid values are 'absent'. 
   Values can match '/^\d{4}-\d{2}-\d{2}$/'. 
   Requires features manages_expiry.  

- **forcelocal** 
   Forces the management of local accounts when accounts are also 
   being managed by some other NSS 
   Valid values are 'true', 'false', 'yes', 'no'. 
   Requires features libuser.  

- **gid** 
   The user's primary group.  Can be specified numerically or by name. 
   This attribute is not supported on Windows systems; use the groups 
   attribute instead. (On Windows, designating a primary group is only 
   meaningful for domain accounts, which Puppet does not currently manage.)  

- **groups** 
   The groups to which the user belongs. The primary group should 
   not be listed, and groups should be identified by name rather than by 
   GID. Multiple groups should be specified as an array.  

- **home** 
   The home directory of the user.  The directory must be created 
   separately and is not currently checked for existence.  

- **ia_load_module**
   The name of the I&A module to use to manage this user. 
   Requires features manages_aix_lam.  

- **iterations** 
   This is the number of iterations of a chained computation of the 
   password hash (http://en.wikipedia.org/wiki/PBKDF2).  
   This parameter is used in OS X. 
   This field is required for managing passwords on OS X >= 10.8.  

- **key_membership** 
   Whether specified key/value pairs should be considered the 
   **complete list** ('inclusive') or the **minimum list** ('minimum') of 
   the user's attributes. Defaults to 'minimum'. 
   Valid values are 'inclusive', 'minimum'.  

- **keys** 
   Specify user attributes in an array of key = value pairs. 
   Requires features manages_solaris_rbac.  

- **managehome** 
   Whether to manage the home directory when managing the user. 
   This will create the home directory when 'ensure => present', and 
   delete the home directory when ‘ensure => absent’. Defaults to ‘false’. 
   Valid values are ‘true’, ‘false’, ‘yes’, ‘no’.  

- **membership** 
   Whether specified groups should be considered the **complete list** 
   (‘inclusive’) or the **minimum list** (‘minimum’) of groups to which 
   the user belongs. Defaults to ‘minimum’. 
   Valid values are ‘inclusive’, ‘minimum’. 

- **name** 
   The user name. While naming limitations vary by operating system, 
   it is advisable to restrict names to the lowest common denominator.  

- **password** 
   The user's password, in whatever encrypted format the local system requires. 
   * Most modern Unix-like systems use salted SHA1 password hashes. You can use 
      Puppet's built-in ‘sha1’ function to generate a hash from a password. 
   * Mac OS X 10.5 and 10.6 also use salted SHA1 hashes. 
   * Mac OS X 10.7 (Lion) uses salted SHA512 hashes. 
   The Puppet Labs [stdlib][] module contains a ‘str2saltedsha512’ 
   function which can generate password hashes for Lion. 
   * Mac OS X 10.8 and higher use salted SHA512 PBKDF2 hashes. 
   When managing passwords on these systems the salt and iterations properties 
   need to be specified as well as the password. 
   [stdlib]: https://github.com/puppetlabs/puppetlabs-stdlib/ 
   Be sure to enclose any value that includes a dollar sign ($) in single 
   quotes (') to avoid accidental variable interpolation. 
   Requires features manages_passwords.  

- **password_max_age** 
   The maximum number of days a password may be used before it must be changed. 
Requires features manages_password_age.  

- **password_min_age** 
   The minimum number of days a password must be used before it may be changed. 
Requires features manages_password_age.  

- **profile_membership** 
   Whether specified roles should be treated as the **complete list** 
   (‘inclusive’) or the **minimum list** (‘minimum’) of roles 
   of which the user is a member. Defaults to minimum’. 
   Valid values are inclusive’, minimum’. 

- **profiles** 
   The profiles the user has.  Multiple profiles should be 
   specified as an array. 
Requires features manages_solaris_rbac.  

- **project** 
   The name of the project associated with a user. 
   Requires features manages_solaris_rbac.  

- **purge_ssh_keys** 
   Purge ssh keys authorized for the user 
   if they are not managed via ssh_authorized_keys. 
   When true, looks for keys in .ssh/authorized_keys in the user's home directory. 
   Possible values are true, false, or an array of 
   paths to file to search for authorized keys. 
   If a path starts with ~ or %h, this token is replaced with the user's home directory. 
   Valid values are true’, false’.  

- **role_membership** 
   Whether specified roles should be considered the **complete list** 
   (‘inclusive’) or the **minimum list** (‘minimum’) of roles the user has. 
   Defaults to minimum’. 
Valid values are inclusive’, minimum’.  

- **roles** 
   The roles the user has.  Multiple roles should be 
   specified as an array. 
Requires features manages_solaris_rbac.  

- **salt** 
   This is the 32 byte salt used to generate the PBKDF2 password used in 
   OS X. This field is required for managing passwords on OS X >= 10.8. 
   Requires features manages_password_salt. 

- **shell** 
   The user's login shell.  The shell must exist and be 
   executable. 
   This attribute cannot be managed on Windows systems. 
   Requires features manages_shell. 

- **system** 
   Whether the user is a system user, according to the OS's criteria; 
   on most platforms, a UID less than or equal to 500 indicates a system 
   user. Defaults to false’. 
   Valid values are true’, false’, yes’, no’.  

- **uid** 
   The user ID; must be specified numerically. If no user ID is 
   specified when creating a new user, then one will be chosen 
   automatically. This will likely result in the same user having 
   different UIDs on different systems, which is not recommended. 
   This is especially noteworthy when managing the same user on both Darwin and 
   other platforms, since Puppet does UID generation on Darwin, but 
   the underlying tools do so on other platforms. 
   On Windows, this property is read-only and will return the user's 
   security identifier (SID).  

Providers 
--------- 

- **aix** 
   User management for AIX. 
   * Required binaries: '/bin/chpasswd', '/usr/bin/chuser', 
   '/usr/bin/mkuser', '/usr/sbin/lsgroup', '/usr/sbin/lsuser', 
   '/usr/sbin/rmuser'. 
   * Default for ‘operatingsystem’ == ‘aix’. 
   * Supported features: ‘manages_aix_lam’, ‘manages_expiry’, 
   ‘manages_homedir’, ‘manages_password_age’, ‘manages_passwords’, 
   ‘manages_shell’. 

- **directoryservice** 
   User management on OS X. 
   * Required binaries: ‘/usr/bin/dscacheutil’, ‘/usr/bin/dscl’, 
   ‘/usr/bin/dsimport’, ‘/usr/bin/plutil’, ‘/usr/bin/uuidgen’. 
   * Default for ‘operatingsystem’ == ‘darwin’. 
   * Supported features: ‘manages_password_salt’, ‘manages_passwords’, 
   ‘manages_shell’.

- **hpuxuseradd** 
   User management for HP-UX. This provider uses the undocumented ‘-F’ 
   switch to HP-UX's special usermod binary to work around the fact that 
   its standard usermod cannot make changes while the user is logged in. 
   * Required binaries: ‘/usr/sam/lbin/useradd.sam’, 
   ‘/usr/sam/lbin/userdel.sam’, ‘/usr/sam/lbin/usermod.sam’. 
   * Default for operatingsystem == hp-ux’. 
   * Supported features: allows_duplicates’, manages_homedir’, 
   manages_passwords’.  

- **ldap** 
   User management via LDAP. 
   This provider requires that you have valid values for all of the 
   LDAP-related settings in puppet.conf’, including ldapbase’.
   You will almost definitely need settings for ldapuser and ldappassword in order 
   for your clients to write to LDAP. 
* Supported features: manages_passwords’, manages_shell’.  

- **pw** 
   User management via pw on FreeBSD and DragonFly BSD. 
   * Required binaries: pw’. 
   * Default for operatingsystem == freebsd, dragonfly’. 
   * Supported features: allows_duplicates’, manages_expiry’, 
   manages_homedir’, manages_passwords’, manages_shell’. 

- **user_role_add** 
   User and role management on Solaris, via useradd and roleadd’. 
   * Required binaries: passwd’, roleadd’, roledel’, rolemod’, 
   useradd’, userdel’, usermod’. 
   * Default for osfamily == solaris’. 
   * Supported features: allows_duplicates’, manages_homedir’, 
   manages_password_age’, manages_passwords’, manages_solaris_rbac’.  

- **useradd** 
   User management via useradd and its ilk.  Note that you will need to 
   install Ruby's shadow password library (often known as ‘ruby-libshadow’) 
   if you wish to manage user passwords. 
   * Required binaries: ‘chage’, ‘luseradd’, ‘useradd’, ‘userdel’, ‘usermod’. 
   * Supported features: ‘allows_duplicates’, ‘libuser’, ‘manages_expiry’, 
   ‘manages_homedir’, ‘manages_password_age’, ‘manages_passwords’, 
   ‘manages_shell’, ‘system_users’.  

- **windows_adsi** 
   Local user management for Windows. 
   * Default for 'operatingsystem' == 'windows'. 
   * Supported features: 'manages_homedir', 'manages_passwords'. 

Ресурс тестирования

В Puppet тестирование ресурса напрямую указывает на то, что сначала нужно применить ресурсы, которые он хочет использовать, чтобы сконфигурировать целевой узел, чтобы соответственно изменить состояние машины.

Для тестирования мы будем применять ресурс локально. Поскольку у нас есть ресурс, предопределенный выше с user = vipin . Одним из способов применения ресурса является CLI. Это можно сделать, переписав весь ресурс в одну команду, а затем передав его в подкоманду ресурса.

puppet resource user vipin ensure = present uid = '505' 
shell = '/bin/bash' home = '/home/vipin'

Протестируйте прикладной ресурс.

[root@puppetmaster ~]# cat /etc/passwd | grep "vipin" 
vipin:x:505:501::/home/vipin:/bin/bash 

Приведенный выше вывод показывает, что ресурс применяется к системе, и у нас создан новый пользователь с именем Vipin. Рекомендуется проверить это самостоятельно, так как все вышеперечисленные коды проверены и являются рабочими кодами.

Кукольный — Шаблон

Шаблонирование — это метод получения вещей в стандартном формате, который можно использовать в нескольких местах. В Puppet шаблоны и шаблоны поддерживаются с помощью erb, который входит в состав стандартной библиотеки Ruby, которая может использоваться в других проектах, кроме Ruby, как в проектах Ruby on Rails. Как стандартная практика, нужно иметь базовое понимание Ruby. Шаблонирование очень полезно, когда пользователь пытается управлять содержимым файла шаблона. Шаблоны играют ключевую роль, когда конфигурации не могут управляться встроенным типом Puppet.

Оценка шаблонов

Шаблоны оцениваются с использованием простых функций.

$value = template ("testtemplate.erb")

Можно указать полный путь к шаблону или можно извлечь все шаблоны в шаблонном шаблоне Puppet, который обычно находится в / var / puppet / templates. Найти местоположение каталога можно, запустив puppet –-configprint templatedir.

Шаблоны всегда оцениваются синтаксическим анализатором, а не клиентом, что означает, что если кто-то использует puppetmasterd, то шаблон должен быть только на сервере и никогда не нужно загружать их на клиент. Там нет разницы в том, как клиент видит между использованием шаблона и указанием всего содержимого файла в виде строки. Это ясно указывает на то, что специфичные для клиента переменные сначала изучаются puppetmasterd во время фазы запуска puppet.

Использование шаблонов

Ниже приведен пример создания конфигурации Tomcat для сайтов тестирования.

define testingsite($cgidir, $tracdir) { 
   file { "testing-$name": 
   path => "/etc/tomcat/testing/$name.conf", 
   owner => superuser, 
   group => superuser, 
   mode => 644, 
   require => File[tomcatconf], 
   content => template("testsite.erb"), 
   notify => Service[tomcat] 
}  
   symlink { "testsym-$name": 
      path => "$cgidir/$name.cgi", 
      ensure => "/usr/share/test/cgi-bin/test.cgi" 
   } 
} 

Ниже приведено определение шаблона.

<Location "/cgi-bin/ <%= name %>.cgi"> 
   SetEnv TEST_ENV "/export/svn/test/<%= name %>" 
</Location>  

# You need something like this to authenticate users 
<Location "/cgi-bin/<%= name %>.cgi/login"> 
   AuthType Basic 
   AuthName "Test" 
   AuthUserFile /etc/tomcat/auth/svn 
   Require valid-user 
</Location>

Это помещает каждый файл шаблона в отдельный файл, а затем нужно просто сказать Apache, чтобы загрузить эти файлы конфигурации.

Include /etc/apache2/trac/[^.#]*

Объединение шаблонов

Два шаблона могут быть легко объединены с помощью следующей команды.

template('/path/to/template1','/path/to/template2')

Итерация в шаблонах

Шаблон Puppet также поддерживает итерацию массива. Если переменная, к которой вы обращаетесь, является массивом, то ее можно перебрать.

$values = [val1, val2, otherval]

У нас могут быть шаблоны, подобные следующим.

<% values.each do |val| -%> 
Some stuff with <%= val %> 
<% end -%>

Приведенная выше команда даст следующий результат.

Some stuff with val1 
Some stuff with val2 
Some stuff with otherval 

Условия в шаблонах

Шаблон erb поддерживает условные выражения . Следующая конструкция — это быстрый и простой способ условного размещения содержимого в файле.

<% if broadcast != "NONE" %> broadcast <%= broadcast %> <% end %>

Шаблоны и Переменные

Можно использовать шаблоны для заполнения переменных в дополнение к заполнению содержимого файла.

testvariable = template('/var/puppet/template/testvar')

Неопределенная переменная

Если нужно проверить, определена ли переменная перед ее использованием, сработает следующая команда.

<% if has_variable?("myvar") then %> 
myvar has <%= myvar %> value 
<% end %>

Переменная вне области видимости

Можно явно искать переменную вне области видимости с помощью функции lookupvar.

<%= scope.lookupvar('apache::user') %>

Образец шаблона проекта

<#Autogenerated by puppet. Do not edit. 
[default] 
#Default priority (lower value means higher priority) 
priority = <%= @priority %> 
#Different types of backup. Will be done in the same order as specified here. 
#Valid options: rdiff-backup, mysql, command 
backups = <% if @backup_rdiff %>rdiff-backup, 
<% end %><% if @backup_mysql %>mysql, 
<% end %><% if @backup_command %>command<% end %> 
<% if @backup_rdiff -%>  

[rdiff-backup]  

<% if @rdiff_global_exclude_file -%> 
   global-exclude-file = <%= @rdiff_global_exclude_file %> 
<% end -%> 
   <% if @rdiff_user -%> 
      user = <%= @rdiff_user %> 
<% end -%> 
<% if @rdiff_path -%> 
   path = <%= @rdiff_path %> 
<% end -%>  

#Optional extra parameters for rdiff-backup  

extra-parameters = <%= @rdiff_extra_parameters %>  

#How long backups are going to be kept 
keep = <%= @rdiff_keep %> 
<% end -%> 
<% if @backup_mysql -%>%= scope.lookupvar('apache::user') %>  

[mysql]  

#ssh user to connect for running the backup 
sshuser =  <%= @mysql_sshuser %>

#ssh private key to be used 
   sshkey = <%= @backup_home %>/<%= @mysql_sshkey %> 
   <% end -%> 
<% if @backup_command -%>  
[command] 

#Run a specific command on the backup server after the backup has finished  

command = <%= @command_to_execute %> 
<% end -%>

Кукольный — Классы

Классы марионеток определяются как набор ресурсов, которые сгруппированы для того, чтобы получить целевой узел или компьютер в желаемом состоянии. Эти классы определены внутри файлов манифеста Puppet, которые находятся внутри модулей Puppet. Основная цель использования класса — уменьшить количество повторений кода внутри любого файла манифеста или любого другого кода Puppet.

Ниже приведен пример класса Puppet.

[root@puppetmaster manifests]# cat site.pp  
class f3backup ( 
   $backup_home   = '/backup', 
   $backup_server = 'default', 
   $myname        = $::fqdn, 
   $ensure        = 'directory', 
) { 
   include '::f3backup::common' 
   if ( $myname == '' or $myname == undef ) { 
      fail('myname must not be empty') 
   }  
   @@file { "${backup_home}/f3backup/${myname}": 
      # To support 'absent', though force will be needed 
      ensure => $ensure, 
      owner  => 'backup', 
      group  => 'backup', 
      mode   => '0644', 
      tag    => "f3backup-${backup_server}", 
   }
}   

В приведенном выше примере у нас есть два клиента, где пользователь должен существовать. Как можно заметить, мы повторили один и тот же ресурс дважды. Один из способов не выполнять одну и ту же задачу при объединении двух узлов.

[root@puppetmaster manifests]# cat site.pp 
node 'Brcleprod001','Brcleprod002' { 
   user { 'vipin': 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => '/home/homer', 
   } 
}

Объединение узлов таким способом для выполнения настройки не является хорошей практикой. Это может быть просто достигнуто путем создания класса и включения созданного класса в узлы, как показано ниже.

class vipin_g01063908 { 
   user { 'g01063908': 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => '/home/g01063908', 
   } 
}  
node 'Brcleprod001' { 
   class {vipin_g01063908:} 
}  
node 'Brcleprod002' { 
   class {vipin_g01063908:} 
}

Следует обратить внимание на то, как выглядит структура класса и как мы добавили новый ресурс с помощью ключевого слова class. Каждый синтаксис в Puppet имеет свою особенность. Следовательно, выбранный синтаксис зависит от условий.

Параметризованный класс

Как и в приведенном выше примере, мы увидели, как создать класс и включить его в узел. Теперь есть ситуации, когда нам нужно иметь разные конфигурации на каждом узле, например, когда нужно, чтобы на каждом узле были разные пользователи, использующие один и тот же класс. Эта функция предоставляется в Puppet с использованием параметризованного класса. Конфигурация для нового класса будет выглядеть так, как показано в следующем примере.

[root@puppetmaster ~]# cat /etc/puppet/manifests/site.pp 
class user_account ($username){ 
   user { $username: 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => "/home/$username", 
   } 
}  
node 'Brcleprod002' { 
   class { user_account: 
      username => "G01063908", 
   } 
} 
node 'Brcleprod002' { 
   class {user_account: 
      username => "G01063909", 
   } 
} 

Когда мы применяем вышеуказанный манифест site.pp к узлам, выходные данные для каждого узла будут выглядеть следующим образом.

Brcleprod001

[root@puppetagent1 ~]# puppet agent --test 
Info: Retrieving pluginfacts 
Info: Retrieving plugin 
Info: Caching catalog for puppetagent1.testing.dyndns.org 
Info: Applying configuration version '1419452655' 

Notice: /Stage[main]/User_account/User[homer]/ensure: created 
Notice: Finished catalog run in 0.15 seconds 
[root@brcleprod001 ~]# cat /etc/passwd | grep "vipin" 
G01063908:x:101:501::/home/G01063909:/bin/bash 

Brcleprod002

[root@Brcleprod002 ~]# puppet agent --test 
Info: Retrieving pluginfacts 
Info: Retrieving plugin 
Info: Caching catalog for puppetagent2.testing.dyndns.org 
Info: Applying configuration version '1419452725' 

Notice: /Stage[main]/User_account/User[bart]/ensure: created 
Notice: Finished catalog run in 0.19 seconds 
[root@puppetagent2 ~]# cat /etc/passwd | grep "varsha" 
G01063909:x:101:501::/home/G01063909:/bin/bash

Можно также установить значение по умолчанию для параметра класса, как показано в следующем коде.

[root@puppetmaster ~]# cat /etc/puppet/manifests/site.pp 
class user_account ($username = ‘g01063908'){ 
   user { $username: 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => "/home/$username", 
   } 
}  
node 'Brcleprod001' { 
   class {user_account:} 
}  
node 'Brcleprod002' { 
   class {user_account: 
      username => "g01063909", 
   } 
} 

Кукольный — функция

Puppet поддерживает функции, как и любой другой язык программирования, поскольку базовым языком разработки Puppet является Ruby. Он поддерживает два типа функций, известных под названием оператор и функции-значения.

  • Заявления стоят сами по себе, и у них нет никакого типа возврата. Они используются для выполнения отдельных задач, таких как импорт других модулей Puppet в новый файл манифеста.

  • Rvalue возвращает значения и может использоваться только тогда, когда для оператора требуется значение, например, для присваивания или оператора case.

Заявления стоят сами по себе, и у них нет никакого типа возврата. Они используются для выполнения отдельных задач, таких как импорт других модулей Puppet в новый файл манифеста.

Rvalue возвращает значения и может использоваться только тогда, когда для оператора требуется значение, например, для присваивания или оператора case.

Ключ к выполнению функции в Puppet заключается в том, что она выполняется только на мастере Puppet, и они не выполняются на клиенте или агенте Puppet. Следовательно, они имеют доступ только к командам и данным, доступным на мастере Puppet. Существуют различные виды функций, которые уже присутствуют, и даже пользователь имеет право создавать пользовательские функции в соответствии с требованиями. Несколько встроенных функций перечислены ниже.

Функция файла

Файловая функция файлового ресурса состоит в том, чтобы загрузить модуль в Puppet и вернуть желаемый результат в виде строки. Аргументы, которые он ищет, это ссылка <module name> / <file>, которая помогает в загрузке модуля из каталога файлов модуля Puppet.

Как скрипт / tesingscript.sh будет загружать файлы из <имя модуля> /script/files/testingscript.sh. Функция имеет возможность считывать и принимать абсолютный путь, который помогает в загрузке файла из любой точки диска.

Включить функцию

В Puppet функция включения очень похожа на функцию включения в любом другом языке программирования. Он используется для объявления одного или нескольких классов, что приводит к оценке всех ресурсов, присутствующих внутри этих классов, и, наконец, их добавлению в каталог. Это работает так: функция include принимает имя класса, список классов или список имен классов через запятую.

При использовании оператора include следует иметь в виду, что в классе его можно использовать несколько раз, но есть ограничение на включение одного класса только один раз. Если включаемый класс принимает параметр, функция включения автоматически ищет значения для них, используя <имя класса> :: <имя параметра> в качестве ключа поиска.

Функция include не приводит к тому, что класс будет содержаться в классе при их объявлении, для этого нам нужно использовать содержащуюся функцию. Он даже не создает зависимости в объявленном классе и окружающих его классах.

В функции include допускается только полное имя класса, относительные имена не допускаются.

Определенная функция

В Puppet определенная функция помогает определить, где задан данный класс или тип ресурса, и возвращает логическое значение или нет. Можно также использовать определение, чтобы определить, определен ли определенный ресурс или определенная переменная имеет значение. При использовании определенной функции следует помнить, что эта функция принимает как минимум один строковый аргумент, который может быть именем класса, именем типа, ссылкой на ресурс или ссылкой на переменную в форме «$ name».

Определите проверки функций как для собственного, так и для определенного типа функции, включая типы, предоставляемые модулями. Тип и класс соответствуют их именам. Функция соответствует замедлению ресурса, используя ссылку на ресурс.

Определить совпадения функций

# Matching resource types 
defined("file") 
defined("customtype")  

# Matching defines and classes 
defined("testing") 
defined("testing::java")  

# Matching variables 
defined('$name')  

# Matching declared resources 
defined(File['/tmp/file']) 

Кукольный — Пользовательские функции

Как описано в предыдущей главе, функция предоставляет пользователю привилегию разработки пользовательских функций. Puppet может расширить свои возможности интерпретации с помощью пользовательских функций. Пользовательская функция помогает увеличить и расширить возможности модулей Puppet и файлов манифеста.

Написание пользовательских функций

Есть несколько вещей, которые нужно иметь в виду, прежде чем писать функцию.

  • В Puppet функции выполняются компиляторами, что означает, что все функции выполняются на Puppet master, и им не нужно иметь дело с любым из клиентов Puppet для одного и того же. Функции могут взаимодействовать только с агентами, если информация представлена ​​в форме фактов.

  • Мастер Puppet улавливает пользовательские функции, что означает, что необходимо перезапустить мастер Puppet, если кто-то вносит изменения в функцию Puppet.

  • Функция будет выполняться на сервере, что означает, что любой файл, который необходим этой функции, должен присутствовать на сервере, и никто не может ничего сделать, если функция требует прямого доступа к клиентскому компьютеру.

  • Доступны два совершенно разных типа функций: функция Rvalue, которая возвращает значение, и функция оператора, которая ничего не возвращает.

  • Имя файла, содержащего функцию, должно совпадать с именем функции в файле. В противном случае он не будет загружен автоматически.

В Puppet функции выполняются компиляторами, что означает, что все функции выполняются на Puppet master, и им не нужно иметь дело с любым из клиентов Puppet для одного и того же. Функции могут взаимодействовать только с агентами, если информация представлена ​​в форме фактов.

Мастер Puppet улавливает пользовательские функции, что означает, что необходимо перезапустить мастер Puppet, если кто-то вносит изменения в функцию Puppet.

Функция будет выполняться на сервере, что означает, что любой файл, который необходим этой функции, должен присутствовать на сервере, и никто не может ничего сделать, если функция требует прямого доступа к клиентскому компьютеру.

Доступны два совершенно разных типа функций: функция Rvalue, которая возвращает значение, и функция оператора, которая ничего не возвращает.

Имя файла, содержащего функцию, должно совпадать с именем функции в файле. В противном случае он не будет загружен автоматически.

Расположение для размещения пользовательской функции

Все пользовательские функции реализованы в виде отдельных файлов .rb и распределены между модулями. Нужно поместить пользовательские функции в lib / puppet / parser / function. Функции могут быть загружены из файла .rb из следующих мест.

  • $ LIBDIR / кукольный / СА / функции
  • подкаталоги puppet / parser / functions в вашем Ruby $ LOAD_PATH

Создание новой функции

Новые функции создаются или определяются с использованием метода newfunction внутри модуля puppet :: parser :: Functions . Нужно передать имя функции в качестве символа методу newfunction и код для запуска в виде блока. В следующем примере показана функция, которая используется для записи строки в файл в каталоге / user.

module Puppet::Parser::Functions 
   newfunction(:write_line_to_file) do |args| 
      filename = args[0] 
      str = args[1] 
      File.open(filename, 'a') {|fd| fd.puts str } 
   end 
end

Когда пользователь объявил функцию, ее можно использовать в файле манифеста, как показано ниже.

write_line_to_file('/user/vipin.txt, "Hello vipin!")

Кукольный — Окружающая среда

В модели разработки и поставки программного обеспечения существуют различные виды сред тестирования, которые используются для тестирования конкретного продукта или услуги. Как стандартная практика, существуют в основном три вида сред, такие как разработка, тестирование и производство, где каждая из них имеет свою собственную конфигурацию набора.

Puppet поддерживает управление несколькими средами на одной линии с Ruby on Rails. Ключевым фактором, стоящим за созданием этих сред, является обеспечение простого механизма управления на разных уровнях соглашения об уровне обслуживания. В некоторых случаях аппарат всегда должен быть включен без какой-либо терпимости и использования старого программного обеспечения. В то время как другие среды являются современными и используются для целей тестирования. Они используются для обновлений для более важных машин.

Puppet рекомендует придерживаться стандартной конфигурации среды производства, тестирования и разработки, однако здесь она даже предоставляет пользователю возможность создания пользовательских сред в соответствии с требованиями.

Цель окружающей среды

Основная цель установки, разделенной по среде, заключается в том, что Puppet может иметь разные источники для модулей и манифестов. Затем можно протестировать изменения конфигурации в среде тестирования, не влияя на производственные узлы. Эти среды также можно использовать для развертывания инфраструктуры в разных источниках сети.

Использование среды на Puppet Master

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

Среды Puppet реализуются простым добавлением разделов предварительной среды в серверный puppet.conf и выбором различных источников конфигурации для каждой среды. Эти разделы перед окружением затем используются вместо основного раздела.

[main] 
manifest = /usr/testing/puppet/site.pp 
modulepath = /usr/testing/puppet/modules 
[development] 
manifest = /usr/testing/puppet/development/site.pp 
modulepath = /usr/testing/puppet/development/modules

В приведенном выше коде любой клиент в среде разработки будет использовать файл манифеста site.pp, расположенный в каталоге / usr / share / puppet / development, и Puppet будет искать любой модуль в каталоге / usr / share / puppet / development / modules ,

При запуске Puppet с или без какой-либо среды по умолчанию используется файл site.pp и каталог, указанный в значениях manifest и modulepath в главном разделе конфигурации.

Существует всего несколько конфигураций, которые на самом деле имеет смысл настраивать в предварительном окружении, и все эти параметры вращаются вокруг указания, какие файлы использовать для компиляции конфигурации клиента.

Ниже приведены параметры.

  • Modulepath — в Puppet в качестве основного стандартного режима лучше всего иметь стандартный каталог модулей, который совместно используется всей средой, а затем каталог предварительной среды, в котором можно хранить пользовательский модуль. Путь к модулю — это место, где Puppet ищет все файлы конфигурации, относящиеся к среде.

  • Templatedir — Каталог шаблонов — это место, где сохраняются все версии связанных шаблонов. Модуль должен быть предпочтительнее этих настроек, однако он позволяет иметь разные версии данного шаблона в каждой среде.

  • Manifest — определяет, какую конфигурацию использовать в качестве сценария точки входа.

Modulepath — в Puppet в качестве основного стандартного режима лучше всего иметь стандартный каталог модулей, который совместно используется всей средой, а затем каталог предварительной среды, в котором можно хранить пользовательский модуль. Путь к модулю — это место, где Puppet ищет все файлы конфигурации, относящиеся к среде.

Templatedir — Каталог шаблонов — это место, где сохраняются все версии связанных шаблонов. Модуль должен быть предпочтительнее этих настроек, однако он позволяет иметь разные версии данного шаблона в каждой среде.

Manifest — определяет, какую конфигурацию использовать в качестве сценария точки входа.

С несколькими модулями Puppets помогают получить модульность для конфигураций. В Puppet можно использовать несколько сред, которые работают намного лучше, если в основном полагаться на модули. Легче переносить изменения в среды, инкапсулируя изменения в модуле. Файловый сервер использует специфический для среды путь к модулю; если вы выполняете обслуживание файлов из модулей, а не из отдельных подключенных каталогов, эта среда сможет получать файлы, относящиеся к среде, и, наконец, текущая среда также будет доступна в переменной $ environment в файле манифеста.

Настройка клиентской среды

Все настройки, связанные с настройкой среды, выполняются в файле puppet.conf. Чтобы указать, какую среду должен использовать клиент Puppet, можно указать значение переменной конфигурации среды в файле puppet.conf клиента.

[puppetd] 
environment = Testing 

Приведенное выше определение в файле конфигурации определяет, какую среду файл конфигурации в нашем случае он тестирует.

Можно также указать это в командной строке, используя —

#puppetd -–environment = testing

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

Путь поиска кукол

Puppet использует простой путь поиска, чтобы определить, какую конфигурацию необходимо применить на целевом компьютере. Точно так же путь поиска в Puppet очень полезен, когда он пытается подобрать подходящие значения, которые необходимо применить. Ниже перечислены несколько мест, где Puppet ищет значения, которые необходимо применить.

  • Значение, указанное в командной строке
  • Значения, указанные в разделе, относящемся к среде
  • Значения, указанные в специфичном для исполняемого файла разделе
  • Значения, указанные в основном разделе

Кукольный — Тип и поставщик

Типы кукол используются для индивидуального управления конфигурацией. Puppet имеет разные типы, такие как тип сервиса, тип пакета, тип провайдера и т. Д. В каждом типе есть провайдеры. Поставщик обрабатывает конфигурацию на разных платформах или инструментах. Например, тип пакета имеет провайдеров aptitude, yum, rpm и DGM. Существует много типов, и Puppet предлагает хороший элемент управления конфигурацией спектра, которым необходимо управлять.

Puppet использует Ruby в качестве базового языка. Все присутствующие типы Puppet и провайдеры написаны на языке Ruby. Поскольку он соответствует стандартному формату кодирования, их можно просто создать, как показано в примере для репо, который управляет репозиториями. Здесь мы создадим репо типа и провайдеры svn и git. Первая часть типа репо — это сам тип. Типы обычно хранятся в lib / puppet / type. Для этого мы создадим файл с именем repo.rb.

$ touch repo.rb

Добавьте следующее содержимое в файл.

Puppet::Type.newtype(:repo) do  
@doc = "Manage repos"  
   Ensurable   
   newparam(:source) do 
      desc "The repo source"  
      
      validate do |value| 
         if value =~ /^git/ 
            resource[:provider] = :git 
         else 
            resource[:provider] = :svn 
         end 
      end 
      isnamevar 
   end  

   newparam(:path) do 
      desc "Destination path"  
      validate do |value| 
         unless value =~ /^\/[a-z0-9]+/ 
            raise ArgumentError , "%s is not a valid file path" % value 
         end 
      end 
   end 
end 

В приведенном выше сценарии мы создали блок « Puppet :: Type.newtype (: repo) do », который создает новый тип с именем repo. Затем у нас есть @doc, который помогает добавлять любой уровень детализации, который вы хотите добавить. Следующее утверждение является Ensurable; это создает базовое свойство обеспечения. Тип Puppet использует свойство sure для определения состояния элемента конфигурации.

пример

service { "sshd": 
   ensure => present, 
} 

Оператор обеспечивает сообщает Puppet, кроме трех методов: создавать, уничтожать и существовать в поставщике. Эти методы предоставляют следующие функции —

  • Команда для создания ресурса
  • Команда для удаления ресурса
  • Команда для проверки существования ресурса

Все, что нам нужно сделать, это указать эти методы и их содержимое. Puppet создает поддерживающую инфраструктуру вокруг них.

Далее мы определяем новый параметр с именем source.

newparam(:source) do 
   desc "The repo source" 
   validate do |value| 
      if value =~ /^git/ 
         resource[:provider] = :git 
      else 
         resource[:provider] = :svn 
      end 
   end 
   isnamevar 
end

Источник сообщит типу репозитория, где получить / клонировать / оформить исходный репозиторий. В этом мы также используем хук под названием validate. В разделе провайдера мы определили git и svn, которые проверяют правильность определенного нами репозитория.

Наконец, в коде мы определили еще один параметр, называемый path.

newparam(:path) do 
   desc "Destination path" 
   validate do |value| 
      unless value =~ /^\/[a-z0-9]+/ 
         raise ArgumentError , "%s is not a valid file path" % value 
      end 

Это тип значения, который указывает, куда поместить новый код, который будет получен. Здесь снова используйте ловушку validate для создания блока, который проверяет значение соответствия.

Вариант использования Subversion Provider

Давайте начнем с провайдера Subversion, используя созданный выше тип.

require 'fileutils' 
Puppet::Type.type(:repo).provide(:svn) do 
   desc "SVN Support"  
   
   commands :svncmd => "svn" 
   commands :svnadmin => "svnadmin"  
   
   def create 
      svncmd "checkout", resource[:name], resource[:path] 
   end  
   
   def destroy 
      FileUtils.rm_rf resource[:path] 
   end  
    
   def exists? 
      File.directory? resource[:path] 
   end 
end

В приведенном выше коде мы заранее определили, что нам нужна библиотека fileutils , для которой требуется ‘fileutils’, с которой мы собираемся использовать метод.

Далее мы определили провайдера как блок Puppet :: Type.type (: repo) .provide (: svn) do, который сообщает Puppet, что это провайдер для типа с именем repo.

Затем мы добавили desc, который позволяет добавить некоторую документацию к провайдеру. Мы также определили команду, которую будет использовать этот поставщик. В следующей строке мы проверяем функции ресурса, такие как создание, удаление и существование.

Создание ресурса

Как только все вышеперечисленное будет выполнено, мы создадим ресурс, который будет использоваться в наших классах и файлах манифеста, как показано в следующем коде.

repo { "wp": 
   source => "http://g01063908.git.brcl.org/trunk/", 
   path => "/var/www/wp", 
   ensure => present, 
}

Puppet — RESTful API

Puppet использует RESTful API в качестве канала связи между мастером Puppet и агентами Puppet. Ниже приведен основной URL для доступа к этому RESTful API.

https://brcleprod001:8140/{environment}/{resource}/{key} 
https://brcleprod001:8139/{environment}/{resource}/{key}

REST API Security

Puppet обычно заботится о безопасности и управлении сертификатами SSL. Однако, если кто-то хочет использовать RESTful API вне кластера, необходимо самостоятельно управлять сертификатом при попытке подключения к машине. Политику безопасности для Puppet можно настроить с помощью файла rest authconfig.

Тестирование REST API

Утилита Curl может использоваться как базовая утилита для подключения к RESTful API. Ниже приведен пример того, как мы можем получить каталог узла с помощью команды curl REST API.

curl --cert /etc/puppet/ssl/certs/brcleprod001.pem --key 
   /etc/puppet/ssl/private_keys/brcleprod001.pem

В следующем наборе команд мы просто устанавливаем сертификат SSL, который будет отличаться в зависимости от того, где находится каталог SSL и от имени используемого узла. Например, давайте посмотрим на следующую команду.

curl --insecure -H 'Accept: yaml' 
https://brcleprod002:8140/production/catalog/brcleprod001 

В приведенной выше команде мы просто отправляем заголовок, указывающий формат или форматы, которые мы хотим вернуть, и URL-адрес RESTful для создания каталога brcleprod001 в производственной среде сгенерирует следующий вывод.

--- &id001 !ruby/object:Puppet::Resource::Catalog 
aliases: {} 
applying: false 
classes: [] 
...

Давайте рассмотрим другой пример, где мы хотим получить сертификат CA от мастера Puppet. Он не требует аутентификации с собственным подписанным SSL-сертификатом, так как это то, что требуется перед аутентификацией.

curl --insecure -H 'Accept: s' https://brcleprod001:8140/production/certificate/ca  

-----BEGIN CERTIFICATE----- 
MIICHTCCAYagAwIBAgIBATANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDDAxwdXBw

Справка по Puppet Master и Agent Shared API

GET /certificate/{ca, other}  

curl -k -H "Accept: s" https://brcelprod001:8140/production/certificate/ca 
curl -k -H "Accept: s" https://brcleprod002:8139/production/certificate/brcleprod002 

Справочник по Puppet Master API

Аутентифицированные ресурсы (действительный, требуется подписанный сертификат).

Каталоги

GET /{environment}/catalog/{node certificate name} 

curl -k -H "Accept: pson" https://brcelprod001:8140/production/catalog/myclient

Список отзыва сертификатов

GET /certificate_revocation_list/ca 

curl -k -H "Accept: s" https://brcleprod001:8140/production/certificate/ca 

Запрос сертификата

GET /{environment}/certificate_requests/{anything} GET 
/{environment}/certificate_request/{node certificate name}  

curl -k -H "Accept: yaml" https://brcelprod001:8140/production/certificate_requests/all 
curl -k -H "Accept: yaml" https://brcleprod001:8140/production/certificate_request/puppetclient 

Отчеты Отправить отчет

PUT /{environment}/report/{node certificate name}  
curl -k -X PUT -H "Content-Type: text/yaml" -d "{key:value}" https://brcleprod002:8139/production

Узел — Факты, касающиеся конкретного узла

GET /{environment}/node/{node certificate name}  

curl -k -H "Accept: yaml" https://brcleprod002:8140/production/node/puppetclient 

Статус — используется для тестирования

GET /{environment}/status/{anything}  

curl -k -H "Accept: pson" https://brcleprod002:8140/production/certificate_request/puppetclient

Справочник по API агента Puppet

Когда новый агент настроен на любом компьютере, по умолчанию агент Puppet не прослушивает HTTP-запрос. Его нужно включить в Puppet, добавив «listen = true» в файл puppet.conf. Это позволит агентам Puppet прослушивать HTTP-запрос при запуске агента Puppet.

факты

GET /{environment}/facts/{anything}  

curl -k -H "Accept: yaml" https://brcelprod002:8139/production/facts/{anything}

Выполнить — заставляет клиента обновляться как puppetturn или puppet kick.

PUT  /{environment}/run/{node certificate name}  

curl -k -X PUT -H "Content-Type: text/pson" -d "{}" 
https://brcleprod002:8139/production/run/{anything}

Кукольный — живой проект

Чтобы выполнить живое тестирование применения конфигурации и манифестов на узле Puppet, мы будем использовать живую рабочую демонстрацию. Это можно напрямую скопировать и вставить, чтобы проверить, как работает конфигурация. Если пользователь желает использовать тот же набор кода, он должен иметь такое же соглашение об именах, как показано в фрагментах кода следующим образом.

Начнем с создания нового модуля.

Создание нового модуля

Первый шаг в тестировании и применении конфигурации httpd — создание модуля. Для этого пользователь должен изменить свой рабочий каталог на каталог модулей Puppet и создать базовую структуру модуля. Создание структуры может быть сделано вручную или с помощью Puppet, чтобы создать шаблон для модуля.

# cd /etc/puppet/modules 
# puppet module generate Live-module

Примечание. Команда создания модуля Puppet требует, чтобы имя модуля принимало формат [имя пользователя] — [модуль] для соответствия спецификациям Puppet Forge.

Новый модуль содержит несколько основных файлов, включая каталог манифеста. Каталог уже содержит манифест с именем init.pp, который является основным файлом манифеста модулей. Это пустое объявление класса для модуля.

class live-module { 
} 

Модуль также содержит тестовый каталог, содержащий манифест с именем init.pp. Этот тестовый манифест содержит ссылку на класс live-module в manifest / init.pp:

include live-module

Puppet будет использовать этот тестовый модуль для проверки манифеста. Теперь мы готовы добавить конфигурацию в модуль.

Установка HTTP-сервера

Модуль Puppet установит необходимые пакеты для запуска http-сервера. Это требует определения ресурса, который определяет конфигурацию пакетов httpd.

В каталоге манифеста модуля создайте новый файл манифеста с именем httpd.pp

# touch test-module/manifests/httpd.pp

Этот манифест будет содержать всю конфигурацию HTTP для нашего модуля. В целях разделения мы будем хранить файл httpd.pp отдельно от файла манифеста init.pp

Нам нужно поместить следующий код в файл манифеста httpd.pp.

class test-module::httpd { 
   package { 'httpd': 
      ensure => installed, 
   } 
}

Этот код определяет подкласс тест-модуля с именем httpd, а затем определяет объявление ресурса пакета для пакета httpd. Атрибут sure => selected проверяет, установлен ли требуемый пакет. Если он не установлен, Puppet использует утилиту yum для его установки. Далее следует включить этот подкласс в наш основной файл манифеста. Нам нужно отредактировать манифест init.pp.

class test-module { 
   include test-module::httpd 
}

Теперь пришло время протестировать модуль, который можно сделать следующим образом

# puppet apply test-module/tests/init.pp --noop

Команда puppet apply применяет конфигурацию, представленную в файле манифеста в целевой системе. Здесь мы используем тест init.pp, который ссылается на основной init.pp. –Noop выполняет пробный запуск конфигурации, которая показывает только выходные данные, но фактически ничего не делает.

Ниже приводится вывод.

Notice: Compiled catalog for puppet.example.com in environment 
production in 0.59 seconds 

Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 1 
events 

Notice: Stage[main]: Would have triggered 'refresh' from 1 events 
Notice: Finished catalog run in 0.67 seconds 

Выделенная строка является результатом установленного атрибута обеспечивает => установленный. Отсутствует current_value означает, что Puppet обнаружил, что пакет httpd установлен. Без опции –noop Puppet установит пакет httpd.

Запуск сервера httpd

После установки серверов httpd нам нужно запустить службу, используя замедление другого ресурса: Сервис

Нам нужно отредактировать файл манифеста httpd.pp и отредактировать следующее содержимое.

class test-module::httpd { 
   package { 'httpd': 
      ensure => installed, 
   } 
   service { 'httpd': 
      ensure => running, 
      enable => true, 
      require => Package["httpd"], 
   } 
}

Ниже приведен список целей, которые мы достигли из приведенного выше кода.

  • Состояние sure => проверяет, запущена ли служба, а если нет, то включает ее.

  • Атрибут enable => true устанавливает службу для запуска при загрузке системы.

  • Атрибут require => Package [«httpd»] определяет порядок упорядочения между одним замедлением ресурса и другим. В приведенном выше случае он гарантирует, что служба httpd запускается после установки пакета http. Это создает зависимость между службой и соответствующим пакетом.

Состояние sure => проверяет, запущена ли служба, а если нет, то включает ее.

Атрибут enable => true устанавливает службу для запуска при загрузке системы.

Атрибут require => Package [«httpd»] определяет порядок упорядочения между одним замедлением ресурса и другим. В приведенном выше случае он гарантирует, что служба httpd запускается после установки пакета http. Это создает зависимость между службой и соответствующим пакетом.

Запустите команду Puppet apply, чтобы снова проверить изменения.

# puppet apply test-module/tests/init.pp --noop 
Notice: Compiled catalog for puppet.example.com in environment 
production in 0.56 seconds 

Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 2 
events 

Notice: Stage[main]: Would have triggered 'refresh' from 1 events 
Notice: Finished catalog run in 0.41 seconds 

Настройка httpd сервера

После выполнения вышеуказанных шагов у нас будет установлен и включен HTTP-сервер. Следующий шаг — предоставить некоторую конфигурацию серверу. По умолчанию httpd предоставляет некоторые конфигурации по умолчанию в /etc/httpd/conf/httpd.conf, который предоставляет порт 80 веб-хоста. Мы добавим несколько дополнительных хостов, чтобы обеспечить некоторые пользовательские возможности для веб-хоста.

Шаблон будет использоваться для предоставления дополнительного порта, так как он требует ввода переменной. Мы создадим каталог с именем template и добавим файл с именем test-server.config.erb в нового директора и добавим следующий контент.

Listen <%= @httpd_port %> 
NameVirtualHost *:<% = @httpd_port %> 

<VirtualHost *:<% = @httpd_port %>> 
   DocumentRoot /var/www/testserver/ 
   ServerName <% = @fqdn %> 
   
   <Directory "/var/www/testserver/"> 
      Options All Indexes FollowSymLinks 
      Order allow,deny 
      Allow from all 
   </Directory> 
</VirtualHost>

Приведенный выше шаблон соответствует стандартному формату конфигурации сервера apache-tomcat. Единственное отличие — использование escape-символа Ruby для вставки переменных из модуля. У нас есть полное доменное имя, в котором хранится полное доменное имя системы. Это известно как системный факт .

Системные факты собираются из каждой системы перед созданием каталога марионеток каждой соответствующей системы. Puppet использует команду facter для получения этой информации, и можно использовать facter для получения других подробностей, касающихся системы. Нам нужно добавить выделенные строки в файле манифеста httpd.pp.

class test-module::httpd { 
   package { 'httpd': 
      ensure => installed, 
   } 
   service { 'httpd': 
      ensure => running, 
      enable => true, 
      require => Package["httpd"], 
   } 
   file {'/etc/httpd/conf.d/testserver.conf': 
      notify => Service["httpd"], 
      ensure => file, 
      require => Package["httpd"], 
      content => template("test-module/testserver.conf.erb"), 
   } 
   file { "/var/www/myserver": 
      ensure => "directory", 
   } 
}

Это помогает в достижении следующих вещей —

  • Это добавляет объявление файлового ресурса для файла конфигурации сервера (/etc/httpd/conf.d/test-server.conf). Содержимое этого файла представляет собой шаблон test-serverconf.erb, который был создан ранее. Мы также проверяем пакет httpd, установленный перед добавлением этого файла.

  • Это добавляет второе объявление файлового ресурса, которое создает каталог (/ var / www / test-server) для веб-сервера.

  • Затем мы добавляем связь между файлом конфигурации и службой https с помощью атрибута notify => Service [«httpd»] . Это проверяет, есть ли какие-либо изменения файла конфигурации. Если есть, то Puppet перезапускает сервис.

Это добавляет объявление файлового ресурса для файла конфигурации сервера (/etc/httpd/conf.d/test-server.conf). Содержимое этого файла представляет собой шаблон test-serverconf.erb, который был создан ранее. Мы также проверяем пакет httpd, установленный перед добавлением этого файла.

Это добавляет второе объявление файлового ресурса, которое создает каталог (/ var / www / test-server) для веб-сервера.

Затем мы добавляем связь между файлом конфигурации и службой https с помощью атрибута notify => Service [«httpd»] . Это проверяет, есть ли какие-либо изменения файла конфигурации. Если есть, то Puppet перезапускает сервис.

Далее следует включить httpd_port в основной файл манифеста. Для этого нам нужно завершить основной файл манифеста init.pp и включить следующий контент.

class test-module ( 
   $http_port = 80 
) { 
   include test-module::httpd 
}

Это устанавливает для порта httpd значение по умолчанию, равное 80. Далее необходимо выполнить команду Puppet apply.

Ниже будет вывод.

# puppet apply test-module/tests/init.pp --noop 
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera 
defaults 

Notice: Compiled catalog for puppet.example.com in environment 
production in 0.84 seconds 

Notice: /Stage[main]/test-module::Httpd/File[/var/www/myserver]/ensure: 
current_value absent, should be directory (noop) 

Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: 
/Stage[main]/test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensure: 
current_value absent, should be file (noop) 

Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 4 
events 

Notice: Stage[main]: Would have triggered 'refresh' from 1 events 
Notice: Finished catalog run in 0.51 seconds 

Настройка брандмауэра

Для связи с сервером требуется открытый порт. Проблема в том, что в разных операционных системах используются разные методы управления брандмауэром. В случае Linux версии ниже 6 используют iptables, а версия 7 использует firewalld.

Решение об использовании соответствующего сервиса несколько принимается Puppet с использованием системных фактов и их логики. Для этого нам нужно сначала проверить ОС, а затем запустить соответствующую команду брандмауэра.

Для этого нам нужно добавить следующий фрагмент кода внутри класса testmodule :: http.

if $operatingsystemmajrelease <= 6 { 
   exec { 'iptables': 
      command => "iptables -I INPUT 1 -p tcp -m multiport --ports 
      ${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT && 
      iptables-save > /etc/sysconfig/iptables", 
      path => "/sbin", 
      refreshonly => true, 
      subscribe => Package['httpd'], 
   } 
   service { 'iptables': 
      ensure => running, 
      enable => true, 
      hasrestart => true, 
      subscribe => Exec['iptables'], 
   } 
}  elsif $operatingsystemmajrelease == 7 { 
   exec { 'firewall-cmd': 
      command => "firewall-cmd --zone=public --addport = $ { 
      httpd_port}/tcp --permanent", 
      path => "/usr/bin/", 
      refreshonly => true, 
      subscribe => Package['httpd'], 
   } 
   service { 'firewalld': 
      ensure => running, 
      enable => true, 
      hasrestart => true, 
      subscribe => Exec['firewall-cmd'], 
   } 
} 

Приведенный выше код выполняет следующее:

  • Используя операционную систему, можно определить, является ли используемая ОС версии 6 или 7.

  • Если версия 6, то он запускает все необходимые команды конфигурации для настройки версии Linux 6.

  • Если версия ОС 7, тогда она запускает все необходимые команды, необходимые для настройки брандмауэра.

  • Фрагмент кода для обеих ОС содержит логику, которая обеспечивает запуск конфигурации только после установки пакета http.

Используя операционную систему, можно определить, является ли используемая ОС версии 6 или 7.

Если версия 6, то он запускает все необходимые команды конфигурации для настройки версии Linux 6.

Если версия ОС 7, тогда она запускает все необходимые команды, необходимые для настройки брандмауэра.

Фрагмент кода для обеих ОС содержит логику, которая обеспечивает запуск конфигурации только после установки пакета http.

Наконец, запустите команду Puppet apply.

# puppet apply test-module/tests/init.pp --noop 
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera 
defaults 

Notice: Compiled catalog for puppet.example.com in environment 
production in 0.82 seconds 

Notice: /Stage[main]/test-module::Httpd/Exec[iptables]/returns: 
current_value notrun, should be 0 (noop) 

Notice: /Stage[main]/test-module::Httpd/Service[iptables]: Would have 
triggered 'refresh' from 1 events 

Конфигурирование SELinux

Поскольку мы работаем на машине с Linux версии 7 и выше, следовательно, нам необходимо настроить ее для установления http-связи. По умолчанию SELinux ограничивает нестандартный доступ к HTTP-серверу. Если мы определяем пользовательский порт, то нам нужно настроить SELinux для предоставления доступа к этому порту.

Puppet содержит некоторый тип ресурса для управления функциями SELinux, например, логические значения и модули. Здесь нам нужно выполнить команду semanage для управления настройками порта. Этот инструмент является частью пакета policycoreutils-python, который по умолчанию не установлен на серверах Red Hat. Для достижения вышесказанного нам нужно добавить следующий код внутри класса test-module :: http.

exec { 'semanage-port': 
   command => "semanage port -a -t http_port_t -p tcp ${httpd_port}", 
   path => "/usr/sbin", 
   require => Package['policycoreutils-python'], 
   before => Service ['httpd'], 
   subscribe => Package['httpd'], 
   refreshonly => true, 
} 

package { 'policycoreutils-python': 
   ensure => installed, 
} 

Приведенный выше код выполняет следующее:

  • Пакет require => Package [‘policycoreutils-python’] гарантирует, что у нас установлен необходимый модуль python.

  • Puppet использует semanage, чтобы открыть порт, используя httpd_port в качестве проверяемого.

  • Служба before => гарантирует выполнение этой команды до запуска службы httpd. Если HTTPD запускается до команды SELinux, то SELinux запрос на обслуживание и запрос на обслуживание завершаются неудачно.

Пакет require => Package [‘policycoreutils-python’] гарантирует, что у нас установлен необходимый модуль python.

Puppet использует semanage, чтобы открыть порт, используя httpd_port в качестве проверяемого.

Служба before => гарантирует выполнение этой команды до запуска службы httpd. Если HTTPD запускается до команды SELinux, то SELinux запрос на обслуживание и запрос на обслуживание завершаются неудачно.

Наконец, запустите команду Puppet apply

# puppet apply test-module/tests/init.pp --noop 
... 
Notice: /Stage[main]/test-module::Httpd/Package[policycoreutilspython]/ 
ensure: current_value absent, should be present (noop) 
...
Notice: /Stage[main]/test-module::Httpd/Exec[semanage-port]/returns: 
current_value notrun, should be 0 (noop) 
... 
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Puppet сначала устанавливает модуль python, затем настраивает доступ к порту и, наконец, запускает службу httpd.

Копирование файлов HTML на веб-хосте

С помощью описанных выше шагов мы завершили настройку http-сервера. Теперь у нас есть готовая платформа для установки веб-приложения, которое Puppet также может настроить. Чтобы проверить, мы скопируем некоторые примеры веб-страниц индекса HTML на сервер.

Создайте файл index.html внутри каталога файлов.

<html> 
   <head> 
      <title>Congratulations</title> 
   <head> 
   
   <body> 
      <h1>Congratulations</h1> 
      <p>Your puppet module has correctly applied your configuration.</p> 
   </body> 
</html> 

Создайте манифест app.pp внутри директории манифеста и добавьте следующее содержимое.

class test-module::app { 
   file { "/var/www/test-server/index.html": 
      ensure => file, 
      mode => 755, 
      owner => root, 
      group => root, 
      source => "puppet:///modules/test-module/index.html", 
      require => Class["test-module::httpd"], 
   } 
}

Этот новый класс содержит одно замедление ресурса. Это копирует файл из файлового каталога модуля на веб-сервер и устанавливает его разрешения. Обязательный атрибут гарантирует, что класс test-module :: http успешно завершит настройку, прежде чем кто-либо применяет test-module :: app.

Наконец, нам нужно включить новый манифест в наш основной init.pp манифест.

class test-module ( 
   $http_port = 80 
) { 
   include test-module::httpd 
   include test-module::app 
} 

Теперь запустите команду apply, чтобы фактически проверить, что происходит. Ниже будет вывод.

# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera 
defaults 

Notice: Compiled catalog for brcelprod001.brcle.com in environment 
production in 0.66 seconds 

Notice: /Stage[main]/Test-module::Httpd/Exec[iptables]/returns: 
current_value notrun, should be 0 (noop) 

Notice: /Stage[main]/Test-module::Httpd/Package[policycoreutilspython]/ 
ensure: current_value absent, should be present (noop) 

Notice: /Stage[main]/Test-module::Httpd/Service[iptables]: Would have 
triggered 'refresh' from 1 events 

Notice: /Stage[main]/Test-module::Httpd/File[/var/www/myserver]/ensure: 
current_value absent, should be directory (noop) 

Notice: /Stage[main]/Test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: 
/Stage[main]/Test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensur 
e: current_value absent, should be file (noop) 

Notice: /Stage[main]/Test-module::Httpd/Exec[semanage-port]/returns: 
current_value notrun, should be 0 (noop) 

Notice: /Stage[main]/Test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 8 
Notice: 
/Stage[main]/test-module::App/File[/var/www/myserver/index.html]/ensur: 
current_value absent, should be file (noop) 

Notice: Class[test-module::App]: Would have triggered 'refresh' from 1 
Notice: Stage[main]: Would have triggered 'refresh' from 2 events Notice: 
Finished catalog run in 0.74 seconds

Выделенная строка показывает результат копирования файла index.html на веб-хост.

Завершение модуля

Со всеми вышеописанными шагами наш новый модуль, который мы создали, готов к использованию. Если мы хотим создать архив модуля, это можно сделать с помощью следующей команды.