Урок за кукли за начинаещи: Какво е Puppet и как да се използва?

Преди да научим Puppet, нека разберем:

Какво е управление на конфигурацията?

Управлението на конфигурацията е процес на поддържане на софтуер и компютърни системи (например сървъри, съхранение, мрежи) в известно, желано и последователно състояние. Той също така позволява достъп до точен исторически запис на състоянието на системата за целите на управлението на проекти и одита.

Системните администратори изпълняват предимно повтарящи се задачи като инсталиране на сървъри, конфигуриране на тези сървъри и т.н. Тези професионалисти могат да автоматизират тази задача, като пишат скриптове.

Това обаче е трудна работа, когато работят върху масивна инфраструктура. Инструментът за управление на конфигурацията като Puppet беше въведен за разрешаване на такива проблеми.

Какво е Puppet?

Кукла на конци е инструмент за управление на системата за централизиране и автоматизиране на процеса на управление на конфигурацията. Puppet се използва и като инструмент за внедряване на софтуер. Това е софтуер за управление на конфигурацията с отворен код, широко използван за конфигурация на сървъри, управление, внедряване и оркестрация на различни приложения и услуги в цялата инфраструктура на една организация.

Puppet е специално проектиран да управлява конфигурацията на Linux и Windows системи. Написан е на Ruby и използва неговия уникален Dосновно SСПЕЦИФИЧНИ Lезик (DSL), за да опише конфигурацията на системата.

Какви са версиите на Puppet?

Puppet се предлага в две версии:

  • Кукла с отворен код: Това е основна версия на инструмента за управление на конфигурацията Puppet, който е известен също като Open Source Puppet. Достъпен е директно от уебсайта на Puppet и е лицензиран под системата Apache 2.0.
  • Куклено предприятие: Търговска версия, която предлага функции като отчитане на съответствието, оркестрация, ролеви контрол на достъпа, GUI, API и инструменти от командния ред за ефективно управление на възли.

Какво може Puppet?

Например имате инфраструктура с около 100 сървъра. Като системен администратор, ваша роля е да гарантирате, че всички тези сървъри са винаги актуални и работят с пълна функционалност.

Системен администратор, работещ ръчно на сървърите
Системен администратор, работещ ръчно на сървърите

За да направите това, можете да използвате Puppet, който ви позволява да напишете прост код, който може да бъде разгърнат автоматично на тези сървъри. Това намалява човешките усилия и прави процеса на разработка бърз и ефективен.

Puppet автоматизира управлението на сървъра
Puppet автоматизира управлението на сървъра

Куклата изпълнява следните функции:

  • Puppet ви позволява да дефинирате отделни конфигурации за всеки хост.
  • Инструментът ви позволява непрекъснато да наблюдавате сървърите, за да потвърдите дали необходимата конфигурация съществува или не и не е променена. Ако конфигурацията бъде променена, инструментът Puppet ще се върне към предварително дефинираната конфигурация на хоста.
  • Той също така осигурява контрол върху цялата конфигурирана система, така че централизираната промяна се извършва автоматично.
  • Използва се и като инструмент за внедряване, тъй като автоматично внедрява софтуер в системата. Той прилага инфраструктура като код, защото политиките и конфигурациите са написани като код.

Puppet DSL и парадигми за програмиране

Преди да научим Puppet DSL, нека разберем парадигмите на програмиране:

Парадигмата на програмиране е стил, който използвате в компютърното програмиране.

Четири вида парадигми са:

  • Императивен.
  • Декларативна.
  • Функционален (който се счита за подмножество на тази декларативна парадигма)
  • Обектно ориентиран.

Ще се съсредоточим върху Императива и Декларативите.

Императивни парадигми

Тази програмна парадигма изразява логиката на изчислението (какво да се направи) и описва неговия контролен поток (как да се направи)

Пример:

Да предположим, че отивате в офиса си, резервирате такси и започвате да давате указания стъпка по стъпка на шофьора, докато стигнете до офиса. Уточняването какво и как да се прави е императивен стил.

Декларативни парадигми

Тази програмна парадигма изразява логиката на изчислението (какво да се направи), без да описва неговия контролен поток (как да се направи)

Пример:

Да приемем, че отивате в офиса си, резервирате такси на Uber и посочвате крайната дестинация (офис). Указването какво да се прави, а не как да се прави, е декларативен стил.

Парадигма Какво да правя Как да се направи
императив Да Да
Декларативна Да Не

Puppet използва парадигма за декларативно програмиране

Puppet използва декларативен програмен подход.

Пример: Създайте потребител в системата:

Може да се направи с помощта на Императивен модел на програмиране чрез скрипт на обвивка: Тук ние определяме как да създадете потребителя и какви команди да използвате на операционната система.

Декларативни парадигми

Въпреки това, това може да се направи с помощта на декларативен програмен модел само с няколко реда марионетен код, специфичен език за марионетни домейни (DSL) и пак да се постигне същия резултат.

Декларативни парадигми

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

Има два модела на внедряване за инструменти за управление на конфигурацията :

  • Push-базиран модел на внедряване: иницииран от главен възел.
  • Модел на внедряване, базиран на изтегляне: иницииран от агенти.

Push-базиран модел на внедряване

В този модел на разгръщане главният сървър изпраща конфигурациите и софтуера към отделните агенти. След проверка на защитена връзка, главният изпълнява команди дистанционно на агентите. например, Ansible и Солен стек.

Модел на внедряване, базиран на изтегляне.

В този модел на внедряване отделните сървъри се свързват с главен сървър, проверяват и установяват защитена връзка, изтеглят своите конфигурации и софтуер и след това се конфигурират съответно - например Puppet и Chef.

Как работи Puppet?

Puppet се основава на модел на внедряване на Pull, при който агентните възли се проверяват редовно след всеки 1800 секунди с главния възел, за да видите дали нещо трябва да се актуализира в агента. Ако нещо трябва да се актуализира, агентът изтегля необходимите марионетни кодове от главния и изпълнява необходимите действия.

Нека го обясним с пример:

Пример: Master – Настройка на агент:

Учителят

Машина, базирана на Linux, с инсталиран на нея софтуер Puppet master. Той отговаря за поддържането на конфигурации под формата на марионетни кодове. Главният възел може да бъде само Linux.

Агентите

Целевите машини, управлявани от кукла с инсталиран на тях софтуер за куклен агент.

Агентът може да бъде конфигуриран на всяка поддържана операционна система като Linux или Windows or Solaris или Mac OS.

Комуникацията между мастер и агент се осъществява чрез защитени сертификати.

Кукловод Комуникация с агент
Кукловод Комуникация с агент

Комуникация между Капитан и Агент

Стъпка 1) След като връзката е установена между агента и главния, Puppet агентът изпраща данните за своето състояние до Puppet master сървъра. Те се наричат ​​факти: Тази информация включва името на хоста, подробности за ядрото, IP адрес, подробности за името на файла и т.н.

Комуникация между Капитан и Агент
Агентът изпраща факти на Master

Стъпка 2) Puppet Master използва тези данни и съставя списък с конфигурацията, която да се приложи към агента. Този списък с конфигурации, които трябва да бъдат изпълнени на агент, е известен като a каталог. Това може да бъде променено като инсталиране на пакет, надграждане или премахване, създаване на файлова система, създаване или изтриване на потребител, рестартиране на сървъра, промени в IP конфигурацията и т.н.

Комуникация между Капитан и Агент
Капитанът изпраща каталог на агента

Стъпка 3) Агентът използва този списък с конфигурация, за да приложи всички необходими промени в конфигурацията на възела.

В случай че няма отклонения в конфигурацията, агентът не извършва никакви промени в конфигурацията и оставя възела да работи със същата конфигурация.

Комуникация между Капитан и Агент
Агентът прилага конфигурацията

Стъпка 4) След като бъде направено, възелът докладва обратно на кукловода, показвайки, че конфигурацията е приложена и завършена.

Куклени блокове

Puppet предоставя гъвкавостта за интегриране на отчети с инструменти на трети страни, използвайки API на Puppet.

Четири вида градивни елементи на Puppet са

  1. Ресурси
  2. Класове
  3. манифест
  4. Модули

Ресурси за кукли

Puppet Resources са градивните елементи на Puppet.

Ресурсите са вградени функции които се изпълняват в задния край, за да изпълняват необходимите операции в марионетка.

Класове по кукли

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

Куклен манифест

Manifest е директория, съдържаща марионетни DSL файлове. Тези файлове имат разширение .pp. Разширението .pp означава марионетна програма. Кодът на марионетките се състои от дефиниции или декларации на класове марионетки.

Кукленски модули

Модулите са колекция от файлове и директории като манифести, дефиниции на класове. Те са многократно използваемите и споделяеми единици в Puppet.

Така например, MySQL модул за инсталиране и конфигуриране MySQL или модула Jenkins за управление на Jenkins и т.н.

Кукленски модули
Кукленски модули

Видове кукленски ресурси

Като цяло системата се състои от файлове, потребители, услуги, процеси, пакети и т.н. В Puppet те се наричат ​​ресурси. Ресурсите са основните градивни елементи в

Кукла. Всички операции с агенти-кукли се извършват с помощта на ресурси за кукли.

Ресурсите за марионетки са готови инструменти, които се използват за изпълнение на различни задачи и операции на всяка поддържана платформа. Можем да използваме един ресурс за марионетки, за да изпълним конкретна задача, или можем да използваме множество ресурси за марионетки заедно, за да изпълним някои сложни внедрявания на конфигурации на приложения.

Ресурсите могат да бъдат различни видове. Използване на кукли ресурси намлява типове ресурси за да се опише конфигурацията на системата.

Има три вида ресурси:

  1. Марионетно ядро ​​или вградени типове ресурси.
  2. Марионетка, дефинирани типове ресурси.
  3. Персонализирани типове ресурси на Puppet.

Марионетно ядро ​​или вградени типове ресурси

Основните или вградените типове ресурси са предварително изградените типове ресурси за марионетки, доставяни със софтуера за марионетки. Всички основни или вградени типове ресурси на Puppet са написани и поддържани от екипа на Puppet.

Марионетка, дефинирани типове ресурси

Дефинираните типове ресурси са олекотени типове ресурси, написани на декларативен език на Puppet, използвайки комбинация от съществуващи типове ресурси.

Персонализирани типове ресурси на Puppet

Персонализираните типове ресурси са напълно персонализирани типове ресурси, написани на Ruby.

Нека проучим типовете ресурси за марионетки...

В терминала въведете следната команда, за да покажете списък с подходящи подкоманди за Puppet:

Puppet --help

Персонализирани типове ресурси за Puppet

В нашия случай се интересуваме от подкомандата „ресурс”, който ще използваме, за да намерим информация за вградени типове ресурси за марионетки.

В терминала въведете някоя от следните команди, за да покажете списък с мерки свързан с подкомандата марионетка „ресурс"

Puppet help resource		
Puppet resource --help		

Персонализирани типове ресурси за Puppet

В този случай имаме ресурс като подкоманда и – видове като действие.

Puppet има 49 вградени основни типа ресурси.

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

puppet resource –types

Персонализирани типове ресурси за Puppet

Всеки тип поддържа списък от атрибути. Тези атрибути предоставят подробно описание, което Puppet използва за управление на ресурса.

За да разберете всички атрибути, свързани с типа ресурс на марионетка, използвайте следната команда:

puppet describe <resource type name>	

Параметрите ще изброят всички налични атрибути за този тип ресурс.

марионетка описва пакет

Персонализирани типове ресурси за Puppet

Трудно е за нов човек да разбере и свърже много неуправляеми файлове с марионетен код. Тук се нуждаем от групиране, за да свържем операциите. Целта е да се реши единичен проблем, като например всички операции, необходими за конфигуриране на ssh на сървър или ntp услуга или пълен уеб сървър или сървър на база данни от нулата.

Какво представляват куклените класове?

Класовете за кукли са колекция от ресурси за кукли, обединени в едно цяло.

Puppet въведе класове, за да направи структурата многократно използваема и организирана.

Първо, трябва да дефинираме клас, използвайки синтаксис за дефиниране на клас; класовете трябва да са уникални и могат да бъдат декларирани само веднъж със същото име:

class <class-name> {
<Resource declarations>
}

Пример:

class ntpconfig {
    file {
        "/etc/ntp.conf": 
     ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}

Досега сме дефинирали само класа, но не сме го използвали никъде. Това означава, че този код, който сме написали, никога няма да бъде изпълнен, освен ако не декларираме този клас другаде.

Декларация на класа

За да използвате дефиниран клас в кода, използвайте include ключова дума.

class ntpconfig {
    file {
        "/etc/ntp.conf": 
      ensure=> "present", 
      content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}
include ntpconfig

Нека разберем това с реален случай.

Демо инсталация на NTP

Първо се уверете, че NTP пакетът вече не присъства на сървъра, следната команда няма да върне нищо, ако telnet не присъства на сървъра:

rpm -qa | grep -i ntp

Демо инсталация на NTP

Както виждаме, NTP пакетът вече присъства на сървъра. Нека премахнем съществуващия NTP пакет:

yum remove ntp

След като премахнете пакета, уверете се, че файлът ntp.conf не съществува:

ls -lrt /etc/ntp.conf

Демо инсталация на NTP

Проверете дали услугата ntp не съществува, като изпълните следната команда:

systemctl status ntp

Демо инсталация на NTP

Създайте нов .pp файл, за да запазите кода. От командния ред:

vi demontp.pp

Променете към режим на вмъкване, като натиснете i от клавиатурата.

Въведете следния код, за да създадете нов файл:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

След като приключите с редактирането: натиснете esc

За да запазите файла, натиснете :wq!

Следващата стъпка е да проверка дали кодът има синтактични грешки. Изпълнете следната команда:

puppet parser validate demontp.pp

Уверете се, че сте преминали към корен за да можете да завършите теста без грешка, като изпълните командата:

su root

тест е следващата стъпка в процеса на създаване на код. Изпълнете следната команда, за да извършите тест за дим:

Puppet applies demontp.pp --noop

Последната стъпка е да тичам куклата в реален режим и проверете изхода.

puppet apply demontp.pp

Puppet не изпълни нищо, защото демонстрационният клас беше просто дефинирани но не обявен.

Така че, докато не декларирате класа марионетка, кодът няма да бъде приложен.

Нека да декларирам демонстрационния клас вътре в същия код, използвайки включва име на клас в края на кода:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

# Class Declaration 
include ntpconfig

Отново проверка дали кодът има синтактични грешки. Изпълнете следната команда:

puppet parser validate demontp.pp

Уверете се, че сте преминали към корен за да можете да завършите теста без грешка, като изпълните командата:

su root

Тестване е следващата стъпка в процеса на създаване на код. Изпълнете следната команда, за да извършите тест за дим:

Puppet apply demontp.pp --noop

Последната стъпка е да тичам куклата в реален режим и проверете изхода.

puppet apply demontp.pp

Този път кодът се прилага, защото класът е дефиниран и след това деклариран.

Демо инсталация на NTP

Уверете се, че ntp.conf вече съществува:

ls -lrt /etc/ntp.conf

Проверете дали услугата ntp е стартирана, като изпълните следната команда:

systemctl status ntpd

Демо инсталация на NTP