Master of puppets: Инсталирање и конфигурирање на системот за управување со далечинска конфигурација Puppet. Master of puppets: Инсталирање и конфигурирање на системот за управување со далечинска конфигурација Puppet Инсталирање кукла

За да го користите Puppet поефикасно, треба да разберете како се градат модулите и манифестациите. Овој водич ќе ве проучи како функционираат овие компоненти на куклата со поставување на стек LAMP на серверот Ubuntu 14.04.

Барања

  • Инсталација на кукли (мајстор и агент). Повеќе за ова -.
  • Способност да се создаде барем еден виртуелен сервер на Ubuntu 14.04 за да се опслужува јазол за агент на кукли.

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

Ресурси

Куклен код претежно се состои од ресурси. Ресурсот е парче код што ја опишува состојбата на системот и ги одредува промените што му се потребни. На пример:

корисник ("мичел":
обезбеди => присутни,
uid => "1000",
gid => "1000",
школка => "/bin/bash",
дома => "/home/michelle"
}

Декларацијата за ресурси го има следниов формат:

resource_type ("ресурс_име"
атрибут => вредност
...
}

За да ги видите сите типови на ресурси за кукли, внесете ја командата:

куклен ресурс --типови

Дознајте повеќе за видовите ресурси во ова упатство.

манифести

Манифестот е сценарио за оркестрација. Куклените програми со екстензија .pp се нарекуваат манифестации. Стандардниот манифест за кукли е /etc/puppet/manifests/site.pp.

Часови

Како и кај секој конвенционален програмски јазик, часовите се одговорни за организирање и повторна употреба на делови од оркестрацијата.

Дефиницијата на класата содржи блок од код кој опишува како работи класата. Откако ќе дефинирате класа, можете да ја користите во манифестации.

Дефиницијата на класата го има следниов формат:

класа пример_класа(
...
код
...
}

Овој код ја дефинира класата example_class. Кодот за кукли ќе биде во кадрави загради.

Декларација за класа е местото во кодот каде што се повикува одредена класа. Со декларирање класа, Puppet го обработува нејзиниот код.

Декларацијата на класата е нормална и според типот на ресурси.

Во кодот се додава редовна декларација за класа со помош на клучниот збор вклучува.

вклучи пример_класа

При декларирање по тип на ресурс, класата се декларира во формат на ресурси:

класа ("example_class": )

Таквата декларација ви овозможува да додадете параметри на класа во кодот што ги отфрлаат стандардните вредности на атрибутите на класата. На пример:

јазол „домаќин2“ (
класа ( "апачи": ) # користете модул за апачи
apache::vhost( "example.com": # го дефинира ресурсот на vhost
порта => "80",
docroot => "/var/www/html"
}
}

Модули

Модулот е група на манифестации и други датотеки организирани на предодреден начин што го олеснува споделувањето и повторното користење на поединечни делови од оркестрацијата. Модулите помагаат да се организира вашиот куклен код бидејќи тие можат да се користат за одвојување на кодот во повеќе манифестации.

Куклените модули се зачувани во директориумот /etc/puppet/modules.

Манифестно пишување

Можете да вежбате пишување кукли манифестации, модули и класи користејќи го примерот за инсталирање на стек LAMP на Ubuntu сервер (резултатот ќе биде ).

Значи, за да оркестрирате сервер Ubuntu 14.04 и да го инсталирате стекот LAMP на него, потребни ви се ресурсите за да го направите следново:

  • инсталирање на пакетот apache2.
  • стартувајте ја услугата apache2.
  • инсталација на пакет MySQL сервери, mysql-сервер.
  • стартувајте ја услугата mysql.
  • Инсталација на php5 пакет
  • креирање на PHP тест скрипта, info.php.
  • ажурирање на индексот apt пред да го инсталирате секој пакет.

Подолу ќе најдете три примери на куклен код што може да се користи за да се постигне такво поставување на стек LAMP.

Првиот пример ќе ве научи како да напишете основни манифестации во една датотека. Вториот пример ќе ви помогне да изградите и користите класа и модул врз основа на претходно напишани манифестации. Во третиот пример, ќе научите како да користите претходно изградени јавни модули за да инсталирате стек LAMP.

Забелешка: За тестирање, подобро е да користите свеж виртуелен сервер.

Пример 1: Инсталирање LAMP со еден манифест

Манифестот на кукли може да се напише на јазол на агент и потоа да се изврши со командата puppet apply (нема потреба да се инсталира господар и агент за ова).

Во овој дел, ќе научите како да пишувате манифестации кои ќе ги користат овие типови декларации за ресурси:

  • exec: извршува команди.
  • пакет: инсталирајте пакети.
  • услуга: управување со услуги.
  • датотека: управување со датотеки.

Создадете манифест

Создадете нов манифест:

sudo vi /etc/puppet/manifests/lamp.pp

Додадете го следниов код во него за да ги пријавите потребните ресурси.

# извршете команда „apt-get update“
exec("apt-update": # resource exec "apt-update"
команда => "/usr/bin/apt-get ажурирање" # команда овој ресурс ќе работи
}
# инсталирај пакет apache2
пакет ("apache2":
бара => Exec ["apt-update"], # request "apt-update" пред да инсталираш пакет
осигурајте се => инсталирано,
}
# стартувајте ја услугата apache2
услуга ("apache2":
обезбеди => трчање,
}
# инсталирај mysql-сервер
пакет ("mysql-сервер":
бара => Exec ["apt-update"], # request "apt-update" пред да се инсталира
осигурајте се => инсталирано,
}
# стартувајте ја услугата mysql
услуга ("mysql":
обезбеди => трчање,
}
# инсталирај php5 пакет
пакет ("php5":
бара => Exec ["apt-update"], # request "apt-update" пред да се инсталира
осигурајте се => инсталирано,
}
# стартувајте ја услугата info.php
датотека ("/var/www/html/info.php":
обезбеди => датотека
содржина => "", # phpinfo код
бара => Пакет["apache2"], # барање пакет "apache2"
}

Манифест Апликација

За да го користите новиот манифест, внесете ја командата:

судо кукла применува --тест

Ќе даде обемен резултат кој ги прикажува сите промени во состојбата на околината. Ако нема грешки во излезот, треба да можете да ја отворите вашата надворешна IP адреса или име на домен во прелистувач. На екранот ќе се појави PHP тест страница со информации за стек. Ова значи дека Apache и PHP работат.

Стакот LAMP сега е инсталиран на серверот со помош на Puppet.

Ова е прилично едноставен манифест бидејќи може да се изврши на агентот. Ако немате Puppet master, другите јазли на агенти нема да можат да го користат овој манифест.

Главниот сервер Puppet проверува дали состојбата на серверот се менува на секои 30 минути.

Пример 2: Инсталирање на стек LAMP со помош на модул

Сега обидете се да креирате едноставен модул заснован на манифестот LAMP што го напишавте во претходниот дел.

За да креирате модул, креирајте нов директориум во директориумот модули (неговото име мора да одговара на името на модулот). Овој директориум треба да го содржи директориумот на manifests и датотеката init.pp. Датотеката init.pp ја одредува класата Puppet (неговото име мора да одговара и на името на модулот).

Креирање на модул

Одете до мастер серверот Puppet и креирајте структура на директориуми за модулот:

cd /etc/puppet/modules
судо мкдир -п светилка/манифести

Креирајте и отворете ја датотеката init.pp во уредникот:

sudo vi lamp/manifests/init.pp

Вметнете ја класата на светилката во датотеката:

класа светилка (
}

Копирајте ја содржината на манифестот од делот 1 и залепете ја во блокот од класата на светилката. Сега имате дефиниција за класата на светилки. Другите манифестации ќе можат да ја користат оваа класа како модул.

Зачувајте ја и затворете ја датотеката.

Користење на модул во главниот манифест

Сега можете да го поставите главниот манифест и да го користите модулот за ламба за да го инсталирате стекот LAMP на серверот.

На главниот сервер за кукли, уредете ја следнава датотека:

sudo vi /etc/puppet/manifests/site.pp

Најверојатно на овој моментдатотеката е празна. Додадете ги следните редови на него:

јазол стандардно ()
јазол „светилка-1“ (
}

Забелешка: Заменете го lamp-1 со името на домаќинот на вашиот Puppet агент каде што сакате да го инсталирате стекот.

Блокот на јазли ви овозможува да наведете куклен код кој ќе важи само за одредени јазли.

Стандардниот блок се однесува на сите јазли на агенти кои немаат поединечен блок (оставете го празен). Блокот на светилката-1 ќе се примени на јазолот за агент ламба-1.

Додадете ја следнава линија во овој блок, кој го користи модулот за ламба:

Зачувајте ја и затворете ја датотеката.

Сега јазолот Puppet агент ќе може да ги преземе поставките од главниот сервер и да го инсталира стекот LAMP. Ако сакате да направите промени во моментов, извршете ја следнава команда на агентот:

судо куклен агент --тест

Модулите се најзгодниот начин за повторна употреба на куклен код. Дополнително, модулите ви помагаат логично да го организирате вашиот код.

Пример 3: Инсталирање LAMP користејќи јавни модули

Модулот MySQL се користи на сличен начин. Додадете ги следните линии во блокот на јазли:

класа ("mysql::сервер":
root_password => "лозинка",
}

Може да поминете и опции за модулот MySQL.

Додадете ресурс што ќе го копира info.php на точната локација. Користете го параметарот извор. Додадете ги следните линии во блокот на јазли:

датотека ("info.php": # име на датотека на ресурс
патека => "/var/www/html/info.php", # целна патека
обезбеди => датотека
бара => Класа ["apache"], # класата apache што треба да се користи
извор => "puppet:///modules/apache/info.php", # каде да ја копирате датотеката
}

Оваа декларација за класа го користи параметарот извор наместо содржина. Оваа опција не само што ја користи содржината на датотеката, туку и ја копира.

Puppet ќе ја копира датотеката puppet:///modules/apache/info.php на /etc/puppet/modules/apache/files/info.php.

Зачувајте ја и затворете ја датотеката.

Направете датотека info.php.

судо ш -ц „ехо“"> /etc/puppet/modules/apache/files/info.php"

Сега јазолот Puppet агент ќе може да ги преземе поставките од главниот сервер и да го инсталира стекот LAMP. Ако сакате да направите промени во опкружувањето на агентот во моментов, извршете ја следнава команда на овој јазол:

судо куклен агент --тест

Оваа команда ќе ги преземе сите ажурирања за тековниот јазол и ќе го инсталира стекот на него. За да бидете сигурни дека Apache и PHP работат, отворете ја IP адресата или доменот на јазолот во прелистувачот:

http://lamp_1_public_IP/info.php

Заклучок

Сега имате основно разбирање за куклените модули и манифестации. Обидете се сами да креирате едноставен манифест и модул.

Куклата е одлична за управување со датотеките за конфигурација на апликациите.

Тагови: ,
Некои стихови.Се чини дека целиот циклус треба да започне со овој напис, но сепак целната публика се поискусните корисници на производите со отворен код на Puppet Labs, кои не се задоволни со поединечни слабо интегрирани модули со Puppet Forge. Како и во секој случај на „библиотека наспроти рамка“, исплатата е да се следи светогледот на авторот на интегрираното решение.

Малку за тоа како функционира Puppet

Куклата е првенствено специфичен јазик за декларативно одредување на конечната состојба на системот. За споредба, GNU Makefile е исклучително погодна, каде што, покрај директниот опис на зависностите, можно е да се мами максимално.

Апстракцијата на кукли е приближно како што следува ( кршење на шема - заборавете на се што сте знаеле за термините во програмирањето!).

  • Јазоле збирка на конфигурации за одреден целен систем. Всушност, ова е посебен случај на класа.
  • класае збир на декларативна логика што е вклучена во конфигурацијата на домаќинот или други класи. Класата нема инстанци или методи, но има параметри и променливи дефинирани во логиката. Всушност, тоа е попрво процедура која може да наследи друга процедура со тривијално создавање код и не баш банален опсег на променливи.
  • тип- но ова веќе изгледа повеќе како класична класа - претпоставува примери со име и дефинитивно дадени параметри, но ништо повеќе. Специфична имплементација на типот може да се напише како куклена скрипта преку define , која создава примери од други типови, или како руби екстензија со фантазија.
  • ресурс- всушност, ова се именувани примери на Типови. Името на секој ресурс е единствено во одреден тип во конфигурација на јазол (директориум).
  • Променливи- Па, накратко, ова се константи... Пред Кукла 4, нивниот опсег беше сè уште полош. Сега е адекватно: за употреба надвор од местото на дефиниција, потребен е целосно квалификуван идентификатор, освен во случај на наследување на класи.
Куклата може да се користи за локално распоредување без мрежа или поврзана инфраструктура. Ова може да се користи за создавање слики од контејнери. Постои дури и цел тренд на поборници за отфрлање на централизиран сервер.

На идеолошки коректен начин, Куклената инфраструктура се состои од агент - привилегирана услуга на целниот систем и сервер кој издава вредни инструкции во форма на директориуми со декларативни ресурси на барање од агенти. Безбедноста се спроведува на ниво на инфраструктура на приватен јавен клуч (X.509). Едноставно кажано, истите механизми како во HTTPS, но со сопствен CA и задолжителна верификација клиент сертификат.

Во поедноставена форма, постапката за распоредување изгледа вака:

  1. Обработка преку TLS и X.509 (воспоставување врска, ажурирање CRL, проверка на ограничувањата на сертификатот итн.)
  2. Агентот добива генератори на факти од серверот со кеширање и сите случаи (поточно, сè е извлечено од папките lib/ во модулите). Лесно е да додадете своја руби скрипта за да собирате информации од интерес.
  3. Агентот собира факти за целниот систем и го испраќа до серверот. Сите факти може лесно да се прегледаат рачно со повикување на марионетски факти. Овие факти се достапни како глобални променливи.
  4. Серверот ги каталогизира ресурсите и ги испраќа до агентот. Под ова се крие цел слој на различни концепти.
  5. Агентот извлекува сè што му треба од серверот и го носи системот во наведената форма. Во исто време, самиот агент не знае како да се справи со ресурсите, тој се потпира на имплементација на провајдери "и (семантичкиот превод ќе биде "емитер", а не давател) на специфични видови ресурси. Дел од провајдерите" се стандардни и се вклучени во куклените пакети, а останатите се извлечени од модулите.
За да ги вкусите сите задоволства, има дополнителни лепчиња во форма на:
  • Модул- Збирка на декларативни скрипти за кукли, руби екстензии за кукли, датотеки, шаблони на датотеки, податоци на Hiera и многу повеќе. Поточен термин би бил „пакет“.
  • Животна средина- збирка скрипти, модули и податоци на Hiera. Со компликацијата на инфраструктурата, неизбежно беше неопходно да се оддели конфигурацијата подалеку од стандардната поделба на јазли. Во основа, ова е потребно за пилот-иновации и банална контрола на пристап (кога не сите администратори имаат пристап до сите јазли на ИТ инфраструктурата).
  • Хиера- хиерархиска база на податоци. Оваа формулација може да биде многу застрашувачка. Веројатно затоа е сменет во документацијата на подоцнежните верзии. Всушност, ова е исклучително едноставен и удобен механизам за повлекување конфигурација од YAML или JSON датотеки. Хиерархијата се состои во можноста да се постави редоследот по кој се читаат повеќе конфигурациски датотеки - т.е. хиерархија/приоритет на овие датотеки.
    • Покрај повлекувањето податоци за повикот на функцијата, Puppet стандардно ги повлекува параметрите на класата, што е главниот белег.
    • Се разбира, Hiera поддржува интерполација на факти, па дури и повикување специјални функции.
    • Во Puppet 4.3, истата функционалност беше повторно имплементирана за да се поддржи не само глобалната база на податоци, туку и локалната за животната средина и модулот, иако авторот веќе нашол неколку проблеми во нивната имплементација (PUP-5983, PUP-5952 и PUP- 5899), кои беа веднаш поправени од Puppet Labs.
    • Поддржани се неколку стратегии за повлекување вредност од сите датотеки во хиерархија:
      • прво - се враќа првата вредност пронајдена по приоритет
      • уникатен - ги собира сите вредности во еднодимензионална низа и ги отстранува дупликатите
      • хаш - ги спојува сите пронајдени YAML Хаш. Двојните копчиња се избираат по приоритет.
      • длабоко - во суштина рекурзивна верзија на хаш
    • Убавината е што стратегијата за преземање може да се постави како кога се повикува функцијата lookup(), затоа што и во која било датотека со хиерархија преку специјалниот клуч lookup_options, кој активно се користи во модулот cfnetwork.
  • PuppetDB- всушност, слој на деловна логика околу релациска база на податоци (PostgreSQL), која ви овозможува да зачувате извештаи за факти и распоредувања и да извезувате ресурси за последователен увоз во директориуми на други јазли или селекции преку специјални функции. Има и веб-лице во форма на куклена табла.
  • X.509 PKI- веќе споменатата инфраструктура за сертификати, која е исклучително погодна за користење за други услуги без потреба од управување со посебна инфраструктура.
  • МЦКолектив- се чини дека е корисна работа за започнување задачи врз основа на настани на фарма на сервери, но авторот има одреден недостаток на доверба во безбедноста на одредено решение.
  • Кукла кованица- отворена платформа за објавување и преземање модули.
  • некои други карактеристики во форма на контрола надворешни уредитип на опрема на Cisco и распоредување на гол метал, но тоа е друга приказна

Белешки за безбедност и пристапност

Потребно е да се разбере дека Puppet Server станува ранлива точка на целата ИТ инфраструктура, бидејќи ја дефинира конечната конфигурација на сите системи. Во посебни случаи, има смисла да се направи сепарација - посебен сервер за критични инфраструктурни елементи со екстремно ограничен пристапи рачно ажурирање и второ за се останато.

Достапноста на Puppet Server ја одредува способноста за управување со целата инфраструктура. Има смисла да се хостира Puppet Server на виртуелна машина во посигурен и побргу повратен облак од трети страни отколку неговите сопствени можности. Или треба да инсталирате повеќе сервери.

Во секој случај, не треба да инсталирате други услуги на системот каде што ќе биде распореден Puppet Server со ѕвона и свирки. Виртуелизација и контејнеризација ќе ви помогнат.

Мулти-мајстор (неколку самостојни куклени сервери)

  • Во овој случај, само еден сервер делува како CA (Certificate Authority) - неговата недостапност значи дека е невозможно да се додадат нови јазли.
    • Puppet ви овозможува да користите инфраструктура X.509 од трета страна доколку вградената не ви одговара.
  • Целата конфигурација (Environment) мора да се чува во контрола на верзијата и да се распореди на секој сервер во исто време.
  • Единственото нешто што е заедничко е базата PostgreSQL, чија организација е многу достапна е надвор од опсегот на овој напис.
  • Модулот cfpuppetserver поддржува и примарни (со CA) и секундарни серверски инсталации.

Што значајно се промени од постарите верзии

Целосниот опис е достапен од производителот.
  • Сите услуги се преместени во JVM, JRuby и Jetty. Зад очигледните предности на интеграцијата, постојат и недостатоци во однос на потрошувачката на меморија.
  • Додадени ламбда функции за обработка на колекции - сега нема потреба да се сечат патерици на Ruby или да се изопачуваат преку create_resources()
  • Се појави алатка за обработка на шаблони на EPP - во суштина истата ERB, но со Puppet DSL наместо Ruby,
  • Структурата на директориумите на стандардните конфигурациски датотеки е многу променета
  • Додадена е поддршка за даватели на податоци за средини и модули (не се потребни повеќе хакери).
  • Омаловажување на улогата на глобалната Хиера. Нова поврзана команда е пребарување на кукли.

Инсталација

Овој процес е прилично примитивен, но бара одредена низа чекори. Бидејќи тоа рачно го правите е неблагодарна задача, авторот ќе ве научи на лошата работа, имено, преземање неразбирливи скрипти од Интернет и работи како root на вашиот систем.

Трите главни компоненти на серверот се самиот Puppet Server, PuppetDB и PostgreSQL. Сите од нив може да се натрупаат во еден јазол или да се поделат на два или три системи. Puppet Server и Puppet DB може да работат повеќе пати, но PostgeSQL е единствен јазол за неуспех. Постојат различни пристапи за репликација и кластерирање PostgeSQL. Удобен пристап во случај на примарни и секундарни сервери би бил Master + Read-Only Slave, кој е поддржан во самиот PuppetDB како примарен и само за читање јазол на базата на податоци, но автоматизирајќи таков поставувањето бара време и затоа сè уште не е вклучено во модулот cfpuppetserver.

Можете едноставно да ја зачувате конфигурацијата директно барем на датотечен системзаедно со Puppet Server, но тоа е како да пишувате скрипти на веб-сервер за производство. Најсоодветно решение е git складиштето. Услужната алатка r10k може да ги повлече сите гранки на складиштето и да ги распореди на Puppet Server како посебни околини. r10k е прилично лош во влечење на зависности, така што библиотекар-кукла се користи на врвот. Вреди да се напомене веднаш дека главната канонска куклена средина е „производството“. Затоа, гранката наречена „продукција“ треба да се користи во складиштето за конфигурација, а не „господар“.

Системски барања

За железо, тоа е опишано од производителот. Модулот cfpuppetserver моментално поддржува само Debian Jessie+ и Ubuntu Trusty+.

Конфигурација во Git

За самиот r10k, локацијата на складиштето не е многу важна - главната работа е неговата достапност. На пример, за цели на тестирање, складиштето може да се хостира на истиот систем, до кој се пристапува преку file://. Добар почеток би бил примерот за конфигурација на кодирање иднина/кукла-пример.
  1. Клонирајте го складиштето: git клон https://github.com/codingfuture/puppet-exampleenv my-puppet-conf && cd my-puppet-conf
  2. Поставете ги општите поставки за пристап на администраторот користејќи ги советите во коментарите:
    • $EDITOR податоци/common.yaml
  3. Ајде да ја создадеме конфигурацијата на јазолот:
    • $MY_DOMAIN - име на root домен (на пример, example.org)
    • $HOST_NAME - име на хост на клиентот без домен
    • mkdir податоци/$MY_DOMAIN
    • cp data/example.com/puppet.yaml data/$(MY_DOMAIN)/puppet.yaml
    • $EDITOR nano -w data/$(MY_DOMAIN)/puppet.yaml - поставување јазол со Puppet Server како што е предложено во коментарите
    • cp data/example.com/host.yaml data/$(MY_DOMAIN)/$(HOST_NAME).yaml
    • $EDITOR нано -w податоци/$(MY_DOMAIN)/$(HOST_NAME).yaml - поставување произволен јазол според советите во коментарите
  4. Ние притискаме до нашиот сопствен Git сервер или го правиме достапен локално на јазолот Puppet Server преку rsync или scp. Локалното складиште е корисно како среден чекор додека серверот Git не се распореди од самиот Puppet. На некој начин, ова е како градење компајлер во повеќе чекори.

Ние инсталираме од нула на чист систем

Модулот cfpuppetserver ви овозможува да инсталирате сè користејќи го самиот Puppet, но за почетната инсталација, основните операции се дуплираат со скриптата Bash.

На целниот систем:

  1. Преземете ја скриптата за поставување: wget https://raw.githubusercontent.com/codingfuture/puppet-cfpuppetserver/master/setup_puppetserver.sh
  2. Гледаме низ сценариото и се намуртуваме: помалку setup_puppetserver.sh
  3. Стартувај: bash setup_puppetserver.sh кукла.$(MY_DOMAIN) .
    • Пример за далечинско складиште: bash setup_puppetserver.sh ssh:// [заштитена е-пошта]/кукла-конф
    • Пример со локално: bash setup_puppetserver.sh file:///root/puppetconf/
  4. Гледаме како системот се издува и не инсталира сè многу брзо.
  5. Ако оддалеченото складиште:
    • Создадете SSH клуч за root "a: ssh-keygen -t rsa -b 2048
    • Го регистрираме јавниот клуч /root/.ssh/id_rsa.pub на оддалечениот Git сервер...
    • ... и поставете Git hook таму со следнава команда: /usr/bin/ssh -T deploypuppet@puppet.$(MY_DOMAIN) ./puppetdeploy.sh
  6. Извршете го распоредувањето на конфигурацијата рачно: /etc/puppetlabs/deploy.sh
  7. Ајде да пробаме како работи на самиот сервер: /opt/puppetlabs/bin/puppet agent --test
  8. Проверете ги вашите мрежни поставки, мрежен филтери SSH пристап

Додавање управувани јазли

  1. Целосно квалификуваното име на Puppet Server мора да биде достапно преку DNS на управуваниот хост или харджичен во /etc/hosts.
    • Пример: ехо „128.1.1.1 puppet.example.com“ >> /etc/hosts
  2. На домаќинот на Puppet Server, извршете ја следнава скрипта /root/genclientinit.sh $(HOST_NAME).$(MY_DOMAIN) .
  3. Резултатот е копиран во целост и залепен во командна линијана целниот систем.
  4. Чекаме да заврши извршувањето и да извршиме /opt/puppetlabs/bin/puppet agent --test . Првиот пат кога ќе го извршите, ќе се генерира барање за потпишување сертификат.
  5. Одиме во јазолот Puppet Server за да го потпишеме сертификатот.
    • Куклена листа на сертификати - проверете го потписот на сертификатот за поголема параноја.
    • знак за куклен сертификат $(HOST_NAME).$(MY_DOMAIN) - всушност, ние го потпишуваме сертификатот.
  6. Се враќаме во управуваниот јазол и повторно стартуваме: /opt/puppetlabs/bin/puppet agent --test`. Ова ќе принуди да започне процедурата за распоредување.
  7. Чекаме да заврши распоредувањето преку Агентот за кукли.
  8. Тоа е тоа, имате подготвена минимална Куклена инфраструктура!

Излез на примерок од /root/genclientinit.sh

баш</etc/cflocation fi ако се тестира! -z ""; тогаш echo -n >/etc/cflocationpool fi ако тест ! -z "\$http_proxy"; потоа извезете http_proxy export https_proxy="\$http_proxy" извезете HTTP_PROXY="\$http_proxy" извезете HTTPS_PROXY="\$http_proxy" fi echo host.example.com > /etc/hostname име на домаќин host.example.com ако ! која lsb порака | читај; потоа apt-get инсталирај lsb-release fi кодно име=\$(lsb_release -cs) if test -z "\$codename"; потоа ехо „Не успеав да се открие точното кодно име“ излез 1 fi wget https://apt.puppetlabs.com/puppetlabs-release-pc1-\$(кодно име).deb dpkg -i puppetlabs-release-pc1-\$(кодно име) .deb mkdir -p /etc/puppetlabs/puppet cat > /etc/puppetlabs/puppet/puppet.conf<кукла знак host.example.com" ехо "Користете CTRL+C за да го прекинете циклусот, ако не успее поради различни причини" спиење 5 завршено EOT

Опис на модулот

Комплетна листа на опции за скрипта Bash за почетна инсталација

~# ./setup_puppetserver.sh Употреба: ./setup_puppetserver.sh [ [ [ [] ] ] ]
  • r10k_repo_url - URI на складиштето на Git
  • certname е целосно квалификувано име на домен на јазолот
  • cflocation - иницијализација на фактот cf_location
  • cflocationpool - иницијализација на фактот cf_location_pool
  • http_proxy - прокси-сервер за HTTP и HTTPS барања

Комплетна листа на параметри на Bash за скриптата за почеток на клиентот Puppet

~# /root/genclientinit.sh Употреба: ./genclientinit.sh [ [ []]]
Вредноста на параметарот е иста како претходната скрипта.

cfpuppetserver класа

  • deployuser = „deploypuppet“ - корисничко име за автоматско распоредување на ажурирањата на конфигурацијата
  • deployuser_auth_keys = undef - список на клучеви за $deployuser
  • repo_url = undef - URI на складиштето (пример: ssh://user@host/repo или file:///some/path)
  • puppetserver = точно - дали да се инсталира компонентата Puppet Server на овој јазол
  • puppetdb = точно - дали да се инсталира компонентата PuppetDB на овој јазол
  • puppetdb_port = 8081 - порта за PuppetDB
  • setup_postgresql = точно - дали да се инсталира компонентата PostgreSQL на овој јазол (само ако е овозможена инсталацијата на PuppetDB)
  • service_face = „било кој“ - името на cfnetwork::face ресурсот за прифаќање на дојдовните врски
  • puppetserver_mem = автоматско - RAM меморија за куклен сервер во мегабајти (минимум 192 MB)
  • puppetdb_mem = автоматско - RAM меморија за PuppetDB во мегабајти (минимум 192 MB)
  • postgresql_mem = автоматско - RAM меморија за PostgreSQL во мегабајти (минимум 128 MB)

класа cfpuppetserver::puppetdb

  • postgresql_host = "localhost" - адреса на базата на податоци
  • postgresql_listen = $postgresql_host - вредноста оди директно во директивата listen_addresses PostgreSQL
  • postgresql_port = 5432 - порта за база на податоци
  • postgresql_user = "puppetdb" - корисник на PuppetDB во базата на податоци
  • postgresql_pass = "puppetdb" - лозинка на корисникот PuppetDB во базата на податоци
  • postgresql_ssl = false - овозможете шифрирање на врската врз основа на Puppet PKI сертификати

класа cfpuppetserver::puppetserver

  • автознак = неточно - НЕ ТРЕБА да се користи во производствена средина, освен во DMZ. Постои само за тест автоматизација.
  • global_hiera_config = "cfpuppetserver/hiera.yaml" - патека до стандардната конфигурациска датотека Hiera според куклените канони (првата компонента е името на модулот, остатокот е патеката под датотеките/папката во модулот)

Можете да помогнете и да префрлите некои средства за развој на страницата



Управувањето со голем број Unix системи не е погодно. За промена на еден параметар, администраторот треба да пристапи до секоја машина, скриптите можат само делумно да помогнат, а не во сите ситуации.

Мора да се признае, администраторите на мрежата на Windows се уште се во подобра позиција. Доволно е да ги промените поставките за групната политика и по некое време сите компјутери на мрежата, вклучително и оние со неодамна инсталиран оперативен систем, ќе „научат“ за иновацијата, доколку, се разбира, ги засегаат. Гледајќи наназад низ долгата историја на Unix, ништо вакво никогаш не се фатило. Постојат решенија како kickstart кои помагаат при првичната инсталација. операционен систем, но дополнителното дотерување ќе бара значителен напор. Комерцијалните решенија како BladeLogic и OpsWare само делумно го решаваат проблемот со автоматизирање на поставките, нивната главна предност е присуството GUI, а само големите организации можат да си дозволат да ги купат. Се разбира, има проекти кои нудат бесплатни решенија, но за цело време на нивното постоење не можеа да создадат голема заедница. На пример, Cfengine не е многу популарен кај администраторите, иако може да се користи во *BSD, Windows и Mac OS X покрај Linux. Можеби ова се должи на релативната сложеност во креирањето на конфигурации. Кога се опишуваат задачите, неопходно е да се земат предвид карактеристиките на секој специфичен систем и рачно да се контролира редоследот на дејства при извршување на командите. Односно, администраторот мора да запомни дека за некои системи треба да напишете adduser за други useradd, да ја земете предвид локацијата на датотеките на различни системи итн. Ова го отежнува процесот на пишување наредби по ред на големина, многу е тешко да се создаде правилна конфигурација во движење и речиси е невозможно да се прочитаат креираните конфигурации по некое време. И покрај лиценцата за GPL, Cfengine е всушност проект на еден човек кој ги контролира сите промени и не е многу заинтересиран за градење отворено општество. Како резултат на тоа, можностите на cfengine се доста задоволувачки за развивачот, а за другите администратори, ова е повеќе дополнителна главоболка. За да се подобри cfengine, различни додатоци беа креирани од трети лица програмери, што често само ја влошуваше ситуацијата. Авторот на неколку такви модули за cfengine, Лук Каниес, на крајот одлучи да развие слична алатка, но без многу недостатоци на cfengine.

Карактеристики на кукли

Puppet, како cfengine, е систем клиент-сервер кој користи декларативен, односно задолжителен јазик за опишување задачи и библиотеки за нивна имплементација. Клиентите периодично (30 минути стандардно) се поврзуваат со централниот сервер и ја добиваат најновата конфигурација. Доколку примените поставки не се совпаѓаат со состојбата на системот, тие ќе бидат извршени; доколку е потребно, до серверот се испраќа извештај за извршените операции. Серверот за пораки може да зачува во syslog или датотека, да креира RRD график, да го испрати на наведената е-пошта. Дополнителните слоеви на апстракција Transactional и Resource обезбедуваат максимална компатибилност со постоечките поставки и апликации, овозможувајќи ви да се фокусирате на системските објекти без да се грижите за разликите во имплементацијата и описот на деталните команди и формати на датотеки. Администраторот работи само со типот на објект, а за останатото се грижи Puppet. Бидејќи типот на пакети знае околу 17 системи на пакети, потребниот автоматски ќе се препознае врз основа на информациите за верзијата на комплетот или системот за дистрибуција, иако доколку е потребно, менаџерот на пакети може да биде принуден.

За разлика од скриптите, кои често не се употребливи на други системи, конфигурациите за кукли напишани од администратори од трети страни, во најголем дел, ќе работат беспрекорно на која било друга мрежа. Во куклен готвач[ http://www.reductivelabs.com/trac/puppet/tags/puppet%2Crecipe] веќе има триесетина готови рецепти. Puppet во моментов официјално ги поддржува следните оперативни системи и услуги: Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo и MySQL, LDAP.

Куклен јазик

За да продолжите понатаму, прво треба да ги разберете основните елементи и карактеристики на јазикот. Јазикот е еден од јаки страниКукла. Со негова помош се опишани ресурсите со кои администраторот планира да управува и активностите. За разлика од повеќето слични решенија, во Puppet јазикот го олеснува пристапот до сите слични ресурси на кој било систем во хетерогена средина. Описот на ресурсот обично се состои од име, тип и атрибути. На пример, посочете ја датотеката /etc/passwd и поставете ги нејзините атрибути:

датотека ("/etc/passwd":

сопственик => корен,

група => корен,

Сега клиентите што се поврзуваат со серверот ќе ја копираат датотеката /etc/passwd и ќе ги постават наведените атрибути. Во едно правило, можете да дефинирате неколку ресурси одеднаш, раздвојувајќи ги со точка-запирка. Но, што ако конфигурациската датотека што се користи на серверот се разликува од клиентските или воопшто не се користи? На пример, оваа ситуација може да се појави при поставување VPN конекции. Во овој случај, можете да укажете на датотеката со изворната директива. Овде има две опции, како и обично за да се одреди патеката до друга датотека, исто така се поддржани два протоколи URI: датотека и кукла. Во првиот случај, се користи врска до надворешен NFS сервер, во вториот случај, услуга слична на NFS се активира на серверот Puppet, кој извезува ресурси. Во вториот случај, стандардно, патеката е во однос на root директориумот на кукли - /etc/puppet. Односно, врската puppet://server.domain.com/config/sshd_config ќе одговара на датотеката /etc/puppet/config/sshd_config. Можете да го отфрлите овој директориум користејќи ја директивата за кофа за датотеки, иако е поправилно да се користи истоимениот дел во датотеката /etc/puppet/fileserver.conf. Во овој случај, можете да го ограничите пристапот до услугата само од одредени адреси. На пример, да го опишеме делот за конфигурација.

патека /var/puppet/config

дозволи *.domain.com

дозволи 192.168.0.*

дозволи 192.168.1.0/24

одбие *.wireless.domain.com

И тогаш се повикуваме на овој дел кога го опишуваме ресурсот.

извор => "puppet://server.domain.com/config/sshd_config"

На дебелото црево му претходи името на ресурсот. Во наједноставните случаи, името може едноставно да се наведе, подобро е да се користи алијас или променливи. Алијас се поставува со помош на директивата за алијас. целосна патека до датотеката. Во посложени конфигурации

датотека ("/etc/passwd":

алијас => passwd

Друга опција за создавање алијас е добро прилагодена кога треба да се справите со различни оперативни системи. На пример, ајде да создадеме ресурс што ја опишува датотеката sshd_config:

датотека (sshdconfig:

име => $оперативен систем ? (

solaris => "/usr/local/etc/ssh/sshd_config",

стандардно => "/etc/ssh/sshd_config"

Во овој пример, ние сме соочени со избор. Датотеката за Solaris е наведена посебно, за сите други ќе биде избрана датотеката /etc/ssh/sshd_config. Сега овој ресурс може да се пристапи како sshdconfig, во зависност од оперативниот систем, ќе се избере саканата патека. На пример, назначуваме дека ако sshd демонот работи и се прими нова датотека, услугата треба да се рестартира.

осигурај => точно,

претплатете се => Датотека

Променливите често се користат при работа со кориснички податоци. На пример, ја опишуваме локацијата на домашните директориуми на корисникот:

$homeroot = "/home"

Сега, до датотеките специфични за корисникот може да се пристапи како

$(homeroot)/$име

Параметарот $name ќе биде заменет со името на корисничката сметка. Во некои случаи, погодно е да се дефинира стандардна вредност за некој тип. На пример, за типот exec, често се специфицираат директориуми во кои треба да бара извршна датотека:

Exec (пат => "/usr/bin:/bin:/usr/sbin:/sbin" )

Во случај да треба да укажете на неколку вгнездени датотеки и директориуми, можете да го користите параметарот за повторување.

датотека ("/etc/apache2/conf.d":

извор => "puppet://puppet://server.domain.com/config/apache/conf.d",

рекурс => „вистинито“

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

"/etc/passwd": сопственик => корен, група => корен, режим => 644;

„/etc/shadow“: сопственик => корен, група => корен, режим => 440

Како и во објектно-ориентирани јазици, класите може да се редефинираат. На пример, во FreeBSD, групата што ги поседува овие датотеки е тркалото. Затоа, за да не го преработиме целосно ресурсот, ајде да создадеме нова класа на freebsd што ќе ја наследи класата на Linux:

класата freebsd го наследува Linux (

Датотека["/etc/passwd"] (група => тркало);

Датотека["/etc/shadow"] (група => тркало)

За погодност, сите класи може да се стават во посебна датотека, која може да се поврзе со директивата за вклучување. Дефинициите може да земат повеќе параметри како аргументи, но не поддржуваат наследување и се користат кога треба да опишете објекти за повеќекратна употреба. На пример, да го дефинираме домашниот директориум на корисникот и командите потребни за создавање нова сметка.

дефинирај user_homedir ($group, $fullname, $ingroups) (

корисник („$name“:

обезбеди => присутни,

коментар => „$fullname“,

gid => "$група",

групи => $ingroups,

членство => минимум,

школка => "/bin/bash",

дома => "/home/$name",

бара => Група[$група],

exec("$name homedir":

команда => "/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name",

создава => "/home/$name",

бара => Корисник[$name],

Сега да се создаде нов сметкасамо упатете се на user_homedir.

user_homedir("сергеј":

група => "сергеј",

полно име => „Сергеј Јаремчук“,

inggroups => [„медиуми“, „администратор]

Одделно, постојат описи на јазли (јазол) кои поддржуваат наследување како класи. Кога клиентот ќе се поврзе со куклен сервер, тој ќе го бара соодветниот дел за јазол и ќе ги врати поставките кои се специфични само за тој компјутер. Можете да го користите стандардниот јазол за да ги опишете сите други системи. Опис на сите видови е даден во документот „Референца на типот“, кој мора да го прочитате во секој случај, барем за да ги разберете сите карактеристики на куклен јазик. Различни видовиви дозволува да извршувате одредени команди, вклучително и кога се исполнети одредени услови (на пример, менување на конфигурациската датотека), работа со cron, кориснички ингеренции и групи, компјутери, монтирање ресурси, стартување и стопирање услуги, инсталирање, ажурирање и отстранување пакети, работа со SSH клучеви, Соларис зони и така натаму. Ова е колку е лесно да се принуди списокот на пакети во дистрибуции со помош на apt да се ажурира секојдневно помеѓу 2 и 4 часот.

распоред (дневно:

период => дневно,

опсег =>

exec("/usr/bin/apt-get ажурирање":

распоред => дневно

Ажурирањето за тој период ќе го врши само еднаш секој систем, по што задачата се смета за завршена и ќе биде избришана од клиентскиот компјутер. Јазикот Puppet поддржува други познати структури: услови, функции, низи, коментари и слично.

Инсталација на кукли

Кукла бара Ruby (>= 1.8.1) со OpenSSL поддршка и XMLRPC библиотеки, како и библиотека Faster [ http://reductivelabs.com/projects/facter]. Складиштето на Ubuntu 7.04 што се користеше во тест-инсталацијата веќе го вклучува пакетот за кученце.

$ sudo apt-cache кукла за пребарување

кукла - централизирано управување со конфигурации за мрежи

puppetmaster - централизиран контролен демон за управување со конфигурација

Инсталацијата ќе ги инсталира сите потребни зависности на пакетите: facter libopenssl-ruby libxmlrpc-ruby.

$ sudo apt-get инсталирај куклен мајстор

Можете да ја проверите достапноста на библиотеките на Ruby со командата.

$ ruby ​​​​-ropenssl -e "става: да"

~$ ruby ​​‎-rxmlrpc/client -e „puts:yep“

Ако не се добиени грешки, тогаш сè што ви треба е веќе вклучено. Датотеките кои ја опишуваат саканата конфигурација на системите во куклената терминологија се нарекуваат манифести (манифести). Кога е стартуван, демонот се обидува да ја прочита датотеката /etc/puppet/manifests/site.pp, ако ја нема, издава предупредувачка порака. Кога тестирате, можете да му кажете на демонот да работи во офлајн режим, во кој манифестот не е потребен

$ sudo /usr/bin/puppetmasterd --nodes

Доколку е потребно, site.pp може да вклучи и други датотеки, на пример, со описи на класи. За тестирање, можете да ја додадете наједноставната инструкција во оваа датотека.

датотека ("/etc/sudoers":

сопственик => корен,

група => корен,

Сите конфигурациски датотеки и за серверот и за клиентите се наоѓаат во /etc/puppet. Датотеката fileserver.conf за која зборувавме погоре е опционална и се користи само кога Puppet ќе работи и како сервер за датотеки. На Ubuntu, оваа датотека го извезува поддиректориумот /etc/puppet/files. Поддиректориумот ssl содржи сертификати и клучеви кои ќе се користат за шифрирање на врските со клиентите. Копчињата се генерираат автоматски кога првпат ќе го стартувате puppetmasterd, можете рачно да ги креирате со командата.

$ sudo /usr/bin/puppetmasterd --mcusers.

Датотеките puppetd.conf и puppetmasterd.conf се слични. Тие одредуваат некои параметри на демоните на клиентскиот систем и серверот. Датотеката на клиентот се разликува само во присуство на параметарот на серверот, кој укажува на компјутерот на кој работи puppetmasterd.

server=grinder.com

logdir = /var/log/кукла

vardir=/var/lib/кукла

rundir = /var/run

# испрати извештај до серверот

Наместо да пишувате сè рачно, можете да креирате шаблон користејќи го самиот puppetd.

$ puppetd --genconfig > /etc/puppet/puppetd.conf

Слично на тоа, можете да креирате site.pp на серверот.

$ puppetd --genmanifest > /etc/puppet/manifests/site.pp

Друга датотека tagmail.conf ви овозможува да одредите адреси на е-пошта до кои ќе се испраќаат извештаи. Во наједноставниот случај, може да се користи една линија.

сите: [заштитена е-пошта]

Конфигурациските датотеки не се доволни за клиентот да може да се поврзе со серверот. За да го направите ова, сè уште треба да потпишете сертификати. Прво, за да може серверот да дознае за новиот компјутер на клиентскиот систем, внесете ја командата:

$ sudo puppetd --server grinder.com --waitforcert 60 --test

инфо: Побарајте сертификат

предупредување: Peer сертификатот нема да биде потврден во оваа SSL сесија

известување: Не добил сертификат

Ако се врати друга низа, серверот треба да се провери.

$ ps aux | греп кукла

кукла 5779 0,0 1,4 27764 15404 ? Ssl 21:49 0:00 рубин / usr/sbin/puppetmasterd

Заштитниот ѕид мора да дозволи поврзување на портата 8140.

На серверот добиваме листа на сертификати што треба да се потпишат.

$ sudo puppetca --листа

nomad.grinder.com

И го потпишуваме сертификатот на клиентот.

$ sudo puppetca -- знак nomad.grinder.com

Сега клиентот може слободно да се поврзе со серверот и да прима поставки.

За жал, едноставно не е можно да се прикажат сите можности на Кукла во рамките на статијата. Но, како што можете да видите, ова е функционална и флексибилна алатка која ви овозможува да ги решите повеќето од задачите за истовремено администрирање на голем број системи. Ако треба да поставите неколку системи според природата на вашата работа. И што е најважно, проектот успеа да собере мала, но постојано растечка заедница. Затоа, да се надеваме дека добрата идеја нема да дозволи да умре или да оди настрана.

Куклае крос-платформска структура која овозможува системски администраториизвршувајте вообичаени задачи користејќи код. Кодот ви овозможува да извршувате различни задачи од инсталирање нови програми до проверка на дозволите за датотеки или ажурирање на кориснички сметки. Куклаодлично не само за време на почетната инсталација на системот, туку и во текот на целиот животен циклус на системот. Во повеќето случаи кукласе користи во конфигурација на клиент/сервер.

Овој дел ги прикажува инсталацијата и конфигурацијата Куклаво конфигурација на клиент/сервер. Овој едноставен пример покажува како да се инсталира Апачикористење Кукла.

Инсталација

За инсталација Кукланапишете терминал:

sudo apt-get install puppetmaster

На клиентската машина (или машините), внесете:

sudo apt-get install puppet

Поставување

Пред да поставите кукла можеби ќе сакате да додадете запис DNS CNAMEЗа puppet.example.com, Каде пример.comе вашиот домен. Стандардни клиенти Куклапроверете го DNS за puppet.example.com како име на куклен сервер ( Мајстор на кукли). Видете Услуга за име на домен за повеќе детали за користење на DNS.

Ако немате намера да користите DNS , можете да додавате записи во датотеката /etc/hosts на серверот и клиентот. На пример, во датотеката /etc/hosts Кукладодаде сервер:

127.0.0.1 localhost.localdomain localhost puppet 192.168.1.17 meercat02.example.com meercat02

На секој Куклана клиентот, додадете запис за серверот:

192.168.1.16 кукла meercat.example.com

Променете ги IP адресите и имиња на домениод примерот до вашите вистински адреси и имиња на серверот и клиентите.

Сега ајде да поставиме некои ресурси за апачи2. Направете датотека /etc/puppet/manifests/site.pp, што го содржи следново:

Пакет ( "apache2": осигурај => инсталиран ) услуга ( "apache2": осигурај => точно, овозможи => точно, бара => пакет["apache2"] )

Јазол „meercat02.example.com“ (вклучи apache2)

Заменете meercat02.example.comна вашето сегашно име Куклаклиент.

Последниот чекор за ова едноставно Кукласерверот треба да ја рестартира услугата:

sudo /etc/init.d/puppetmaster рестарт

Од сега Кукласерверот е целосно поставен и време е да го поставите клиентот.

Ајде прво да ја поставиме услугата Куклаагент да се кандидира. Уредете /etc/default/puppet и сменете ја вредноста СТАРТна да:

sudo /etc/init.d/puppet start

Назад на Кукласерверот за потпишување на сертификатот на клиентот користејќи ја командата:

Судо кукла -- знак meercat02.example.com

Проверете /var/log/syslogза какви било грешки во конфигурацијата. Ако сè беше добро, пакетот апачи2и неговите зависности ќе бидат инсталирани на Куклаклиент.

Овој пример е многу едноставен и не покажува многу карактеристики и придобивки. Кукла. За дополнителни информациивиди

Сергеј Јаремчук

Централизирана конфигурација на UNIX системи со Puppet

Управувањето со голем број UNIX системи не е погодно. За промена на еден параметар, администраторот треба да пристапи до секоја машина, скриптите можат само делумно да помогнат, а не во сите ситуации.

Мора да се признае, мрежните администратори на Windows сепак се во подобра позиција. Доволно е да ги промените поставките за групната политика и по некое време сите компјутери на мрежата, вклучително и оние со неодамна инсталиран оперативен систем, ќе „научат“ за иновацијата, ако, се разбира, ги засегаат. Гледајќи наназад низ долгата историја на UNIX, вакво нешто никогаш не се фатило. Постојат решенија како киксстарт кои помагаат при првичната инсталација на оперативниот систем, но дополнителното дотерување ќе бара значителен напор. Комерцијалните решенија, како BladeLogic и OpsWare, само делумно го решаваат проблемот со автоматизирање на поставките, нивната главна предност е присуството на графички интерфејс, а само големите организации можат да си дозволат да ги купат. Се разбира, има проекти кои нудат бесплатни решенија, но за цело време на нивното постоење не можеа да создадат голема заедница. На пример, Cfengine не е многу популарен кај администраторите, иако, покрај Linux, може да се користи и во *BSD, Windows и Mac OS X. Можеби ова се должи на релативната сложеност во креирањето на конфигурации. Кога се опишуваат задачите, треба да се земат предвид карактеристиките на секој специфичен систем и рачно да се контролира редоследот на дејства при извршување на командите. Тоа е, администраторот мора да запомни дека за некои системи треба да напишете adduser за други - useradd, да ја земете предвид локацијата на датотеките на различни системи итн. Ова го отежнува процесот на пишување наредби по ред на големина, многу е тешко да се создаде правилна конфигурација во движење и речиси е невозможно да се прочитаат креираните конфигурации по некое време. И покрај лиценцата за GPL, Cfengine е всушност проект на една личност која ги контролира сите промени и не е многу заинтересирана за градење отворено општество. Како резултат на тоа, можностите на Cfengine целосно го задоволуваат развивачот, а за другите администратори ова е повеќе дополнителна главоболка. За да се подобри Cfengine, беа креирани разни додатоци од трети лица програмери, што често само ја влошуваше ситуацијата. Авторот на неколку такви модули за Cfengine, Лук Каниес, конечно одлучи да развие слична алатка, но лишена од многу недостатоци на Cfengine.

Карактеристики на кукли

Puppet, како Cfengine, е систем клиент-сервер кој користи декларативен, односно задолжителен јазик за опишување задачи и библиотеки за нивно спроведување. Клиентите периодично (стандардно на секои 30 минути) се поврзуваат со централниот сервер и ја добиваат најновата конфигурација. Доколку примените поставки не се совпаѓаат со состојбата на системот, тие ќе бидат извршени; доколку е потребно, до серверот се испраќа извештај за извршените операции. Серверот за пораки може да зачува во системски дневник или датотека, да креира RRD график, да го испрати на наведената е-пошта. Дополнителните слоеви на апстракција Transactional и Resource обезбедуваат максимална компатибилност со постоечките поставки и апликации, овозможувајќи ви да се фокусирате на системските објекти без да се грижите за разликите во имплементацијата и описот на деталните команди и формати на датотеки. Администраторот работи само со типот на објект, а за останатото се грижи Puppet. Значи, типот на пакети знае околу 17 системи на пакети, потребниот автоматски ќе се препознае врз основа на информации за верзијата на комплетот или системот за дистрибуција, иако доколку е потребно, менаџерот на пакети може да биде принуден.

За разлика од скриптите, кои често не можат да се користат на други системи, конфигурациите за кукли напишани од администратори од трети страни ќе работат на која било друга мрежа во најголем дел без проблеми. Куклената готвачка веќе има триесетина готови рецепти. Puppet во моментов официјално ги поддржува следните оперативни системи и услуги: Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo и MySQL, LDAP.

Куклен јазик

За да продолжите понатаму, прво треба да ги разберете основните елементи и карактеристики на јазикот. Јазикот е една од силните страни на Puppet. Ги опишува ресурсите со кои администраторот планира да управува и активностите што треба да ги преземе. За разлика од повеќето слични решенија, во Puppet јазикот го олеснува пристапот до сите слични ресурси на кој било систем во хетерогена средина. Описот на ресурсот обично се состои од име, тип и атрибути. На пример, посочете ја датотеката /etc/passwd и поставете ги нејзините атрибути:

датотека ("/etc/passwd":

Сопственик => корен,

група => корен,

Режим => 644,

Клиентите кои се поврзуваат со серверот сега ќе ја копираат датотеката /etc/passwd и ќе ги постават наведените атрибути. Во едно правило, можете да дефинирате неколку ресурси одеднаш, раздвојувајќи ги со точка-запирка. Но, што ако конфигурациската датотека што се користи на серверот се разликува од клиентските или воопшто не се користи? На пример, оваа ситуација може да се случи при поставување VPN конекции. Во овој случај, треба да укажете на датотеката со изворната директива. Овде има две опции, можете, како и обично, да ја одредите патеката до друга датотека, како и да ги користите поддржаните два URI протоколи: датотека и кукла. Во првиот случај, се користи врска до надворешен NFS сервер, во вториот случај, услуга слична на NFS се активира на серверот Puppet, кој извезува ресурси. Во вториот случај, стандардната патека е во однос на root директориумот на куклата - /etc/puppet. Односно, врската puppet://server.domain.com/config/sshd_config ќе одговара на датотеката /etc/puppet/config/sshd_config. Можете да го отфрлите овој директориум со директивата filebucket, иако е поправилно да се користи истоимениот дел во датотеката /etc/puppet/fileserver.conf. Во овој случај, можете да го ограничите пристапот до услугата само на одредени адреси. На пример, да го опишеме делот за конфигурација:

Патека /var/puppet/config

Дозволи *.domain.com

Дозволи 127.0.0.1

Дозволи 192.168.0.*

Дозволи 192.168.1.0/24

Одбијте *.wireless.domain.com

И тогаш се повикуваме на овој дел кога го опишуваме ресурсот:

извор => "puppet://server.domain.com/config/sshd_config"

На дебелото црево му претходи името на ресурсот. Во наједноставните случаи, можете едноставно да ја наведете целосната патека до датотеката како име. Во посложени конфигурации, подобро е да се користи алијас или променливи. Алијас се поставува со помош на директивата за алијас:

датотека ("/etc/passwd":

Алијас => passwd

Друга опција за креирање алијас добро функционира кога треба да се справите со различни оперативни системи. На пример, ајде да создадеме ресурс што ја опишува датотеката sshd_config:

датотека (sshdconfig:

Име => $оперативен систем ? (

Соларис => "/usr/local/etc/ssh/sshd_config",

Стандардно => "/etc/ssh/sshd_config"

Во овој пример, ние сме соочени со избор. Датотеката за Solaris е наведена посебно, за сите други ќе биде избрана датотеката /etc/ssh/sshd_config. Сега овој ресурс може да се пристапи како sshdconfig, во зависност од оперативниот систем, ќе се избере саканата патека. На пример, наведуваме дека ако sshd демонот работи и се прими нова датотека, услугата треба да се рестартира:

услуга(sshd:

осигурај => точно,

Претплатете се => Датотека

Променливите често се користат при работа со кориснички податоци. На пример, ја опишуваме локацијата на домашните директориуми на корисникот:

$homeroot = "/home"

Сега, до датотеките специфични за корисникот може да се пристапи како:

$(homeroot)/$име

Параметарот $name ќе биде заменет со името на корисничката сметка. Во некои случаи, погодно е да се дефинира стандардна вредност за некој тип. На пример, многу е вообичаено типот exec да ги специфицира директориумите во кои треба да бара извршна датотека:

Exec (пат => "/usr/bin:/bin:/usr/sbin:/sbin" )

Во случај да треба да укажете на неколку вгнездени датотеки и директориуми, можете да го користите параметарот за повторување:

датотека ("/etc/apache2/conf.d":

Извор => "puppet://puppet://server.domain.com/config/apache/conf.d",

Повторување => „вистинито“

Повеќе ресурси може да се комбинираат во класи или дефиниции. Класите се целосен опис на систем или услуга и се користат изолирано:

класа Linux (

Датотека(

"/etc/passwd": сопственик => корен, група => корен, режим => 644;

„/etc/shadow“: сопственик => корен, група => корен, режим => 440

Како и во објектно-ориентирани јазици, класите може да се редефинираат. На пример, во FreeBSD, групата што ги поседува овие датотеки е тркалото. Затоа, за да не го преработиме целосно ресурсот, ајде да создадеме нова класа на freebsd што ќе ја наследи класата на Linux:

класата freebsd го наследува Linux (

Датотека["/etc/passwd"] (група => тркало);

Датотека["/etc/shadow"] (група => тркало)

За погодност, сите класи може да се стават во посебна датотека, која мора да биде вклучена во директивата за вклучување. Дефинициите може да земат повеќе параметри како аргументи, но не поддржуваат наследување и се користат кога сакате да опишете објекти за повеќекратна употреба. На пример, да го дефинираме домашниот директориум на корисникот и командите потребни за создавање нова сметка:

дефинирај user_homedir ($group, $fullname, $ingroups) (

корисник („$name“:

обезбеди => присутни,

Коментар => „$fullname“,

gid => "$група",

Групи => $ingroups,

Членство => минимум,

Школка => "/bin/bash",

Почетна => "/home/$name",

Бара => Група[$група],

Exec("$name homedir":

Команда => "/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name",

Создава => "/home/$name",

Бара => Корисник[$name],

Сега, за да креирате нова сметка, само погледнете на user_homedir:

user_homedir("сергеј":

Група => "сергеј",

Целосно име => „Сергеј Јаремчук“,

Ингрупи => [„медиуми“, „админ]

Одделно, постојат описи на јазли (јазол) кои поддржуваат наследство, како класи. Кога клиентот ќе се поврзе со куклен сервер, ќе го бара соодветниот дел за јазол и ќе ги врати поставките кои се специфични само за таа машина. Можете да го користите стандардниот јазол за да ги опишете сите други системи. Опис на сите типови е даден во документот Type Reference, кој треба да го прочитате во секој случај, барем за да ги разберете сите карактеристики на јазикот Puppet. Различни типови ви дозволуваат да извршувате одредени команди, вклучително и кога се исполнети одредени услови (на пример, менување на конфигурациската датотека), работа со cron, кориснички ингеренции и групи, компјутери, монтирање ресурси, стартување и стопирање услуги, инсталирање, ажурирање и отстранување пакети , работа со SSH клучеви, зони Solaris итн. Вака можете лесно да натерате списокот на пакети во дистрибуции со помош на apt да се ажурира секојдневно помеѓу 2 и 4 часот:

распоред (дневно:

Период => дневно,

опсег =>

exec("/usr/bin/apt-get ажурирање":

Распоред => дневно

Ажурирањето за тој период ќе го врши само еднаш секој систем, по што задачата се смета за завршена и ќе биде избришана од клиентскиот компјутер. Јазикот Puppet поддржува други познати структури: услови, функции, низи, коментари и слично.

Инсталација на кукли

Puppet бара Ruby (верзија 1.8.1 и понова) со OpenSSL поддршка и XMLRPC библиотеки, како и библиотека Faster. Складиштето на Ubuntu 7.04 што се користеше во тест инсталацијата веќе го вклучува пакетот за кученце:

$ sudo apt-cache кукла за пребарување

~$ ruby ​​‎-rxmlrpc/client -e „puts:yep“

да

Ако не се добиени грешки, тогаш сè што ви треба е веќе вклучено. Датотеките што ја опишуваат саканата конфигурација на системите се нарекуваат манифестации во куклена терминологија. Кога е стартуван, демонот се обидува да ја прочита датотеката /etc/puppet/manifests/site.pp, ако ја нема, издава предупредувачка порака. Кога тестирате, можете да му кажете на демонот да работи во офлајн режим, што не бара манифест:

$ sudo /usr/bin/puppetmasterd --nodes

Доколку е потребно, site.pp може да вклучи и други датотеки, на пример, со описи на класи. За тестирање, можете да ја додадете наједноставната инструкција во оваа датотека.

класа судо (

Датотека ("/etc/sudoers":

Сопственик => корен,

група => корен,

Режим => 440,

стандарден јазол(

Вклучете судо

Сите конфигурациски датотеки, и серверот и клиентот, се наоѓаат во /etc/puppet. Датотеката fileserver.conf за која веќе зборувавме е опционална и се користи само кога Puppet ќе дејствува и како сервер за датотеки. На Ubuntu, оваа датотека го извезува поддиректориумот /etc/puppet/files. Поддиректориумот ssl содржи сертификати и клучеви кои ќе се користат за шифрирање на врските со клиентите. Копчињата се генерираат автоматски кога првпат ќе го стартувате puppetmasterd, можете рачно да ги креирате со командата:

$ sudo /usr/bin/puppetmasterd --mcusers

Датотеките puppetd.conf и puppetmasterd.conf се слични. Тие специфицираат некои параметри за работа на демоните на системот на клиентот и серверот. Датотеката на клиентот се разликува само во присуство на параметарот на серверот, што укажува на компјутерот што работи puppetmasterd:

server=grinder.com

logdir = /var/log/кукла

vardir=/var/lib/кукла

rundir = /var/run

# испрати извештај до серверот

извештај=точно

Наместо да пишувате сè рачно, можете да креирате шаблон користејќи го самиот puppetd:

$ puppetd --genconfig > /etc/puppet/puppetd.conf

Слично на тоа, можете да креирате site.pp на серверот:

$ puppetd --genmanifest > /etc/puppet/manifests/site.pp

Друга датотека tagmail.conf ви овозможува да одредите адреси на е-пошта до кои ќе се испраќаат извештаи. Во наједноставниот случај, може да се користи една линија:

сите: [заштитена е-пошта]

Конфигурациските датотеки не се доволни за клиентот да може да се поврзе со серверот. За да го направите ова, сè уште треба да потпишете сертификати.

Прво, за да може серверот да дознае за новиот компјутер, на клиентскиот систем, внесете ја командата:

$ sudo puppetd --server grinder.com --waitforcert 60 --test

Заштитниот ѕид мора да дозволи поврзување на портата 8140.

На серверот добиваме листа на сертификати што треба да се потпишат:

$ sudo puppetca --листа

nomad.grinder.com

И потпишете го сертификатот за клиентот:

$ sudo puppetca -- знак nomad.grinder.com

Сега клиентот може слободно да се поврзе со серверот и да прима поставки.

За жал, невозможно е да се прикажат сите можности на Кукла во границите на статијата. Но, како што можете да видите, ова е функционална и флексибилна алатка која ви овозможува да ги решите повеќето од задачите за истовремено администрирање на голем број системи. И што е најважно, проектот успеа да собере мала, но постојано растечка заедница. Затоа, да се надеваме дека добрата идеја нема да дозволи да умре или да оди настрана.

Со среќа!

  1. Веб-страницата на проектот BladeLogic е http://www.bladelogic.com.
  2. Веб-страницата на проектот OpsWare е http://www.opsware.com.
  3. Веб-страницата на проектот Cfengine е http://www.cfengine.org.
  4. Сајтот на проектот Puppet е http://reductivelabs.com/projects/puppet.
  5. Куклен готвач - http://www.reductivelabs.com/trac/puppet/tagspuppet%2Crecipe.
  6. Побрза библиотека -



Врв