Қуыршақпен таныстыру

Қуыршақ конфигурацияны басқару жүйесі болып табылады. Ол хосттарды қажетті күйге келтіру және осы күйді сақтау үшін қолданылады.

Мен қуыршақпен бес жылдан астам уақыт жұмыс істеймін. Бұл мәтін негізінен ресми құжаттаманың негізгі ойларының аударылған және қайта реттелген жинағы болып табылады, бұл жаңадан бастағандарға Қуыршақтың мәнін тез түсінуге мүмкіндік береді.

Қуыршақпен таныстыру

Негізгі ақпарат

Қуыршақ операциялық жүйесі клиент-сервер болып табылады, бірақ ол сонымен қатар шектеулі функционалдығы бар серверсіз жұмысты қолдайды.

Жұмыстың тарту үлгісі пайдаланылады: әдепкі бойынша, жарты сағат сайын клиенттер конфигурация үшін серверге хабарласып, оны қолданады. Егер сіз Ansible-мен жұмыс істеген болсаңыз, онда олар басқа push моделін пайдаланады: әкімші конфигурацияны қолдану процесін бастайды, клиенттердің өздері ештеңе қолданбайды.

Желілік байланыс кезінде екі жақты TLS шифрлауы қолданылады: сервер мен клиенттің жеке кілттері және сәйкес сертификаттары бар. Әдетте сервер клиенттер үшін сертификаттар шығарады, бірақ негізінен сыртқы CA-ны пайдалануға болады.

Манифесттермен таныстыру

Қуыршақ терминологиясында қуыршақ серверіне қосылу түйіндер (түйіндер). Түйіндерге арналған конфигурация жазылған манифесттерде арнайы бағдарламалау тілінде - Puppet DSL.

Қуыршақ DSL – декларативті тіл. Ол жеке ресурстардың декларациясы түрінде түйіннің қалаған күйін сипаттайды, мысалы:

  • Файл бар және оның арнайы мазмұны бар.
  • Пакет орнатылды.
  • Қызмет басталды.

Ресурстар өзара байланысты болуы мүмкін:

  • Тәуелділіктер бар, олар ресурстарды пайдалану ретіне әсер етеді.
    Мысалы, «алдымен пакетті орнатыңыз, содан кейін конфигурация файлын өңдеңіз, содан кейін қызметті бастаңыз».
  • Хабарландырулар бар - егер ресурс өзгерсе, ол оған жазылған ресурстарға хабарландырулар жібереді.
    Мысалы, конфигурация файлы өзгерсе, қызметті автоматты түрде қайта қосуға болады.

Сонымен қатар, Қуыршақ DSL функциялары мен айнымалы мәндері, сондай-ақ шартты мәлімдемелер мен селекторлар бар. Әртүрлі үлгілеу механизмдеріне де қолдау көрсетіледі - EPP және ERB.

Қуыршақ Ruby тілінде жазылған, сондықтан көптеген конструкциялар мен терминдер сол жерден алынған. Ruby сізге қуыршақтарды кеңейтуге мүмкіндік береді - күрделі логиканы, ресурстардың жаңа түрлерін, функцияларды қосыңыз.

Қуыршақ іске қосылған кезде сервердегі әрбір нақты түйін үшін манифесттер каталогқа құрастырылады. анықтамалық функциялардың, айнымалылардың мәнін және шартты мәлімдемелерді кеңейтуді есептегеннен кейінгі ресурстар мен олардың байланыстарының тізімі болып табылады.

Синтаксис және код стилі

Мұнда келтірілген мысалдар жеткіліксіз болса, синтаксисті түсінуге көмектесетін ресми құжаттаманың бөлімдері берілген:

Манифесттің қалай көрінетінінің мысалы:

# Комментарии пишутся, как и много где, после решётки.
#
# Описание конфигурации ноды начинается с ключевого слова node,
# за которым следует селектор ноды — хостнейм (с доменом или без)
# или регулярное выражение для хостнеймов, или ключевое слово default.
#
# После этого в фигурных скобках описывается собственно конфигурация ноды.
#
# Одна и та же нода может попасть под несколько селекторов. Про приоритет
# селекторов написано в статье про синтаксис описания нод.
node 'hostname', 'f.q.d.n', /regexp/ {
  # Конфигурация по сути является перечислением ресурсов и их параметров.
  #
  # У каждого ресурса есть тип и название.
  #
  # Внимание: не может быть двух ресурсов одного типа с одинаковыми названиями!
  #
  # Описание ресурса начинается с его типа. Тип пишется в нижнем регистре.
  # Про разные типы ресурсов написано ниже.
  #
  # После типа в фигурных скобках пишется название ресурса, потом двоеточие,
  # дальше идёт опциональное перечисление параметров ресурса и их значений.
  # Значения параметров указываются через т.н. hash rocket (=>).
  resource { 'title':
    param1 => value1,
    param2 => value2,
    param3 => value3,
  }
}

Шегініс пен жол үзілімдері манифесттің міндетті бөлігі емес, бірақ ұсынылғаны бар стиль бойынша нұсқаулық. Түйіндеме:

  • Екі бос орын шегіністер, қойындылар пайдаланылмайды.
  • Бұйра жақшалар бос орынмен бөлінеді, қос нүктелер бос орынмен бөлінбейді.
  • Әрбір параметрден кейінгі үтірлер, соның ішінде соңғысы. Әрбір параметр бөлек жолда. Параметрсіз және бір параметрсіз жағдай үшін ерекшелік жасалады: бір жолға және үтірсіз жазуға болады (яғни. resource { 'title': } и resource { 'title': param => value }).
  • Параметрлердегі көрсеткілер бірдей деңгейде болуы керек.
  • Олардың алдында ресурс қатынасының көрсеткілері жазылған.

Папетсервердегі файлдардың орналасуы

Қосымша түсіндіру үшін мен «түбірлік каталог» ұғымын енгіземін. Түбірлік каталог - белгілі бір түйінге арналған Қуыршақ конфигурациясын қамтитын каталог.

Түбірлік каталог Қуыршақ нұсқасына және пайдаланылатын орталарға байланысты өзгереді. Орталар жеке каталогтарда сақталатын конфигурациялардың тәуелсіз жиындары болып табылады. Әдетте git-пен бірге пайдаланылады, бұл жағдайда орталар git тармақтарынан жасалады. Сәйкесінше, әрбір түйін бір немесе басқа ортада орналасады. Мұны түйіннің өзінде немесе келесі мақалада айтатын ENC бағдарламасында конфигурациялауға болады.

  • Үшінші нұсқада («ескі қуыршақ») негізгі каталог болды /etc/puppet. Орталарды пайдалану міндетті емес - мысалы, біз оларды ескі Қуыршақпен қолданбаймыз. Егер орталар пайдаланылса, олар әдетте сақталады /etc/puppet/environments, түбірлік каталог орта каталогы болады. Егер орталар пайдаланылмаса, түбірлік каталог негізгі каталог болады.
  • Төртінші нұсқадан бастап («жаңа қуыршақ») орталарды пайдалану міндетті болды және негізгі каталог келесіге ауыстырылды /etc/puppetlabs/code. Сәйкесінше, орталар сақталады /etc/puppetlabs/code/environments, түбірлік каталог - орта каталогы.

Түбірлік каталогта ішкі каталог болуы керек manifests, онда түйіндерді сипаттайтын бір немесе бірнеше манифесттер бар. Сонымен қатар, ішкі каталог болуы керек modules, онда модульдер бар. Қандай модульдер екенін сәл кейінірек айтамын. Бұған қоса, ескі Қуыршақтың ішкі каталогы да болуы мүмкін files, онда біз түйіндерге көшіретін әртүрлі файлдар бар. Жаңа қуыршақта барлық файлдар модульдерге орналастырылған.

Манифест файлдарының кеңейтімі бар .pp.

Бір-екі ұрыс мысалдары

Түйіннің сипаттамасы және ондағы ресурс

Түйінде server1.testdomain файл жасалуы керек /etc/issue мазмұнымен Debian GNU/Linux n l. Файл пайдаланушы мен топқа тиесілі болуы керек root, қол жеткізу құқықтары болуы керек 644.

Біз манифест жазамыз:

node 'server1.testdomain' {   # блок конфигурации, относящийся к ноде server1.testdomain
    file { '/etc/issue':   # описываем файл /etc/issue
        ensure  => present,   # этот файл должен существовать
        content => 'Debian GNU/Linux n l',   # у него должно быть такое содержимое
        owner   => root,   # пользователь-владелец
        group   => root,   # группа-владелец
        mode    => '0644',   # права на файл. Они заданы в виде строки (в кавычках), потому что иначе число с 0 в начале будет воспринято как записанное в восьмеричной системе, и всё пойдёт не так, как задумано
    }
}

Түйіндегі ресурстар арасындағы байланыстар

Түйінде server2.testdomain nginx бұрын дайындалған конфигурациямен жұмыс істеп тұруы керек.

Мәселені ашайық:

  • Пакетті орнату қажет nginx.
  • Конфигурация файлдарын серверден көшіру қажет.
  • Қызмет іске қосылуы керек nginx.
  • Конфигурация жаңартылса, қызметті қайта іске қосу керек.

Біз манифест жазамыз:

node 'server2.testdomain' {   # блок конфигурации, относящийся к ноде server2.testdomain
    package { 'nginx':   # описываем пакет nginx
        ensure => installed,   # он должен быть установлен
    }
  # Прямая стрелка (->) говорит о том, что ресурс ниже должен
  # создаваться после ресурса, описанного выше.
  # Такие зависимости транзитивны.
    -> file { '/etc/nginx':   # описываем файл /etc/nginx
        ensure  => directory,   # это должна быть директория
        source  => 'puppet:///modules/example/nginx-conf',   # её содержимое нужно брать с паппет-сервера по указанному адресу
        recurse => true,   # копировать файлы рекурсивно
        purge   => true,   # нужно удалять лишние файлы (те, которых нет в источнике)
        force   => true,   # удалять лишние директории
    }
  # Волнистая стрелка (~>) говорит о том, что ресурс ниже должен
  # подписаться на изменения ресурса, описанного выше.
  # Волнистая стрелка включает в себя прямую (->).
    ~> service { 'nginx':   # описываем сервис nginx
        ensure => running,   # он должен быть запущен
        enable => true,   # его нужно запускать автоматически при старте системы
    }
  # Когда ресурс типа service получает уведомление,
  # соответствующий сервис перезапускается.
}

Бұл жұмыс істеуі үшін қуыршақ серверінде шамамен келесі файл орны қажет:

/etc/puppetlabs/code/environments/production/ # (это для нового Паппета, для старого корневой директорией будет /etc/puppet)
├── manifests/
│   └── site.pp
└── modules/
    └── example/
        └── files/
            └── nginx-conf/
                ├── nginx.conf
                ├── mime.types
                └── conf.d/
                    └── some.conf

Ресурс түрлері

Қолдау көрсетілетін ресурс түрлерінің толық тізімін мына жерден табуға болады құжаттамада, мұнда мен бес негізгі түрін сипаттаймын, олар менің тәжірибемде көптеген мәселелерді шешуге жеткілікті.

файл

Файлдарды, каталогтарды, символдық сілтемелерді, олардың мазмұнын және кіру құқықтарын басқарады.

Параметрлер:

  • ресурс атауы — файлға жол (міндетті емес)
  • жолы — файлға жол (егер ол атауда көрсетілмесе)
  • қамтамасыз ету - файл түрі:
    • absent - файлды жою
    • present — кез келген түрдегі файл болуы керек (егер файл болмаса, кәдімгі файл жасалады)
    • file - кәдімгі файл
    • directory - каталог
    • link - символдық сілтеме
  • мазмұны — файл мазмұны (тек қарапайым файлдар үшін жарамды, онымен бірге пайдалануға болмайды қайнар көз немесе нысана)
  • қайнар көз — файлдың мазмұнын көшіргіңіз келетін жолға сілтеме (бірге пайдалану мүмкін емес мазмұны немесе нысана). Схемасы бар URI ретінде көрсетуге болады puppet: (содан кейін қуыршақ серверінің файлдары пайдаланылады) және схемамен http: (Бұл жағдайда не болатыны анық деп үміттенемін), тіпті диаграммамен де file: немесе схемасыз абсолютті жол ретінде (содан кейін түйіндегі жергілікті FS файлы пайдаланылады)
  • нысана — символдық сілтемені көрсету керек (бірге қолдануға болмайды мазмұны немесе қайнар көз)
  • ие — файлға иелік ететін пайдаланушы
  • топ — файл жататын топ
  • режимі — файл рұқсаттары (жол ретінде)
  • қайталану - каталогтарды рекурсивті өңдеуге мүмкіндік береді
  • тазалау - Қуыршақта сипатталмаған файлдарды жоюға мүмкіндік береді
  • күш - Қуыршақта сипатталмаған каталогтарды жоюға мүмкіндік береді

пакет

Бумаларды орнатады және жояды. Хабарландыруларды өңдеу мүмкіндігі - параметр көрсетілген болса, буманы қайта орнатады reinstall_on_refresh.

Параметрлер:

  • ресурс атауы — бума атауы (міндетті емес)
  • ат — бума атауы (атауда көрсетілмесе)
  • провайдері — пайдалану үшін пакет менеджері
  • қамтамасыз ету — пакеттің қалаған күйі:
    • present, installed - орнатылған кез келген нұсқа
    • latest - соңғы нұсқасы орнатылған
    • absent - жойылды (apt-get remove)
    • purged — конфигурация файлдарымен бірге жойылды (apt-get purge)
    • held - бума нұсқасы құлыпталған (apt-mark hold)
    • любая другая строка — көрсетілген нұсқа орнатылған
  • reinstall_on_refresh - егер true, содан кейін хабарландыруды алғаннан кейін бума қайта орнатылады. Құрастыру параметрлерін өзгерту кезінде бумаларды қайта құру қажет болуы мүмкін бастапқыға негізделген таратулар үшін пайдалы. Әдепкі false.

қызмет көрсету

Қызметтерді басқарады. Хабарландыруларды өңдеу мүмкіндігі - қызметті қайта іске қосады.

Параметрлер:

  • ресурс атауы — басқарылатын қызмет (міндетті емес)
  • ат — басқаруды қажет ететін қызмет (егер атауында көрсетілмесе)
  • қамтамасыз ету — қызметтің қалаған күйі:
    • running - іске қосылды
    • stopped - тоқтады
  • мүмкіндік — қызметті бастау мүмкіндігін бақылайды:
    • true — autorun қосулы (systemctl enable)
    • mask - бүркенген (systemctl mask)
    • false — автоматты іске қосу өшірілген (systemctl disable)
  • қайтадан қосу - қызметті қайта іске қосу пәрмені
  • мәртебе — қызмет күйін тексеру командасы
  • қайта іске қосыңыз — қызмет initscript қайта іске қосуды қолдайтынын көрсетіңіз. Егер false және параметр көрсетіледі қайтадан қосу — осы параметрдің мәні пайдаланылады. Егер false және параметр қайтадан қосу көрсетілмеген - қызмет тоқтатылды және қайта іске қосылды (бірақ systemd пәрменін пайдаланады systemctl restart).
  • жағдайы — қызмет initscript пәрменді қолдайтынын көрсетіңіз status. егер false, содан кейін параметр мәні пайдаланылады мәртебе. Әдепкі true.

Exec

Сыртқы пәрмендерді іске қосады. Параметрлерді көрсетпесеңіз жасайды, тек егер, егер немесе қайталап, пәрмен Қуыршақ іске қосылған сайын орындалады. Хабарландыруларды өңдеуге қабілетті - пәрменді іске қосады.

Параметрлер:

  • ресурс атауы — орындалатын команда (міндетті емес)
  • бұйрық — орындалатын команда (егер ол атауда көрсетілмесе)
  • жолы — орындалатын файлды іздейтін жолдар
  • тек егер — егер осы параметрде көрсетілген пәрмен нөлдік қайтару кодымен аяқталса, негізгі команда орындалады
  • егер — егер осы параметрде көрсетілген пәрмен нөлдік емес қайтару кодымен аяқталса, негізгі команда орындалады.
  • жасайды — егер осы параметрде көрсетілген файл жоқ болса, негізгі команда орындалады
  • қайталап - егер true, содан кейін пәрмен осы орындаушы басқа ресурстардан хабарландыру алған кезде ғана іске қосылады
  • cwd — команда орындалатын каталог
  • пайдаланушы — пәрменді орындайтын пайдаланушы
  • провайдері - пәрменді қалай орындау керек:
    • posix — еншілес процесс жай құрылды, міндетті түрде көрсетіңіз жолы
    • Shell - команда қабықшада іске қосылады /bin/sh, көрсетілмеуі мүмкін жолы, сіз глобинг, құбырлар және басқа қабық мүмкіндіктерін пайдалана аласыз. Кез келген арнайы таңбалар болса, әдетте автоматты түрде анықталады (|, ;, &&, || тағыда басқа).

Cron

Cronjobs басқарады.

Параметрлер:

  • ресурс атауы - идентификатордың бір түрі ғана
  • қамтамасыз ету - тәждің жағдайы:
    • present - егер жоқ болса құру
    • absent - бар болса, жою
  • бұйрық - қандай команданы орындау керек
  • қоршаған орта — пәрменді қай ортада орындау керек (ортаның айнымалыларының тізімі және олардың мәндері арқылы =)
  • пайдаланушы — пәрменді қай пайдаланушыдан орындау керек
  • минут, сағат, демалыс күндері, ай, ай күні — cron іске қосылған кезде. Осы атрибуттардың кез келгені көрсетілмесе, оның crontab ішіндегі мәні болады *.

Қуыршақ 6.0 нұсқасында Cron сияқты болды қораптан шығарылды қуыршақ серверінде, сондықтан жалпы сайтта құжаттама жоқ. Бірақ ол қорапта бар қуыршақ-агентте, сондықтан оны бөлек орнатудың қажеті жоқ. Ол үшін құжаттаманы көре аласыз Қуыршақтың бесінші нұсқасына арналған құжаттамада, немесе GitHub сайтында.

Жалпы ресурстар туралы

Ресурс бірегейлігіне қойылатын талаптар

Біз жиі кездесетін қателік Қайталанатын декларация. Бұл қате каталогта бірдей атаумен бір түрдегі екі немесе одан да көп ресурстар пайда болған кезде орын алады.

Сондықтан мен тағы да жазамын: бір түйінге арналған манифесттерде бірдей тақырыптағы бір түрдегі ресурстар болмауы керек!

Кейде атаулары бірдей, бірақ әртүрлі пакет менеджерлері бар бумаларды орнату қажеттілігі туындайды. Бұл жағдайда параметрді пайдалану керек nameқатені болдырмау үшін:

package { 'ruby-mysql':
  ensure   => installed,
  name     => 'mysql',
  provider => 'gem',
}
package { 'python-mysql':
  ensure   => installed,
  name     => 'mysql',
  provider => 'pip',
}

Басқа ресурс түрлерінде қайталануды болдырмауға көмектесетін ұқсас опциялар бар - name у қызмет көрсету, command у Exec, тағыда басқа.

Метапараметрлер

Әрбір ресурс түрінің табиғатына қарамастан кейбір арнайы параметрлері болады.

Метапараметрлердің толық тізімі Қуыршақ құжаттамасында.

Қысқа тізім:

  • талап — бұл параметр бұл ресурстың қай ресурстарға тәуелді екенін көрсетеді.
  • бұрын - Бұл параметр осы ресурсқа қандай ресурстар тәуелді екенін көрсетеді.
  • жазылу — бұл параметр бұл ресурс хабарландыруларды қай ресурстардан алатынын көрсетеді.
  • хабарлау — Бұл параметр осы ресурстан хабарландыруларды алатын ресурстарды анықтайды.

Барлық аталған метапараметрлер бір ресурс сілтемесін немесе төртбұрышты жақшадағы сілтемелер жиымын қабылдайды.

Ресурстарға сілтемелер

Ресурс сілтемесі ресурс туралы жай ғана ескерту болып табылады. Олар негізінен тәуелділіктерді көрсету үшін қолданылады. Бар емес ресурсқа сілтеме жасау компиляция қатесін тудырады.

Сілтеменің синтаксисі келесідей: бас әріппен ресурс түрі (егер тип атауында қос нүктелер болса, онда қос нүктелер арасындағы атаудың әрбір бөлігі бас әріппен жазылады), содан кейін тік жақшадағы ресурс атауы (атаудың регистрі өзгермейді!). Бос орындар болмауы керек, төртбұрышты жақшалар түр атауынан кейін бірден жазылады.

Мысал:

file { '/file1': ensure => present }
file { '/file2':
  ensure => directory,
  before => File['/file1'],
}
file { '/file3': ensure => absent }
File['/file1'] -> File['/file3']

Тәуелділіктер мен хабарландырулар

Құжаттар осында.

Жоғарыда айтылғандай, ресурстар арасындағы қарапайым тәуелділіктер өтпелі болып табылады. Айтпақшы, тәуелділіктерді қосқанда абай болыңыз - сіз циклдік тәуелділіктерді жасай аласыз, бұл компиляция қатесін тудырады.

Тәуелділіктерден айырмашылығы, хабарландырулар өтпелі емес. Хабарландырулар үшін келесі ережелер қолданылады:

  • Ресурс хабарландыру алса, ол жаңартылады. Жаңарту әрекеттері - ресурс түріне байланысты Exec пәрменді орындайды, қызмет көрсету қызметті қайта іске қосады, пакет буманы қайта орнатады. Ресурста жаңарту әрекеті анықталмаған болса, ештеңе болмайды.
  • Қуыршақты бір іске қосу кезінде ресурс бір реттен жиі жаңартылмайды. Бұл мүмкін, себебі хабарландырулар тәуелділіктерді қамтиды және тәуелділік графигінде циклдар жоқ.
  • Қуыршақ ресурстың күйін өзгертсе, ресурс оған жазылған барлық ресурстарға хабарландырулар жібереді.
  • Егер ресурс жаңартылса, ол оған жазылған барлық ресурстарға хабарландырулар жібереді.

Белгіленбеген параметрлерді өңдеу

Әдетте, кейбір ресурс параметрінің әдепкі мәні болмаса және бұл параметр манифестте көрсетілмесе, Қуыршақ бұл сипатты түйіндегі сәйкес ресурс үшін өзгертпейді. Мысалы, түрдегі ресурс болса файл параметр көрсетілмеген owner, содан кейін Қуыршақ сәйкес файлдың иесін өзгертпейді.

Класстарға, айнымалыларға және анықтамаларға кіріспе

Бізде конфигурацияның бірдей бөлігіне ие бірнеше түйіндер бар делік, бірақ айырмашылықтар да бар - әйтпесе олардың барлығын бір блокта сипаттай аламыз. node {}. Әрине, сіз конфигурацияның бірдей бөліктерін жай ғана көшіре аласыз, бірақ тұтастай алғанда бұл жаман шешім - конфигурация өседі және конфигурацияның жалпы бөлігін өзгертсеңіз, көп жерде бірдей нәрсені өңдеуге тура келеді. Сонымен қатар, қателесу оңай, және тұтастай алғанда, DRY (өзіңізді қайталамаңыз) принципі белгілі бір себептермен ойлап табылды.

Бұл мәселені шешу үшін мұндай дизайн бар класс.

Сыныптар

Класс poppet кодының атаулы блогы болып табылады. Кодты қайта пайдалану үшін сыныптар қажет.

Алдымен сыныпты сипаттау керек. Сипаттаманың өзі еш жерде ешқандай ресурстарды қоспайды. Класс манифесттерде сипатталған:

# Описание класса начинается с ключевого слова class и его названия.
# Дальше идёт тело класса в фигурных скобках.
class example_class {
    ...
}

Осыдан кейін сыныпты қолдануға болады:

# первый вариант использования — в стиле ресурса с типом class
class { 'example_class': }
# второй вариант использования — с помощью функции include
include example_class
# про отличие этих двух вариантов будет рассказано дальше

Алдыңғы тапсырмадан мысал - nginx орнату мен конфигурациясын сыныпқа жылжытайық:

class nginx_example {
    package { 'nginx':
        ensure => installed,
    }
    -> file { '/etc/nginx':
        ensure => directory,
        source => 'puppet:///modules/example/nginx-conf',
        recure => true,
        purge  => true,
        force  => true,
    }
    ~> service { 'nginx':
        ensure => running,
        enable => true,
    }
}

node 'server2.testdomain' {
    include nginx_example
}

Айнымалылар

Алдыңғы мысалдағы сынып мүлде икемді емес, себебі ол әрқашан бірдей nginx конфигурациясын әкеледі. Конфигурация айнымалысына жолды жасайық, содан кейін бұл сыныпты кез келген конфигурациямен nginx орнату үшін пайдалануға болады.

Мұны жасауға болады айнымалыларды қолдану.

Назар аударыңыз: қуыршақтағы айнымалылар өзгермейді!

Сонымен қатар, айнымалыға ол жарияланғаннан кейін ғана қол жеткізуге болады, әйтпесе айнымалының мәні undef.

Айнымалылармен жұмыс істеу мысалы:

# создание переменных
$variable = 'value'
$var2 = 1
$var3 = true
$var4 = undef
# использование переменных
$var5 = $var6
file { '/tmp/text': content => $variable }
# интерполяция переменных — раскрытие значения переменных в строках. Работает только в двойных кавычках!
$var6 = "Variable with name variable has value ${variable}"

Қуыршақ бар аттар кеңістігі, және айнымалылар сәйкесінше бар көріну аймағы: Бірдей атпен айнымалыны әртүрлі аттар кеңістігінде анықтауға болады. Айнымалының мәнін шешу кезінде айнымалы ағымдағы аттар кеңістігінде, содан кейін қоршалған аттар кеңістігінде және т.б.

Атау кеңістігінің мысалдары:

  • жаһандық - кластан немесе түйін сипаттамасынан тыс айнымалылар сонда барады;
  • түйін сипаттамасындағы түйін аттар кеңістігі;
  • сынып сипаттамасындағы сынып аттар кеңістігі.

Айнымалы мәнге қатынасу кезінде екіұштылықты болдырмау үшін айнымалы атауында аттар кеңістігін көрсетуге болады:

# переменная без пространства имён
$var
# переменная в глобальном пространстве имён
$::var
# переменная в пространстве имён класса
$classname::var
$::classname::var

Nginx конфигурациясына апаратын жол айнымалыда жатқанымен келісейік $nginx_conf_source. Сонда сынып келесідей болады:

class nginx_example {
    package { 'nginx':
        ensure => installed,
    }
    -> file { '/etc/nginx':
        ensure => directory,
        source => $nginx_conf_source,   # здесь используем переменную вместо фиксированной строки
        recure => true,
        purge  => true,
        force  => true,
    }
    ~> service { 'nginx':
        ensure => running,
        enable => true,
    }
}

node 'server2.testdomain' {
    $nginx_conf_source = 'puppet:///modules/example/nginx-conf'
    include nginx_example
}

Дегенмен, келтірілген мысал нашар, өйткені сыныптың бір жерінде осындай және осындай аты бар айнымалы қолданылатын кейбір «құпия білім» бар. Бұл білімді жалпылау әлдеқайда дұрыс - сыныптарда параметрлер болуы мүмкін.

Класс параметрлері класс аттар кеңістігіндегі айнымалылар болып табылады, олар сынып тақырыбында көрсетіледі және оларды сынып мәтініндегі тұрақты айнымалылар сияқты пайдалануға болады. Параметр мәндері манифестте классты пайдалану кезінде көрсетіледі.

Параметрді әдепкі мәнге орнатуға болады. Егер параметрде әдепкі мән болмаса және мән пайдаланылған кезде орнатылмаса, ол компиляция қатесін тудырады.

Жоғарыдағы мысалдан классты параметрлендірейік және екі параметрді қосамыз: біріншісі, қажет, конфигурацияға апаратын жол, ал екіншісі, nginx бар буманың атауы (мысалы, Debian-да пакеттер бар). nginx, nginx-light, nginx-full).

# переменные описываются сразу после имени класса в круглых скобках
class nginx_example (
  $conf_source,
  $package_name = 'nginx-light', # параметр со значением по умолчанию
) {
  package { $package_name:
    ensure => installed,
  }
  -> file { '/etc/nginx':
    ensure  => directory,
    source  => $conf_source,
    recurse => true,
    purge   => true,
    force   => true,
  }
  ~> service { 'nginx':
    ensure => running,
    enable => true,
  }
}

node 'server2.testdomain' {
  # если мы хотим задать параметры класса, функция include не подойдёт* — нужно использовать resource-style declaration
  # *на самом деле подойдёт, но про это расскажу в следующей серии. Ключевое слово "Hiera".
  class { 'nginx_example':
    conf_source => 'puppet:///modules/example/nginx-conf',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Puppet ішінде айнымалылар теріледі. Тамақ көптеген деректер түрлері. Деректер түрлері әдетте сыныптар мен анықтамаларға берілген параметр мәндерін тексеру үшін пайдаланылады. Өткізілген параметр көрсетілген түрге сәйкес келмесе, компиляция қатесі орын алады.

Түр параметр атауының алдында бірден жазылады:

class example (
  String $param1,
  Integer $param2,
  Array $param3,
  Hash $param4,
  Hash[String, String] $param5,
) {
  ...
}

Сыныптар: сынып атауы және сынып {'сынып атауы':}

Әрбір класс түрдің ресурсы болып табылады сынып. Ресурстың кез келген басқа түрі сияқты, бір түйінде бір сыныптың екі данасы болуы мүмкін емес.

Егер сіз сыныпты бір түйінге екі рет қосуға тырыссаңыз class { 'classname':} (айырмашылығы жоқ, әртүрлі немесе бірдей параметрлермен), компиляция қатесі болады. Бірақ егер сіз сыныпты ресурс стилінде пайдалансаңыз, оның барлық параметрлерін манифестте бірден нақты орнатуға болады.

Дегенмен, егер сіз қолдансаңыз include, содан кейін сыныпты қалағаныңызша қосуға болады. Істің мәні мұнда include класстың каталогқа қосылғанын тексеретін идемпотентті функция. Егер сынып каталогта болмаса, ол оны қосады, ал егер ол бұрыннан бар болса, ол ештеңе жасамайды. Бірақ пайдаланған жағдайда include сыныпты жариялау кезінде сынып параметрлерін орнату мүмкін емес - барлық қажетті параметрлер сыртқы деректер көзінде орнатылуы керек - Hiera немесе ENC. Олар туралы келесі мақалада айтатын боламыз.

Анықтайды

Алдыңғы блокта айтылғандай, бір сынып түйінде бірнеше рет болуы мүмкін емес. Дегенмен, кейбір жағдайларда бір түйінде әртүрлі параметрлері бар бір код блогын пайдалану мүмкіндігі болуы керек. Басқаша айтқанда, өзіндік ресурс түріне қажеттілік бар.

Мысалы, PHP модулін орнату үшін Avito-да келесі әрекеттерді орындаймыз:

  1. Пакетті осы модуль арқылы орнатыңыз.
  2. Осы модуль үшін конфигурация файлын жасайық.
  3. Біз php-fpm конфигурациясына символдық сілтеме жасаймыз.
  4. Біз PHP cli конфигурациясына символдық сілтеме жасаймыз.

Мұндай жағдайларда дизайн, мысалы анықтау (анықтау, анықталған тип, анықталған ресурс түрі). Define классқа ұқсас, бірақ айырмашылықтары бар: біріншіден, әрбір Define ресурс емес, ресурс түрі; екіншіден, әрбір анықтаманың жасырын параметрі болады $title, ресурс атауы жарияланған кезде қайда барады. Сыныптар жағдайындағы сияқты, алдымен анықтаманы сипаттау керек, содан кейін оны қолдануға болады.

РНР модулі бар жеңілдетілген мысал:

define php74::module (
  $php_module_name = $title,
  $php_package_name = "php7.4-${title}",
  $version = 'installed',
  $priority = '20',
  $data = "extension=${title}.son",
  $php_module_path = '/etc/php/7.4/mods-available',
) {
  package { $php_package_name:
    ensure          => $version,
    install_options => ['-o', 'DPkg::NoTriggers=true'],  # триггеры дебиановских php-пакетов сами создают симлинки и перезапускают сервис php-fpm - нам это не нужно, так как и симлинками, и сервисом мы управляем с помощью Puppet
  }
  -> file { "${php_module_path}/${php_module_name}.ini":
    ensure  => $ensure,
    content => $data,
  }
  file { "/etc/php/7.4/cli/conf.d/${priority}-${php_module_name}.ini":
    ensure  => link,
    target  => "${php_module_path}/${php_module_name}.ini",
  }
  file { "/etc/php/7.4/fpm/conf.d/${priority}-${php_module_name}.ini":
    ensure  => link,
    target  => "${php_module_path}/${php_module_name}.ini",
  }
}

node server3.testdomain {
  php74::module { 'sqlite3': }
  php74::module { 'amqp': php_package_name => 'php-amqp' }
  php74::module { 'msgpack': priority => '10' }
}

Көшірме декларациясының қатесін анықтаудың ең оңай жолы - анықтау. Бұл анықтамада тұрақты аты бар ресурс болса және кейбір түйінде осы анықтаманың екі немесе одан да көп даналары болса орын алады.

Бұдан өзіңізді қорғау оңай: анықтамадағы барлық ресурстардың атауына байланысты болуы керек $title. Балама – ресурстарды идемпотентті түрде қосу; қарапайым жағдайда анықтаманың барлық даналарына ортақ ресурстарды бөлек сыныпқа жылжыту және бұл классты анықтамаға қосу жеткілікті - функция include идемпотент.

Ресурстарды қосқанда, атап айтқанда функцияларды пайдалану кезінде импотенттілікке қол жеткізудің басқа жолдары бар defined и ensure_resources, бірақ мен бұл туралы келесі бөлімде айтамын.

Сыныптар мен анықтамалар үшін тәуелділіктер мен хабарландырулар

Сыныптар мен анықтамалар тәуелділіктер мен хабарландыруларды өңдеуге келесі ережелерді қосады:

  • класқа тәуелділік/анықтау класстың/анықтаудың барлық ресурстарына тәуелділіктерді қосады;
  • класс/анықтау тәуелділігі барлық сыныпқа/анықтау ресурстарына тәуелділіктерді қосады;
  • class/define хабарламасы сыныптың/анықтаудың барлық ресурстарын хабарлайды;
  • class/define жазылымы сыныптың/анықтаудың барлық ресурстарына жазылады.

Шартты операторлар және селекторлар

Құжаттар осында.

if

Мұнда қарапайым:

if ВЫРАЖЕНИЕ1 {
  ...
} elsif ВЫРАЖЕНИЕ2 {
  ...
} else {
  ...
}

егер

егер керісінше болса: өрнек жалған болса, код блогы орындалады.

unless ВЫРАЖЕНИЕ {
  ...
}

жағдай

Мұнда да күрделі ештеңе жоқ. Мәндер ретінде тұрақты мәндерді (жолдар, сандар және т.б.), тұрақты өрнектерді және деректер түрлерін пайдалануға болады.

case ВЫРАЖЕНИЕ {
  ЗНАЧЕНИЕ1: { ... }
  ЗНАЧЕНИЕ2, ЗНАЧЕНИЕ3: { ... }
  default: { ... }
}

Селекторлар

Селектор – ұқсас тілдік құрылым case, бірақ код блогын орындаудың орнына ол мәнді қайтарады.

$var = $othervar ? { 'val1' => 1, 'val2' => 2, default => 3 }

Модульдер

Конфигурация кішкентай болғанда, оны бір манифестте оңай сақтауға болады. Бірақ біз неғұрлым көп конфигурацияларды сипаттасақ, манифестте соғұрлым көп сыныптар мен түйіндер бар, ол өседі және онымен жұмыс істеу ыңғайсыз болады.

Сонымен қатар, кодты қайта пайдалану мәселесі бар - барлық код бір манифестте болғанда, бұл кодты басқалармен бөлісу қиын. Осы екі мәселені шешу үшін Қуыршақ модульдер деп аталатын нысанға ие.

Модульдер - бұл бөлек каталогта орналастырылған сыныптар, анықтамалар және басқа қуыршақ нысандары. Басқаша айтқанда, модуль қуыршақ логикасының тәуелсіз бөлігі болып табылады. Мысалы, nginx-пен жұмыс істеуге арналған модуль болуы мүмкін және ол nginx-пен жұмыс істеу үшін не қажет және тек нені қамтиды немесе РНР-мен жұмыс істеуге арналған модуль болуы мүмкін және т.б.

Модульдер нұсқаланған және модульдердің бір-біріне тәуелділігіне де қолдау көрсетіледі. Модульдердің ашық репозиторийі бар - Қуыршақ сарайы.

Қуыршақ серверінде модульдер түбірлік каталогтың модульдер ішкі каталогында орналасқан. Әрбір модульдің ішінде стандартты каталог схемасы бар - манифесттер, файлдар, шаблондар, lib және т.б.

Модульдегі файл құрылымы

Модульдің түбірінде сипаттама атаулары бар келесі каталогтар болуы мүмкін:

  • manifests - онда манифесттер бар
  • files - ол файлдарды қамтиды
  • templates - онда шаблондар бар
  • lib — онда Ruby коды бар

Бұл каталогтар мен файлдардың толық тізімі емес, бірақ бұл мақала үшін әзірше жеткілікті.

Модульдегі ресурстардың атаулары және файлдардың атаулары

Құжаттар осында.

Модульдегі ресурстарды (сыныптар, анықтамалар) қалағаныңызша атауға болмайды. Бұған қоса, ресурс атауы мен Қуыршақ сол ресурстың сипаттамасын іздейтін файл атауы арасында тікелей сәйкестік бар. Егер сіз атау ережелерін бұзсаңыз, қуыршақ ресурс сипаттамасын таба алмайды және сіз құрастыру қатесін аласыз.

Ережелер қарапайым:

  • Модульдегі барлық ресурстар модуль аттар кеңістігінде болуы керек. Егер модуль шақырылса foo, содан кейін ондағы барлық ресурстарды атау керек foo::<anything>, немесе жай foo.
  • Модуль атауы бар ресурс файлда болуы керек init.pp.
  • Басқа ресурстар үшін файлды атау схемасы келесідей:
    • модуль атауы бар префикс жойылады
    • барлық қос нүктелер, егер бар болса, қиғаш сызықтармен ауыстырылады
    • кеңейтім қосылады .pp

Мен мысалмен көрсетемін. Мен модуль жазып жатырмын делік nginx. Ол келесі ресурстарды қамтиды:

  • класс nginx манифестте сипатталған init.pp;
  • класс nginx::service манифестте сипатталған service.pp;
  • анықтау nginx::server манифестте сипатталған server.pp;
  • анықтау nginx::server::location манифестте сипатталған server/location.pp.

үлгілер

Сіз шаблондардың не екенін өзіңіз білесіз, мен оларды бұл жерде егжей-тегжейлі сипаттамаймын. Бірақ мен оны бір жағдайға қалдырамын Википедияға сілтеме.

Үлгілерді пайдалану жолы: Үлгінің мағынасын функция арқылы кеңейтуге болады template, ол үлгіге жол беріледі. Түрдегі ресурстар үшін файл параметрімен бірге қолданылады content. Мысалы, келесідей:

file { '/tmp/example': content => template('modulename/templatename.erb')

Жолды көру <modulename>/<filename> файлды білдіреді <rootdir>/modules/<modulename>/templates/<filename>.

Сонымен қатар, функция бар inline_template — ол файл атауын емес, үлгі мәтінін енгізу ретінде қабылдайды.

Үлгілерде ағымдағы ауқымдағы барлық Қуыршақ айнымалы мәндерін пайдалануға болады.

Қуыршақ ERB және EPP пішіміндегі үлгілерді қолдайды:

ERB туралы қысқаша

Басқару құрылымдары:

  • <%= ВЫРАЖЕНИЕ %> — өрнектің мәнін енгізіңіз
  • <% ВЫРАЖЕНИЕ %> — өрнектің мәнін есептеу (оны кірістірмей). Шартты операторлар (if) және циклдар (әрқайсысы) әдетте осында орналасады.
  • <%# КОММЕНТАРИЙ %>

ERB ішіндегі өрнектер Ruby тілінде жазылған (ERB шын мәнінде енгізілген Ruby).

Манифесттен айнымалы мәндерге қол жеткізу үшін қосу керек @ айнымалы атауына. Басқару құрылымынан кейін пайда болатын жол үзілімін жою үшін жабу тегін пайдалану керек -%>.

Үлгіні пайдалану мысалы

Мен ZooKeeper басқару модулін жазып жатырмын делік. Конфигурацияны жасауға жауапты класс келесідей көрінеді:

class zookeeper::configure (
  Array[String] $nodes,
  Integer $port_client,
  Integer $port_quorum,
  Integer $port_leader,
  Hash[String, Any] $properties,
  String $datadir,
) {
  file { '/etc/zookeeper/conf/zoo.cfg':
    ensure  => present,
    content => template('zookeeper/zoo.cfg.erb'),
  }
}

Және сәйкес үлгі zoo.cfg.erb - Сонымен:

<% if @nodes.length > 0 -%>
<% @nodes.each do |node, id| -%>
server.<%= id %>=<%= node %>:<%= @port_leader %>:<%= @port_quorum %>;<%= @port_client %>
<% end -%>
<% end -%>

dataDir=<%= @datadir %>

<% @properties.each do |k, v| -%>
<%= k %>=<%= v %>
<% end -%>

Фактілер және кірістірілген айнымалылар

Көбінесе конфигурацияның нақты бөлігі түйінде не болып жатқанына байланысты. Мысалы, Debian шығарылымына байланысты пакеттің бір немесе басқа нұсқасын орнату керек. Мұның бәрін қолмен бақылай аласыз, түйіндер өзгерсе, манифесттерді қайта жаза аласыз. Бірақ бұл маңызды тәсіл емес, автоматтандыру әлдеқайда жақсы.

Түйіндер туралы ақпаратты алу үшін қуыршақ фактілер деп аталатын механизмге ие. Фактілер - бұл жаһандық аттар кеңістігіндегі қарапайым айнымалылар түріндегі манифесттерде қолжетімді түйін туралы ақпарат. Мысалы, хост атауы, операциялық жүйе нұсқасы, процессор архитектурасы, пайдаланушылар тізімі, желі интерфейстерінің тізімі және олардың мекенжайлары және т.б. Фактілер манифесттер мен үлгілерде тұрақты айнымалылар ретінде қолжетімді.

Фактілермен жұмыс істеу мысалы:

notify { "Running OS ${facts['os']['name']} version ${facts['os']['release']['full']}": }
# ресурс типа notify просто выводит сообщение в лог

Ресми түрде айтқанда, фактінің аты (жолы) және мәні бар (әртүрлі түрлері бар: жолдар, массивтер, сөздіктер). Тамақ кірістірілген фактілер жиынтығы. Өзіңіз де жаза аласыз. Факт жинаушылар сипатталған Ruby-дегі функциялар сияқты, немесе екеуі де орындалатын файлдар. Фактілер нысанда да ұсынылуы мүмкін деректері бар мәтіндік файлдар түйіндерде.

Жұмыс барысында қуыршақ агенті алдымен паппесерверден түйінге барлық қолда бар фактілерді жинағыштарды көшіреді, содан кейін ол оларды іске қосады және жиналған фактілерді серверге жібереді; Осыдан кейін сервер каталогты құрастыра бастайды.

Орындалатын файлдар түріндегі фактілер

Мұндай фактілер каталогтағы модульдерде орналастырылған facts.d. Әрине, файлдар орындалатын болуы керек. Іске қосылған кезде олар ақпаратты стандартты шығысқа YAML немесе кілт=мән пішімінде шығаруы керек.

Фактілер модульіңіз орналастырылған қалқымалы сервер басқаратын барлық түйіндерге қолданылатынын ұмытпаңыз. Сондықтан, сценарийде жүйеде сіздің жұмысыңыз үшін қажетті барлық бағдарламалар мен файлдардың бар-жоғын тексеріңіз.

#!/bin/sh
echo "testfact=success"
#!/bin/sh
echo '{"testyamlfact":"success"}'

Рубин фактілері

Мұндай фактілер каталогтағы модульдерде орналастырылған lib/facter.

# всё начинается с вызова функции Facter.add с именем факта и блоком кода
Facter.add('ladvd') do
# в блоках confine описываются условия применимости факта — код внутри блока должен вернуть true, иначе значение факта не вычисляется и не возвращается
  confine do
    Facter::Core::Execution.which('ladvdc') # проверим, что в PATH есть такой исполняемый файл
  end
  confine do
    File.socket?('/var/run/ladvd.sock') # проверим, что есть такой UNIX-domain socket
  end
# в блоке setcode происходит собственно вычисление значения факта
  setcode do
    hash = {}
    if (out = Facter::Core::Execution.execute('ladvdc -b'))
      out.split.each do |l|
        line = l.split('=')
        next if line.length != 2
        name, value = line
        hash[name.strip.downcase.tr(' ', '_')] = value.strip.chomp(''').reverse.chomp(''').reverse
      end
    end
    hash  # значение последнего выражения в блоке setcode является значением факта
  end
end

Мәтіндік фактілер

Мұндай фактілер каталогтың түйіндеріне орналастырылады /etc/facter/facts.d ескі қуыршақ немесе /etc/puppetlabs/facts.d жаңа қуыршақта.

examplefact=examplevalue
---
examplefact2: examplevalue2
anotherfact: anothervalue

Фактілерге жету

Фактілерге жақындаудың екі жолы бар:

  • сөздік арқылы $facts: $facts['fqdn'];
  • факт атауын айнымалы атауы ретінде пайдалану: $fqdn.

Сөздікті пайдаланған дұрыс $facts, немесе одан да жақсысы, жаһандық аттар кеңістігін көрсетіңіз ($::facts).

Мұнда құжаттаманың тиісті бөлімі берілген.

Кірістірілген айнымалылар

Фактілерден басқа, бар кейбір айнымалылар, жаһандық аттар кеңістігінде қолжетімді.

  • сенімді фактілер — клиент сертификатынан алынатын айнымалы мәндер (сертификат әдетте poppet серверінде шығарылатындықтан, агент оның сертификатын жай ғана алып, өзгерте алмайды, сондықтан айнымалылар «сенімді» болып табылады): сертификат атауы, сертификат атауы хост пен домен, сертификаттағы кеңейтімдер.
  • сервер фактілері —сервер туралы ақпаратқа қатысты айнымалылар—нұсқа, аты, сервердің IP мекенжайы, орта.
  • агент фактілері — фактор бойынша емес, тікелей қуыршақ-агент арқылы қосылған айнымалылар — сертификат атауы, агент нұсқасы, қуыршақ нұсқасы.
  • негізгі айнымалылар - Pappetmaster айнымалылары (sic!). Бұл шамамен бірдей сервер фактілері, плюс конфигурация параметрінің мәндері қол жетімді.
  • компилятор айнымалылары — әр ауқымда ерекшеленетін компилятордың айнымалылары: ағымдағы модульдің аты және ағымдағы объектіге қол жеткізілген модульдің аты. Оларды, мысалы, жеке сыныптарыңыздың басқа модульдерден тікелей пайдаланылмауын тексеру үшін пайдалануға болады.

1-қосымша: мұның бәрін қалай іске қосуға және жөндеуге болады?

Мақалада қуыршақ кодының көптеген мысалдары бар, бірақ бұл кодты қалай іске қосу керектігі бізге мүлдем айтылмады. Жарайды, мен өзімді түзеп жатырмын.

Қуыршақты іске қосу үшін агент жеткілікті, бірақ көп жағдайда сізге сервер қажет болады.

Агент

Кем дегенде XNUMX нұсқасынан бастап қуыршақ-агент пакеттері ресми Puppetlabs репозиторийі барлық тәуелділіктерді (рубин және сәйкес асыл тастар) қамтиды, сондықтан орнату қиындықтары жоқ (мен Debian негізіндегі дистрибутивтер туралы айтып отырмын - біз RPM негізіндегі дистрибутивтерді пайдаланбаймыз).

Ең қарапайым жағдайда қуыршақ конфигурациясын пайдалану үшін агентті серверсіз режимде іске қосу жеткілікті: егер қуыршақ коды түйінге көшірілген болса, іске қосыңыз. puppet apply <путь к манифесту>:

atikhonov@atikhonov ~/puppet-test $ cat helloworld.pp 
node default {
    notify { 'Hello world!': }
}
atikhonov@atikhonov ~/puppet-test $ puppet apply helloworld.pp 
Notice: Compiled catalog for atikhonov.localdomain in environment production in 0.01 seconds
Notice: Hello world!
Notice: /Stage[main]/Main/Node[default]/Notify[Hello world!]/message: defined 'message' as 'Hello world!'
Notice: Applied catalog in 0.01 seconds

Әрине, серверді орнатып, агенттерді демон режимінде түйіндерде іске қосқан дұрыс - содан кейін олар жарты сағат сайын серверден жүктелген конфигурацияны қолданады.

Сіз жұмыстың итермелейтін үлгісіне еліктей аласыз - сізді қызықтыратын түйінге өтіп, бастаңыз sudo puppet agent -t. Кілт -t (--test) жеке қосуға болатын бірнеше опцияны қамтиды. Бұл опцияларға мыналар кіреді:

  • демон режимінде жұмыс істемеу (әдепкі бойынша агент демон режимінде іске қосылады);
  • каталогты қолданғаннан кейін өшіру (әдепкі бойынша агент жұмысын жалғастырады және жарты сағат сайын конфигурацияны қолданады);
  • егжей-тегжейлі жұмыс журналын жазу;
  • файлдардағы өзгерістерді көрсету.

Агентте өзгеріссіз жұмыс режимі бар - оны дұрыс конфигурацияны жазғаныңызға сенімді болмасаңыз және жұмыс кезінде агент нақты нені өзгертетінін тексергіңіз келген кезде пайдалануға болады. Бұл режим параметр арқылы қосылады --noop пәрмен жолында: sudo puppet agent -t --noop.

Бұған қоса, жұмыстың жөндеу журналын қосуға болады - онда қуыршақ ол орындайтын барлық әрекеттер туралы жазады: қазіргі уақытта өңделетін ресурс туралы, осы ресурстың параметрлері туралы, қандай бағдарламаларды іске қосатыны туралы. Әрине, бұл параметр --debug.

Сервер

Мен осы мақалада паппетсерверді толық орнатуды және оған кодты енгізуді қарастырмаймын; тек қораптан тыс сервердің аз ғана санмен жұмыс істеу үшін қосымша конфигурацияны қажет етпейтін толық функционалды нұсқасы бар екенін айтқым келеді. түйіндер (айталық, жүзге дейін). Түйіндердің көбірек саны баптауды қажет етеді - әдепкі бойынша қуыршақ сервері төрт жұмысшыдан аспайды, жоғары өнімділік үшін олардың санын көбейту керек және жад шектеулерін ұлғайтуды ұмытпаңыз, әйтпесе сервер көп уақытты қоқыс жинайды.

Кодты орналастыру - егер сізге тез және оңай қажет болса, қараңыз (r10k бойынша)[https://github.com/puppetlabs/r10k], шағын қондырғылар үшін бұл жеткілікті болуы керек.

2-қосымша: Кодтау бойынша нұсқаулар

  1. Барлық логиканы класстар мен анықтамаларға орналастырыңыз.
  2. Сыныптар мен анықтамаларды түйіндерді сипаттайтын манифесттерде емес, модульдерде сақтаңыз.
  3. Фактілерді қолданыңыз.
  4. Хост атауларына негізделген if файлдарын жасамаңыз.
  5. Сыныптар мен анықтамалар үшін параметрлерді қосудан тартынбаңыз - бұл сынып/анықтаманың мәтінінде жасырылған жасырын логикаға қарағанда жақсы.

Мен мұны неліктен ұсынатынымды келесі мақалада түсіндіремін.

қорытынды

Кіріспе сөзбен аяқтайық. Келесі мақалада мен Hiera, ENC және PuppetDB туралы айтып беремін.

Сауалнамаға тек тіркелген пайдаланушылар қатыса алады. Кіру, өтінемін.

Шындығында, әлдеқайда көп материал бар - мен келесі тақырыптар бойынша мақалалар жаза аламын, сіз не туралы оқығыңыз келетініне дауыс бере аламын:

  • 59,1%Жетілдірілген қуыршақ конструкциялары - келесі деңгейдің кейбір қателері: ілмектер, карталау және басқа лямбда өрнектері, ресурс жинаушылар, экспортталған ресурстар және Қуыршақ арқылы хост аралық байланыс, тегтер, провайдерлер, дерексіз деректер түрлері.13
  • 31,8%«Мен анамның әкімшісімін» немесе біз Авитода әртүрлі нұсқалардың бірнеше қалқымалы серверлерімен қалай достасамыз және, негізінен, қалқымалы серверді басқару туралы бөлім.7
  • 81,8%Қуыршақ кодын қалай жазамыз: аспаптар, құжаттама, тестілеу, CI/CD.18

22 қолданушы дауыс берді. 9 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com