Доброго всем времени суток. Сегодня я расскажу вам про такое чудо как Puppet. Собственно у софта этого крайне огромный потенциал ограниченный только умением писать скрипты под него (я далеко не мастер в этом, так что не пинайте сильно), но об этом позже. Вкратце, что же это за зверь такой? А зверь это интересный, ибо дает возможность установки/удаления пакетов, изменения файлов, проверки параметров, выполнения некоторых процедур и т. д. и т. п на множестве как однотипных так и разномастных машин (не только десктопов, но и серверов) одномоментно. Теперь о задаче, которую некогда мне надо было решить, собственно она (задача) и познакомила меня с этой системой, которую я сейчас использую довольно часто:
1. Установить на все машинки (linux) в сети один пакет.
2. С помощью этого пакета завести все машинки в домен.
Кратенько и понятненько, собственно если у вас машинок не так уж и много, то заморачиваться с подобной системой я бы не советовал (много времени уйдет на чтение документации, написание и отлаживание скрипта и т. д.), но если у вас тачек эдак 50-100, то тут все решено! Надо брать.
Давай те же приступим к установки самого сервера Puppet, как и всегда я использую CentOS 6 x86_64 minimal
Для начала нам потребуется Ruby на котором и написан сам puppet
1 | yum install ruby -y |
Добавим репозиторий puppetlabs, для получения актуальной версии puppet (проблема версионности у puppet крайне остра, без соответствия версии на сервере и клиенте, вы не сможете работать)
1 | rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm |
Ставим сам puppet
1 | yum install puppet-server |
Стартуем
1 | /etc/init.d/puppetmaster start |
Ставим необходимый нам в дальнейшем модуль, подробнее о нем тут.
1 | puppet module install puppetlabs-stdlib |
Отключаем selinux
1 | nano /etc/sysconfig/selinux |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted |
1 | setenforce 0 |
Теперь немного изменим конфиг файл, в нашем случаем мы будем использовать puppet и для передачи файлов, а для этого нам необходимо сделать следующие.
1 | nano /etc/puppet/puppet.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | [main] # Директория для логов logdir = /var/log/puppet # Директория для PID rundir = /var/run/puppet # Директория для ssl ssldir = $vardir/ssl # Данный параметр даст возможность # установки всех модулей с сервера на клиенты. pluginsync = true [agent] # Директория где храниться список классов, нам пока не надо ;) classfile = $vardir/classes.txt # Директория где храниться кеш локальной конфигурации localconfig = $vardir/localconfig [master] # Включаем файл-сервер reports = store, http # URL по которому будет доступен файл-сервер reporturl = http://puppet.test:3000/reports/upload # Директория на сервере, где будут храниться наши файлы. modulepath = /etc/puppet/modules |
Так же вам придется под редактировать файл.
1 | nano /etc/puppet/fileserver.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # fileserver.conf # Puppet automatically serves PLUGINS and FILES FROM MODULES: anything in # <module name>/files/<file name> is available to authenticated nodes at # puppet:///modules/<module name>/<file name>. You do not need to edit this # file to enable this. # MOUNT POINTS # If you need to serve files from a directory that is NOT in a module, # you must create a static mount point in this file: # [files] path /etc/puppet/files allow * # # In the example above, anything in /etc/puppet/files/<file name> would be # available to authenticated nodes at puppet:///extra_files/<file name>. # # Mount points may also use three placeholders as part of their path: # # %H - The node's certname. # %h - The portion of the node's certname before the first dot. (Usually the # node's short hostname.) # %d - The portion of the node's certname after the first dot. (Usually the # node's domain name.) # PERMISSIONS # Every static mount point should have an `allow *` line; setting more # granular permissions in this file is deprecated. Instead, you can # control file access in auth.conf by controlling the # /file_metadata/<mount point> and /file_content/<mount point> paths: # # path ~ ^/file_(metadata|content)/extra_files/ # auth yes # allow /^(.+)\.example\.com$/ # allow_ip 192.168.100.0/24 # # If added to auth.conf BEFORE the "path /file" rule, the rule above # will add stricter restrictions to the extra_files mount point. |
Процедура работы между сервером и клиентом зашифрована, с одной стороны — это безопасно, с другой стороны – если версия и клиента не соответствует, то фигушки вам, а не puppet. Так же интересной особенностью является то, что у разных дистрибутивов в репозиториях разные версии puppet, так что — поставьте всем с официальной репы и будет вам счастье, бабочки и улыбки детей.
Собственно для организации работы нам нужен подписанный сертификат на клиенте. (выполныем на стороне клиента)
1 | puppetd -server puppet.test -verbose -test |
Теперь, нам необходимо подписать сертификат на сервере.
(выполняем на сервере)
1 | puppetca --sign --all |
Для просмотра всех запросов на подписание сертификата, на стороне сервера вы можете выполнить след.
1 | puppetca --list |
Собственно если вы уверены, что все пользователи в вашей сети имеют некий статичный индификатор, который уникален для вас, то вы можете сделать autosing, для этого необходимо создать файл
1 | nano /etc/puppet/autosign.conf |
И там отметить выборку по маске, в моем случае это (к примеру ST001)
1 | ST* |
Ну а если вам совсем плевать на безопасность, то можно и просто
1 | * |
Также по данному вопросу советую ознакомиться вот с этой статьей.
На этом часть про установку, можно завершить и приступить к части про сам скрипт. iptables?
Наш файл конфигурации находится тут
1 | /etc/puppet/manifests/site.pp |
Собственно его мы и будем редактировать, я советую вам поставить какой нибудь текстовый редактор с подсветкой кода (слышал что под vim есть плагин для puppet, но так как я сам не пользуюсь vim… то)
1 | nano /etc/puppet/manifests/site.pp |
Я сразу хоче извиниться, за поехавшую табуляцию. Если кому надо могу выслать сам файл целеком на почту. Для введения машин в домен я использовал PBIS-Open
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | # Тут мы определяем в каком домене наша машинка, # для этого используются так называемые facters # собственно так библиотека которую мы ставили # ранее в статье нам и позволит их заюзать case $::domain { new.kz:{ info ("Тачка уже в домене") } old.kz: { # Если машинка не в том домене, то... case $::operatingsystem { # Если операционная система на машинке debian или ubuntu debian, ubuntu: { # Собственно тут надо обратить внимание # ранее для введения тачки в домен я # использовал likewise-open, который # имеет некий баг по смене пароля у # пользователя, и если вы подобного # софта не юзали, то можете данный if # и строки далее (package) закоментить. if defined (Package["likewise-open"]) { exec{"leave": path => "/usr/bin:/usr/sbin:/bin", command => "domainjoin-cli leave", } # Удаляем более ненужный likewise-open package { "likewise-open": ensure => "purged", } } # Определим разрядность нашей системы, дабы установить необходимый # пакет для ввода тачки в домен. Ну и установим его (как иначе то) case $::hardwareisa{ x86_64, x86-64, amd64, x64: { file {"pbis_deb_64.tar.gz": path => "/home/pbis_deb_64.tar.gz", mode => 644, source => "puppet:///etc/puppet/files/pbis_deb_64.tar.gz",} exec {"unpack": path => "/usr/bin:/usr/sbin:/bin", command => "cd /home", onlyif => [ "tar xfvz ./pbis_deb_64.tar.gz", "cd ./pbis", ], } } x86, x86_32, IA-32:{ file {"pbis_deb_32.tar.gz": path => "/home/pbis_deb_32.tar.gz", mode => 644, source => "puppet:///etc/puppet/files/pbis_deb_32.tar.gz",} exec {"unpack": path => "/usr/bin:/usr/sbin:/bin", command => "cd /home", onlyif => [ "tar xfvz ./pbis_deb_32.tar.gz", "cd ./pbis", ], } } # В случае если разрядность системы на определена default: { fail("Нет репазитория для ${::hardwareisa}") } } exec {"install": path => "/usr/bin:/usr/sbin:/bin", command => "chmod 777 ./install", onlyif => [ "./install", ], } # Установим ntp клиент, если он не установлен # И настроим его на наш сервер if ! defined (Package["ntp"]) { package { "ntp": ensure => "installed", } } file { 'ntp.conf': path => '/etc/ntp.conf', ensure => file, require => Package['ntp'], source => "puppet:///modules/ntp/ntp.conf", } service { "ntp": name => "ntp", ensure => running, enable => true, subscribe => File["ntp.conf"], } # Пропишем наш домен в hosts exec { "nameserver": path => "/usr/bin:/usr/sbin:/bin", command => "cp /etc/resolv.conf /etc/resolv.conf.orig", onlyif => [ "rm -f /etc/resolv.conf", "touch /etc/resolv.conf", "echo 'nameserver 192.168.1.9' >> /etc/resolv.conf", "echo 'search new.kz' >> /etc/resolv.conf", "echo 'domain new.kz' >> /etc/resolv.conf", ], } # Ну и введем в домен exec { "domain": path => "/usr/bin:/usr/sbin:/bin", command => "domainjoin-cli leave", onlyif => [ "domainjoin-cli join new.kz operator@new.kz 'password_for_domain'", ] } } fedora: { } default: { fail("Нет репазитория для ${::operatingsystem}") } } } fedora: { } default: { fail("Нет репазитория для ${::operatingsystem}") } } } |
Собственно вот и все, по факту более детального изучения самого языка, советую обратиться вот к этому ресурсу, а еще вот тут интересно. Если у вас есть какие нибудь конструктивные предложения по оптимизации скрипта или замечания по другим моментам данной статьи, милости прошу в коментарии. Всем удачи!
Добавить комментарий