Как установить Puppet 4 на Ubuntu 14.04

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

Puppet доступен в 2 вариантах: Puppet Enterprise, которое стоит определенных денег,  и как приложение с открытым исходным кодом. Puppet работает на большинстве дистрибутивов Linux, различных платформах UNIX и Windows.

В этом мануале мы рассмотрим, как установить Puppet 4  с открытым исходным кодом в связке клиент(agent)-сервер(master) на Ubuntu 14.04. В этой установке,  Puppet master(сервер) запускает серверное программное обеспечение, он также может быть использован для управления другими серверами. Заметьте, что мы будем использовать серверный пакет Puppet, а не Passenger или какое-либо другое вычислительное окружение.

Предварительные условия

Чтобы начать пользоваться данным руководством, вы должны иметь доступ суперпользователя или root ко всем серверам, которые хотите использовать в связке с Puppet. Вы также должны создать новый сервер Ubuntu 14.04 , который и будет выступать в качестве главного master-сервера Puppet. Если у вас нет  серверной инфраструктуры, не отчаивайтесь,  воссоздайте примерную инфраструктуру (описанную ниже) при помощи мануала настройки DNS.

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

  • Частная сеть DNS: Прямой и обратный DNS должен быть настроен, и каждый сервер должен иметь уникальное имя хоста. Вот туториал, который поможет настроить свой собственный сервер DNS частной сети. Если у вас нет настроенного DNS, то  вы должны использовать hosts файл  для разрешения имен. Будем считать, что вы будете использовать вашу частную сеть для связи внутри вашей инфраструктуры.
  • Открытые порты брандмауэра: master(сервер)  Puppet должен быть доступен на порту 8140. Если вы не знаете как настроить ваш брандмауэр, просмотрите этот UFW учебник для получения инструкций о том, как разрешить входящие запросы на порт 8140.

Пример инфраструктуры

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

Имя хоста Роль Частное полное доменное имя
host1 Generic Ubuntu 14.04 server host1.nyc3.example.com
host2 Generic Ubuntu 14.04 server host2.nyc3.example.com
ns1 Primary nameserver ns1.nyc3.example.com
ns2 Secondary nameserver ns2.nyc3.example.com

Агент(agent) Puppet будет установлен на все эти хосты. Эти хосты будут ссылаться на их частные сетевые интерфейсы, которые отображаются на “.nyc3.example.com” субдомена в DNS. Это та же самая инфраструктура, которая описана в руководстве: Как настроить параметры BIND в качестве частной сети DNS-сервера на Ubuntu 14.04.

Создание сервера(master) Puppet

При создании сервера на Ubuntu 14.04 x64 в качестве имени хоста будет использоваться “puppet”. Требования к оборудованию зависят от того, сколькими  узлами агента вы хотите управлять; два ядра процессора и 1 Гб оперативной памяти будет минимальным требованием для управления несколькими  узлами. Сервер  Puppet, по умолчанию, будет использовать 2 Гб оперативной памяти.

Добавьте в  свою частную сеть следующие настройки:

Имя хоста Роль Частное полное доменное имя
puppet Puppet master puppet.nyc3.example.com

Установка NTP

Главный сервер Puppet должен поддерживать точное системное время, чтобы избежать возможных проблем, когда он выдает сертификаты агенту. Для этой цели мы бум использовать Network Time Protocol (NTP).

Во-первых, обратите внимание на доступные часовые пояса, с помощью следующей команды:

$ timedatectl list-timezones

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

$ sudo timedatectl set-timezone America/New_York

Установку NTP можно сделать несколькими командами:

$ sudo apt-get update
$ sudo apt-get -y install ntp

Далее откройте ntp.conf для редактирования:

$ sudo vi /etc/ntp.conf

Добавьте серверы времени со страницы NTP Project Pool в верхней части файла (замените их нужными  серверами):

/etc/ntp.conf excerpt

server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 2.us.pool.ntp.org
server 3.us.pool.ntp.org

Start NTP для добавления новых серверов времени:

$ sudo service ntp restart

Установка сервера Puppet

Сервер Puppet представляет собой программное обеспечение, которое работает на главном мастер(master) сервере  Puppet. Это именно тот компонент, который будет продвигать нужные конфигурации  на другие сервера, которые будут работать под управлением программного обеспечения агента(agent) Puppet.

Добавить официальные Puppet Labs репозитории можно  с помощью этих команд:

$ cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
$ sudo dpkg -i puppetlabs-release-pc1-trusty.deb
$ sudo apt-get update

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

$ sudo apt-get -y install puppetserver

Настройка выделенного объема памяти

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

Во первых, откройте /etc/default/puppetserver в вашем любимом текстовом редакторе. Мы будем использовать vi:

$ sudo vi /etc/default/puppetserver

Затем, найдите строку JAVA_ARGS, а также использовать параметры -Xms и -Xmx установить распределение памяти. Затем найдите строку JAVA_ARGS, и укажите параметры -Xms и –Xmx, чтобы установить распределение памяти:

Memory Allocation

JAVA_ARGS=”-Xms3g -Xmx3g

Запуск Puppet Server

Теперь мы готовы запустить Puppet Server с помощью следующей команды:

$ sudo service puppetserver restart

Затем включите сервер так, чтобы он запускается при загрузке главного сервера:

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

Установка агента Puppet

Агент(agent) должен быть установлен на любом сервере, которым будет управлять master server. В большинстве случаев агент будет включать каждый сервер в вашей инфраструктуре. Как уже упоминалось во введении, агент Puppet может работать на всех основных дистрибутивов Linux, некоторых платформах UNIX и Windows. Поскольку установка на разные ОС минимальна различна, мы будем обсуждать только установку на сервера Ubuntu 14.04. Инструкции по установке агента Puppet на CentOS 7  можно найти здесь.

Выполните следующие действия на всех серверах агента

Включить официальные репозитории:

$ cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb

$ sudo dpkg -i puppetlabs-release-pc1-trusty.deb

Затем, установите puppet-agent:

$ sudo apt-get update

$ sudo apt-get install puppet-agent

Теперь, когда агент установлен, запустите его с помощью следующей команды:

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

Подпись сертификатов Puppet Master

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

Текущий список сертификатов

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

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

Если вы только что создали свой первый узел агента, вы увидите один запрос. Он будет выглядеть так:

“host1.nyc3.example.com” (SHA256) 15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:DD:B5:1C:33:F7:76:67:F3:F6:23:AE:07:4B:F6:E3:CC:04:11:4C

Подпись запроса

Чтобы подписать запрос вы можете использовать puppet cert sign. Например, чтобы подписать сертификат host1.nyc3.example.com , можно использовать следующую команду:

$ sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com

Вы увидите следующий вывод, который указывает, что запрос на сертификат был подписан:

Notice: Signed certificate request for host1.nyc3.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at ‘/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem’

Отзыв сертификата

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

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

Приступаем к работе с Puppet

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

Как собрать данные

Puppet собирает данные о каждом из своих узлов с помощью инструмента под названием facter. Facter, по умолчанию, собирает информацию, которая полезна для настройки системы (OS имен, имен хостов, IP-адреса, ключей SSH, и многое другое). . Можно добавлять собственные факты, которые не являются данными по умолчанию.

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

Чтобы увидеть список фактов, которые автоматически собираются на вашем узле агента, выполните следующую команду:

/opt/puppetlabs/bin/facter

Главный файл Manifest

Puppet использует предметно-ориентированный язык для описания конфигурации системы, и эти описания сохраняются в файлах, называемых “манифесты“, и имеют эти файлы расширение .pp. По умолчанию, главный манифест-файл располагается на master сервере Puppet по адресу:

/etc/puppetlabs/code/environment/production/manifests/site.pp. Давайте создадим файл-манифест:

$ sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp>hostname

Как  главный манифест исполняется

Агент(agent) периодически сверяется с сервером(если быть точным, каждые 30 минут). Когда он это делает он посылает данные о себе мастеру(master) и вытаскивает список ресурсов и их желаемых состояний.

Узел агента(agent) будет пытаться вносить изменения для достижения желаемого состояния. Этот цикл будет продолжаться до тех пор, пока мастер  работает и поддерживает связь с узлами агента.

Немедленное исполнение на узле конкретного агента(agent)

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

$ /opt/puppetlabs/bin/puppet agent –test

Вы можете увидеть вывод вроде этого:

Info: Using configured environment ‘production’
Info: Retrieving pluginfacts
Info: Retrieving plugin

Info: Loading facts
Info: Caching catalog for host1
Info: Applying configuration version ‘1457389302’
Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as ‘{md5}dd769ec60ea7d4f7146036670c6ac99f’
Notice: Applied catalog in 0.04 seconds

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

Разовые манифесты

Команда puppet apply, позволяет выполнять манифесты , которые не относятся к главному манифесту. Вот пример:

$ sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp

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

Определение узла

Если вы хотите указать ресурс для определенных узлов, то это делается при помощи манифеста.

В Master откройте site.pp:

sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp

 Теперь добавьте следующие строки:

site.pp example

node ‘ns1‘, ‘ns2‘ { # applies to ns1 and ns2 nodes
file {‘/tmp/dns’: # resource type file and filename
ensure => present, # make sure it exists
mode => ‘0644’,
content => “Only DNS servers get this file.\n”,
}
}
node default {} # applies to nodes that aren’t explicitly defined

Теперь, Puppet гарантирует, что файл в директории /tmp/dns будет существовать на NS1 и NS2.
Обратите внимание, что если вы не определили ресурс, Puppet сделает все возможное, чтобы не прикоснуться к нему. Так что если вы удалите эти ресурсы из манифеста, Puppet не будет удалять файлы, созданные им.
Эти примеры не делают ничего полезного, но они доказывают, что Puppet работает правильно.

Заключение

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