CentOS 6.6 — Puppet Server (Puppetmaster) Install

С чего начинается сервер? Конечно же с sudo, vim, rsync, mc, screen, ntp, iptables, ssh, selinux
Надеюсь все это у вас установлено и настроено? Тогда поехали дальше!

У компании Puppet Labs есть свой репозитарий для софта, его и будем использовать. Для начала добавим его:

puppet:~$ sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

Установим puppet-server:

puppet:~$ sudo yum install puppet-server

Настроим основные параметры для сервиса puppetmaster (он же puppet-server):

puppet:~$ sudo vim /etc/sysconfig/puppetmaster

Тут меня интересуют такие опции, я их розкомментировал и чуть подправил:

PUPPETMASTER_MANIFEST=/etc/puppet/manifests/site.pp
PUPPETMASTER_LOG=/var/log/puppet/master.log

Дальше настройка происходит в директории /etc/puppet, для удобства переходим туда:

puppet:~$ cd /etc/puppet/

Смотрим что тут есть:

puppet:/etc/puppet$ ls -l
total 28
-rw-r--r-- 1 root root 4178 Mar 25 16:33 auth.conf
drwxr-xr-x 3 root root 4096 Mar 30 12:21 environments
-rw-r--r-- 1 root root 1462 Mar 25 16:32 fileserver.conf
drwxr-xr-x 2 root root 4096 Mar 25 16:33 manifests
drwxr-xr-x 2 root root 4096 Mar 25 16:33 modules
-rw-r--r-- 1 root root  853 Mar 25 16:32 puppet.conf
puppet:/etc/puppet$

Оглядываясь на некоторый опыт работы с puppet могу сказать что мне не хватает тут директории files, в которой удобно хранить файлики которые буду передавать агентам (различные конфиги, скрипты и тп). Создам ее сразу:

puppet:/etc/puppet$ sudo mkdir files

Ну и сразу настрою раздачу файлов puppetmaster-ом, это делается в конфиге fileserver.conf путем добавления вот таких строчек:

[files]
  path /etc/puppet/files
  allow *

Теперь пропишем все возможные альтернативные DNS имена нашего puppet master-а. Они нужны в случае если есть необходимость генерить корневой сертификат с разными именами сервера. Это не обязательно, но в моем случае нужно было. Поэтому я в конфиге puppet.conf в раздел [main] добавил вот что:

# Master Names for Cert Generate
dns_alt_names = puppet,puppet.intranet,puppet.mycompany.com

И последний штрих — основной манифест, тот что /etc/puppet/manifests/site.pp, пишем туда для начала такое:

node default {
   }

Пробуем запустить сервис puppetmaster, первый раз это делается вот такой командой:

puppet:~$ sudo puppet master --verbose --no-daemonize

Если все настроено верно, то вы увидите много строчек начинающихся словами Info либо Notice — это нормально. Если же будут Error-ы … чтото вы настроили неверно и следует обратить внимание на сообщения — наверняка там будет указано в чем ошибка.
У меня все прошло отлично, остановить сервис можно просто комбинацией Ctrl + C и потом уже стартонуть как положено:

puppet:~$ sudo service puppetmaster start
Starting puppetmaster:                                     [  OK  ]
puppet:~$

Проверим слушается ли порт 8140:

puppet:~$ sudo netstat -lnp |grep 8140
tcp        0      0 0.0.0.0:8140                0.0.0.0:*                   LISTEN      3368/ruby          
puppet:~$

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

puppet:~$ sudo chkconfig puppetmaster on

Также стоит добавить правило в iptables чтобы розрешить входящие соединения от агентов на порт 8140. В моем случае правила лежат в /etc/sysconfig/iptables. Я добавил туда строчку перед правилом ssh:

# Puppet Master
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT

Применим новые правила iptables:

puppet:~$ sudo iptables-restore /etc/sysconfig/iptables

Со стороны сервера мы все необходимые настройки сделали. Но прелесть puppet-а не просто в сервере, а в связке клиент-сервер. Давайте попробуем создать пробный манифест на сервере, добавить клиента и применить к нему созданный манифест.

Да будет агент!
Есть некий другой хост CentOS 6.6, хотим им рулить с помощью puppet — не вопрос. Клиент настраивается очень просто!
Добавляем репозитарий:

agent01:~$ sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

Установим puppet-agent:

agent01:~$ sudo yum install puppet

Настроим основные параметры для сервиса puppe (он же puppet-agent):

agent01:~$ sudo vim /etc/sysconfig/puppet

Розкомментировал и чуть подправил вот что:

PUPPET_SERVER=puppet.intranet
PUPPET_LOG=/var/log/puppet/puppet.log

Больше никаких настроек не нужно, запускаем сервис:

agent01:~$ sudo service puppet start
Starting puppet agent:                                     [  OK  ]
agent01:~$

И добавляем в автозагрузку сервис puppet:

agent01:~$ sudo chkconfig puppet on

Топаем на сервер и смотрим что там в логах puppetmaster:

puppet:~$ sudo cat /var/log/puppet/master.log
....
Mon Mar 30 13:54:22 +0100 2015 Puppet (notice): agent01.intranet has a waiting certificate request
....

Вот же он, наш агент 🙂 Ждет подтверждения сертификата, нужно подтвердить:

puppet:~$ sudo puppet ca sign agent01.intranet

Теперь он в семье, дружно виляет хвостом и ждем своих манифестов. Давайте сварганим ему рецептик для теста.
Начинать стоит с простого, к примеру хочу применить некоторые параметры sysctl к тестовому хосту agent01, а потом возможно еще к какомуто серверу, или группе серверов. В обычном случае нам нужно зайти на сервер (или группу серверов), создать там файлик в /etc/sysctl.d/some_file.conf и потом применить их командой sysctl -p. Хорошо если у вас 2 или 3 сервера, а если 153? Руки сотрутся по ssh ходить 🙂
С puppet — это раз плюнуть! Хлопотно только на момент внедрения, когда нужно на каждом сервере установить и настроить puppet-agent. Ну вобщем, поехали дальше … Создадим файлик /etc/puppet/files/rh6/sysctl.d/77-tcp.conf с необходимыми конфигами sysctl, для примера вот так:

# TCP Options #
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 720000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 7
net.ipv4.tcp_keepalive_intvl = 30

Теперь создадим модуль rh6_sysctl, для начала нужна директория:

puppet:~$ sudo mkdir -p /etc/puppet/modules/rh6_sysctl/manifests/

Модули требуют обязательно файлик init.pp, не вопрос! Сделаем /etc/puppet/modules/rh6_sysctl/manifests/init.pp с таким вот манифестом (комментарии к манифесту там же):

class rh6_sysctl {
  # убедиться что директория /etc/sysctl.d существует
  # владелец root:root, права на директорию 755
  file { "/etc/sysctl.d":
        ensure => "directory",
        owner  => "root",
        group  => "root",
        mode   => 755,
  }

  # Зависит от директории File["/etc/sysctl.d"]
  # если директория отсутствует - сначала будет выполнен рецепт ее создания
  # а потом то что тут: создать файлик /etc/sysctl.d/77-tcp.conf, права 644
  # владелец файла root:root
  #содержимое взять с файла /etc/puppet/files/rh6/sysctl.d/77-tcp.conf на puppetmaster
  file { "/etc/sysctl.d/77-tcp.conf":
        mode    => 644,
        owner   => "root",
        group   => "root",
        ensure  => "present",
        source  => "puppet:///files/rh6/sysctl.d/77-tcp.conf",
        require => File["/etc/sysctl.d"],
  }

  # Это чтото вроде подписки на обновление файла /etc/sysctl.d/77-tcp.conf
  # команда "sysctl -p /etc/sysctl.d/77-tcp.conf" выполнится только если файл изменился
  exec { "refresh_sysctl":
        command => "sysctl -p /etc/sysctl.d/77-tcp.conf",
        subscribe => File["/etc/sysctl.d/77-tcp.conf"],
        refreshonly => true,
  }
}

Сложно? Не очень …
Применим к серверу agent01.intranet наш сварганенный на скорую руку модулец rh6_sysctl. Для этого открываем файлик /etc/puppet/manifests/site.pp и пишем туда после node default вот что:

node 'agent01.intranet' {
  include rh6_sysctl
}

Теперь перегружаем puppetmaster

puppet:~$ sudo service puppetmaster restart

А теперь и сервис агента, так как неохота ждать следующего обращения к puppetmaster. По умолчанию агент раз в 30 минут ходит на сервер за рецептами. Но при старте идет сразу же, такчто рестарт сервиса то что нужно при отладке:

agent01:~$ sudo service puppet restart

И смотрим в логи агента:

agent01:~$ sudo cat /var/log/puppet/puppet.log
....
Mon Mar 30 14:03:16 +0000 2015 Puppet (notice): Starting Puppet client version 3.7.5
Mon Mar 30 14:03:18 +0000 2015 /Stage[main]/Rh6_sysctl/File[/etc/sysctl.d]/ensure (notice): created
Mon Mar 30 14:03:18 +0000 2015 /Stage[main]/Rh6_sysctl/File[/etc/sysctl.d/77-tcp.conf]/ensure (notice): defined content as '{md5}5c01b1ec505972bd48f587c7ea5e3d73'
Mon Mar 30 14:03:18 +0000 2015 /Stage[main]/Rh6_sysctl/Exec[refresh_sysctl] (notice): Triggered 'refresh' from 1 events
Mon Mar 30 14:03:18 +0000 2015 Puppet (notice): Finished catalog run in 1.29 seconds
agent01:~$

Убедиться что настройки действительно применились вы можете с помощью sysctl … не буду писать ерунды, как это сделать и так ясно.
Прелесть puppet в том что все рецепты, классы, модули можно компоновать между собой, применять к ноде или группе нод, контролировать состояние с помощью dashboard (опишу чуть позже как настроить). К примеру для начала рекомендую написать набор мелких рецептов по базовой настройке дефолтного сервера (установка неких пакетов необходимых везде: rsync, mc, vim, htop, screen etc… , установка базовых сервисов, подсовывание конфигов, перегрузка, автозагрузка: ntpd, sshd etc … , настройка sudo, создание учеток админов или юзеров, и тд и тп) после этого приступать к написанию более продвинутых манифестов для автоматизации настройки web-server, db-server, ftp-server … etc.

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?