Puppetmaster на Debian — или как быть если я один, а их много?

Случайно узнал о весьма интересной системе управления конфигурациями которая называется puppet. Решил попробовать что это такое и насколько оно полезно в администрировании большого парка ПК с ОС Linux на борту. Скажу сразу, что система интересна, и понравится в первую очередь тем кто считает парк обслуживаемых машин слишком большим. Или тем кто просто любит все автоматизировать и не любит выполнять однотипную работу по много раз. Я отношусь и к первым и ко вторым, поэтому и решил попробовать … глядите что получилось!
Итак, для эксперимента я взял две машины. Одну из них сделал сервером (puppetmaster), а вторую — клиентом (puppet). Машины назвал соответственно:
server — сервер
client — клиент.
Машины работают в сети 192.168.0.0/24
Как настроить puppetmaster читайте далее …
Сначала устанавливаем и настраиваем серверную часть — кукловода.
server:

root@server:~# apt-get install puppetmaster

Даем права пользователям нашей сети (192.168.0.0/24) работать с файлами через puppet
Для этого редактируем конфигурационный файл /etc/puppet/fileserver.conf до такого вида

root@server:~# cat /etc/puppet/fileserver.conf
# This file consists of arbitrarily named sections/modules
# defining where files are served from and to whom

# Define a section 'files'
# Adapt the allow/deny settings to your needs. Order
# for allow/deny does not matter, allow always takes precedence
# over deny
[files]
  path /etc/puppet/files
#  allow *.example.com
#  deny *.evil.example.com
  allow 192.168.0.0/24

[plugins]
#  allow *.example.com
#  deny *.evil.example.com
  allow 192.168.0.0/24
root@server:~#

Все свои рецепты и ноды можно описывать в одном единственном файле либо разделить на разные. Я выбрал вариант с разделением — так проще будет работать, когда и рецептов и нод станет огромное количество.
Для такой конфигурации нужно создать файлик /etc/puppet/manifests/site.pp и поместить туда следующее:

root@server:~# cat /etc/puppet/manifests/site.pp
import "classes/*.pp"
import "nodes/*.pp"

Затем создал две директории /etc/puppet/manifests/classes и /etc/puppet/manifests/nodes для рецептов и нод соответственно.

root@server:~# mkdir /etc/puppet/manifests/classes
root@server:~# mkdir /etc/puppet/manifests/nodes

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

root@server:~# touch /etc/puppet/manifests/nodes/default.pp

Теперь переходим к установке и настройке клиента
client:

root@client:~# apt-get install puppet

в файле /etc/puppet/puppet.conf добавляем строчку для указания сервера:

server=server.my.company.com

в файле /etc/default/puppet ищем параметр «START» и присваиваем ему значение yes чтобы было так:

root@client:~# grep START /etc/default/puppet
START=yes
root@client:~#

после этих настроек можно запускать клиента

root@client:~# service puppet start

Всё, клиент настроен для работы с сервером server.my.company.com и запущен. Он автоматически каждых 30 минут (по умолчанию) начал подключаться к серверу, но авторизироваться и запросить свою конфигурацию клиент сможет только тогда когда мы подпишем его сертификат на сервере. Делается это очень просто, на сервере смотрим список новых не авторизированных клиентов.
server:

root@server:~# puppetca --list
client.my.company.com
root@server:~#

Авторизируем хост client.my.company.com командой puppetca —sign, это даст возможность клиенту взаимодействовать с сервером:

root@server:~# puppetca --sign client.my.company.com
notice: Signed certificate request for client.my.company.com
notice: Removing file Puppet::SSL::CertificateRequest client.my.company.com at '/var/lib/puppet/ssl/ca/requests/client.my.company.com.pem'
root@server:~#

В результате мы имеем два связанных puppet-ом компьютера. И теперь начинается самое интересное — клиентом можно управлять с помощью неких правил написанных на сервере, которые называются рецептами. Если перейти к терминологии самого puppet то клиент теперь стал нодой которая обращается к серверу каждые полчаса и запрашивает рецепты приготовленные для нее. А вот тут и кроется вся магия которую дает нам puppet! Есть «огромный» парк пк — от 2 до бесконечности. Есть действие которое нужно выполнить на всех либо части пк. Если в нашем распоряжении есть puppet, все что нужно сделать — написать рецепт и применить его для группы пк. В течении получаса рецепт будет выполнен автоматически 🙂
Если объяснение вам показалось туманным и непонятным, даю более жизненный пример. Система потихоньку перекочевала в продакшин, был один сервак с мастером и около 150 клиентов. Както я заметил что на большинстве машин с Debian squeeze используется для распаковки rar архивов пакет «rar», который, к сожалению, не понимает кириллицу. В результате гугления и чтений багтрекера выяснилось что бага старая и хорошо известная. Предлагается удалить пакет «rar» и вместо него использовать «unrar». Меня данное решение вполне устраивает. Итак, машин много, а я один — к тому же ленивый 🙂 Все что сделал — написал вот такой простенький рецепт:

root@server:~# cat /etc/puppet/manifests/classes/bugfix.pp
class bugfix {
     # remove a package and purge its config files
     package { "rar":
         ensure => "purged",
     }
     
     package { "unrar":
         ensure => "installed",
         require => Package['rar'],
     }

Добавил этот рецепт для выполнения на всех компах сети, для этого прописал в файлик default.pp (помните выше по тексту мы его создавали пустым?)

root@server:~# cat /etc/puppet/manifests/nodes/default.pp
node default {
    include "bugfix"
}
root@server:~#

После этого перезапускаем сервис puppetmaster:

root@server:~# service puppetmaster restart

И тут самая приятная фраза, теперь можно откинуться на спинку стула и ждать … или чем вы там привыкли заниматься когда работа делается автоматически 🙂 ??
После применения данного рецепта в логах apt на клиенте видим такое:

Start-Date: 2011-11-14  20:16:06
Commandline: /usr/bin/apt-get -y -q remove --purge rar
Purge: rar:i386 (3.9.3-1)
End-Date: 2011-11-14  20:16:11

Start-Date: 2011-11-14  20:16:19
Commandline: /usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install unrar
Install: unrar:i386 (3.9.10-1)
End-Date: 2011-11-14  20:16:22

Ну вот и отлично! Все клиенты в течении получаса автоматически получили этот рецепт и выполнили его. А я пью чай 🙂 Сильно? Ато! Ведь теперь вам всеравно 4 у вас ПК или 444 🙂
Еще интересный случай, заметил что в нашей сборке не было проверки орфографии украинского языка в OO, а надо! Не проблема — сделаем! 🙂
С официального сайта OpenOffice скачал файлик словаря dict-uk_UA-1.6.5.oxt и поместил его в директорию /etc/puppet/files
Модифицируем уже существующий рецепт bugfix.pp вот таким образом:

class bugfix {
     # remove a package and purge its config files
     package { "rar":
         ensure => "purged",
     }
     
     package { "unrar":
         ensure => "installed",
         require => Package['rar'],
     }

### OO ADD uk_UA dictionary ###
     file { "/usr/lib/openoffice/share/extension/install/dict-uk_UA-1.6.5.oxt":
          ensure => "present",
          source => "puppet:///files/dict-uk_UA-1.6.5.oxt",
     }

     exec { "OO-add_uk_dict":
          command => "/usr/bin/unopkg add --shared /usr/lib/openoffice/share/extension/install/dict-uk_UA-1.6.5.oxt",
          logoutput   => false,
          refreshonly => true,
          subscribe   => file["/usr/lib/openoffice/share/extension/install/dict-uk_UA-1.6.5.oxt"]
     }
}

И уже через полчаса — вуаля! Все пк получили файл и он был добавлен в словари OO. А теперь представьте себе сделать тоже самое на 150-ти компах 🙂 Ну-ну ….

Удачи!

    • vitich
    • Февраль 17th, 2014 3:50пп

    Статейка — супер! Отправлю нашему линуксоиду на заметку. 🙂

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

Why ask?