Муқаддима ба лӯхтак

Puppet як системаи идоракунии конфигуратсия аст. Он барои овардани мизбонҳо ба ҳолати дилхоҳ ва нигоҳ доштани ин ҳолат истифода мешавад.

Ман зиёда аз панҷ сол аст, ки бо Puppet кор мекунам. Ин матн аслан маҷмӯаи тарҷумашуда ва аз нав тартибдодашудаи нуктаҳои асосии ҳуҷҷатҳои расмӣ мебошад, ки ба шурӯъкунандагон имкон медиҳад, ки моҳияти лӯхтакро зуд дарк кунанд.

Муқаддима ба лӯхтак

Маълумоти асосӣ

Системаи оператсионии Puppet муштарӣ-сервер аст, гарчанде он инчунин амалиёти бе серверро бо функсияҳои маҳдуд дастгирӣ мекунад.

Модели кашидани амалиёт истифода мешавад: ба таври нобаёнӣ, дар ҳар ним соат як маротиба муштариён барои конфигуратсия бо сервер тамос мегиранд ва онро татбиқ мекунанд. Агар шумо бо Ansible кор карда бошед, пас онҳо модели дигари push истифода мебаранд: администратор раванди татбиқи конфигуратсияро оғоз мекунад, худи муштариён чизеро татбиқ намекунанд.

Ҳангоми алоқаи шабакавӣ рамзгузории дуҷонибаи TLS истифода мешавад: сервер ва муштарӣ калидҳои хусусии худро ва сертификатҳои мувофиқ доранд. Одатан сервер барои муштариён сертификатҳо медиҳад, аммо дар асл истифодаи CA-и беруна имконпазир аст.

Муқаддима ба манифестҳо

Дар истилоҳоти лӯхтак ба сервери лӯхтак пайваст кардан гиреҳҳо (гиреҳҳо). Конфигуратсия барои гиреҳҳо навишта шудааст дар манифестхо бо забони махсуси барномасозӣ - Puppet DSL.

Puppet DSL забони декларативист. Он ҳолати дилхоҳи гиреҳро дар шакли эъломияҳои захираҳои инфиродӣ тавсиф мекунад, масалан:

  • Файл вуҷуд дорад ва он мундариҷаи мушаххас дорад.
  • Баста насб карда шудааст.
  • Хизматрасонӣ оғоз шуд.

Манбаъҳоро метавон бо ҳам пайваст кард:

  • Вобастагӣ вуҷуд дорад, онҳо ба тартиби истифодаи захираҳо таъсир мерасонанд.
    Масалан, "аввал бастаро насб кунед, пас файли конфигуратсияро таҳрир кунед, сипас хидматро оғоз кунед."
  • Огоҳиҳо мавҷуданд - агар манба тағир дода бошад, он ба захираҳои ба он обунашуда огоҳинома мефиристад.
    Масалан, агар файли конфигуратсия тағир ёбад, шумо метавонед хидматро ба таври худкор бозоғоз намоед.

Илова бар ин, Puppet DSL дорои функсияҳо ва тағирёбандаҳо, инчунин изҳороти шартӣ ва селекторҳо мебошад. Механизмҳои гуногуни шаблонсозӣ низ дастгирӣ мешаванд - EPP ва ERB.

Лӯхтак бо забони руби навишта шудааст, бинобар ин бисёре аз конструксияҳо ва истилоҳот аз он ҷо гирифта шудаанд. Ruby ба шумо имкон медиҳад, ки Puppet -ро васеъ кунед - мантиқи мураккаб, намудҳои нави захираҳо, функсияҳоро илова кунед.

Ҳангоме ки Puppet кор мекунад, манифестҳо барои ҳар як гиреҳи мушаххас дар сервер ба директория тартиб дода мешаванд. директорӣ рӯйхати захираҳо ва муносибатҳои онҳо пас аз ҳисоб кардани арзиши функсияҳо, тағирёбандаҳо ва тавсеаи изҳороти шартӣ мебошад.

Синтаксис ва услуби код

Дар ин ҷо бахшҳои ҳуҷҷатҳои расмӣ ҳастанд, ки ба шумо дар фаҳмидани синтаксис кӯмак мекунанд, агар мисолҳои пешниҳодшуда кофӣ набошанд:

Ин аст мисоли он, ки манифест чӣ гуна аст:

# Комментарии пишутся, как и много где, после решётки.
#
# Описание конфигурации ноды начинается с ключевого слова 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 }).
  • Тирчаҳо дар параметрҳо бояд дар як сатҳ бошанд.
  • Дар пеши онҳо тирҳои муносибатҳои захиравӣ навишта шудаанд.

Ҷойгиршавии файлҳо дар pappetserver

Барои тавзеҳи минбаъда ман мафҳуми «директорияи решавӣ»-ро пешниҳод мекунам. Феҳристи решавӣ директорияест, ки конфигуратсияи лӯхтакро барои гиреҳи мушаххас дар бар мегирад.

Феҳристи реша вобаста ба версияи Puppet ва муҳитҳои истифодашуда фарқ мекунад. Муҳитҳо маҷмӯи мустақили конфигуратсияҳо мебошанд, ки дар директорияҳои алоҳида нигоҳ дошта мешаванд. Одатан дар якҷоягӣ бо git истифода мешавад, ки дар ин ҳолат муҳитҳо аз шохаҳои git сохта мешаванд. Мувофиқи он, ҳар як гиреҳ дар ин ё он муҳит ҷойгир аст. Инро дар худи гиреҳ ё дар ENC танзим кардан мумкин аст, ки ман дар бораи он дар мақолаи оянда сӯҳбат хоҳам кард.

  • Дар версияи сеюм ("Puppet кӯҳна") феҳристи асосӣ буд /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-и маҳаллӣ дар гиреҳ истифода мешавад)
  • ҳадаф — он ҷое, ки пайванди рамзӣ бояд ишора кунад (якҷоя бо мазмуни ё сарчашма)
  • соҳиби — корбаре, ки бояд файлро соҳиб бошад
  • гурӯҳ — гурӯҳе, ки файл бояд ба он тааллуқ дошта бошад
  • ҳолати - иҷозатҳои файл (ҳамчун сатр)
  • такрор кардан - коркарди рекурсивии феҳристҳоро имкон медиҳад
  • тоза кунед - имкон медиҳад, ки файлҳои дар Puppet тавсиф нашудаанд
  • эътибор - имкон медиҳад, ки директорияҳое, ки дар Puppet тавсиф нашудаанд, нест карда шаванд

Маҷмӯъ

Бастаҳоро насб ва хориҷ мекунад. Қодир ба коркарди огоҳиҳо - бастаро аз нав насб мекунад, агар параметр муайян карда шавад 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 — autorun ғайрифаъол аст (systemctl disable)
  • оғози дубора - фармон барои аз нав оғоз кардани хидмат
  • њолати — фармон барои санҷидани ҳолати хидмат
  • аз нав оғоз кардан — нишон диҳед, ки оё initscript хадамот бозоғозиро дастгирӣ мекунад. Агар false ва параметр муайян карда мешавад оғози дубора — арзиши ин параметр истифода мешавад. Агар false ва параметр оғози дубора муайян нашудааст - хадамот қатъ карда мешавад ва аз нав оғоз мешавад (аммо systemd фармонро истифода мебарад systemctl restart).
  • ҳолати — нишон диҳед, ки оё хидмати initscript фармонро дастгирӣ мекунад status. Агар false, пас арзиши параметр истифода мешавад њолати. Пешфарз true.

exec

Фармонҳои берунаро иҷро мекунад. Агар шумо параметрҳоро муайян накунед эҷод мекунад, танҳо агар, агар ё навоварона, фармон ҳар дафъае, ки Puppet иҷро мешавад, иҷро мешавад. Қодир ба коркарди огоҳиҳо - фармонро иҷро мекунад.

Параметрҳо:

  • номи манбаъ — фармони иҷрошаванда (ихтиёрӣ)
  • фармоиш — фармони иҷрошаванда (агар он дар ном нишон дода нашуда бошад)
  • роҳ — роҳҳое, ки дар онҳо файли иҷрошавандаро ҷустуҷӯ мекунанд
  • танҳо агар — агар фармони дар ин параметр нишондодашуда бо рамзи бозгашти сифр анҷом дода шавад, фармони асосӣ иҷро мешавад
  • агар — агар фармони дар ин параметр нишондодашуда бо рамзи бозгашти ғайри сифр анҷом дода шавад, фармони асосӣ иҷро мешавад
  • эҷод мекунад — агар файли дар ин параметр нишондодашуда мавҷуд набошад, фармони асосӣ иҷро мешавад
  • навоварона - агар а true, пас фармон танҳо вақте иҷро мешавад, ки ин иҷрокунанда огоҳиномаро аз дигар захираҳо мегирад
  • cwd — феҳрист, ки аз он фармон иҷро карда мешавад
  • истифода — корбаре, ки аз он фармонро иҷро кунад
  • провайдери - чӣ тавр иҷро кардани фармон:
    • Паёмҳо — процесси кудакй оддй сохта шудааст, хатман муайян намоед роҳ
    • пӯст - фармон дар снаряд ба кор андохта мешавад /bin/sh, муайян кардан мумкин нест роҳ, шумо метавонед globbing, қубурҳо ва дигар хусусиятҳои ниҳонӣ истифода баред. Одатан ба таври худкор дар сурати мавҷуд будани аломатҳои махсус (|, ;, &&, || ғайра).

cron

cronjobs назорат мекунад.

Параметрҳо:

  • номи манбаъ - танҳо як намуди муайянкунанда
  • таъмин - ҳолати тоҷ:
    • present - эҷод кунед, агар вуҷуд надошта бошад
    • absent - агар мавҷуд бошад, нест кунед
  • фармоиш - кадом фармонро иҷро кардан
  • муҳит — дар кадом муҳит иҷро кардани фармон (рӯйхати тағирёбандаҳои муҳити зист ва арзишҳои онҳо тавассути =)
  • истифода — фармонро аз кадом корбар иҷро кардан лозим аст
  • лаҳза, соат, рӯзи корӣ, моҳ, моҳона — кай кор кардан cron. Агар яке аз ин атрибутҳо муайян нашуда бошад, арзиши он дар crontab хоҳад буд *.

Дар Puppet 6.0 cron мисли он буд аз қуттӣ хориҷ карда шуд дар puppetserver, бинобар ин дар сайти умумӣ ягон ҳуҷҷат вуҷуд надорад. Аммо вай дар қуттӣ аст дар лӯхтак-агент, аз ин рӯ лозим нест, ки онро алоҳида насб кунед. Шумо метавонед ҳуҷҷатҳои онро бубинед дар ҳуҷҷатҳо барои версияи панҷуми Puppet, ё дар GitHub.

Дар бораи захирахо умуман

Талабот ба ягонагии захираҳо

Хатои маъмултарини мо ин аст Эъломияи такрорӣ. Ин хато вақте рух медиҳад, ки ду ё зиёда захираҳои як навъ бо як ном дар директория пайдо мешаванд.

Аз ин рӯ, ман боз менависам: манифестҳо барои як гиреҳ набояд дорои захираҳои як навъ бо унвони якхела бошанд!

Баъзан зарурати насб кардани бастаҳо бо як ном, вале бо менеҷерони бастаҳои гуногун вуҷуд дорад. Дар ин ҳолат, шумо бояд параметрро истифода баред nameбарои пешгирӣ кардани хатогӣ:

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

Намудҳои дигари захираҳо дорои имконоти шабеҳ барои пешгирӣ кардани такрорӣ мебошанд - name у хизматрасонӣ, command у exec, ва ғайра.

Метапараметрҳо

Ҳар як намуди захираҳо, новобаста аз хусусияти он, баъзе параметрҳои махсус доранд.

Рӯйхати пурраи параметрҳои мета дар ҳуҷҷатҳои Puppet.

Рӯйхати кӯтоҳ:

  • талаб мекунад — ин параметр нишон медихад, ки ин ресурс ба кадом захирахо вобаста аст.
  • пеш аз - Ин параметр муайян мекунад, ки кадом захираҳо аз ин манбаъ вобастаанд.
  • Обуна — ин параметр муайян мекунад, ки ин манбаъ аз кадом манбаъҳо огоҳинома мегирад.
  • хабар диҳед — Ин параметр муайян мекунад, ки кадом захираҳо аз ин манбаъ огоҳинома мегиранд.

Ҳама метапараметрҳои номбаршуда як истиноди ягонаи манбаъ ё массиви истинодҳоро дар қавсҳои мураббаъ қабул мекунанд.

Пайвандҳо ба захираҳо

Истиноди манбаъ танҳо зикри манбаъ аст. Онҳо асосан барои нишон додани вобастагӣ истифода мешаванд. Истинод ба манбаи мавҷуда боиси хатогиҳои ҷамъоварӣ мегардад.

Синтаксиси истинод чунин аст: навъи манбаъ бо ҳарфи калон (агар номи намуд дорои ду вергули дукарата бошад, пас ҳар як қисми ном байни қавсҳо калон аст), пас номи манбаъ дар қавси мураббаъ (ҳолати ном тағир намеёбад!). Ҳеҷ гуна фосила набояд бошад; қавсҳои квадратӣ фавран пас аз номи намуд навишта мешаванд.

Мисол:

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

Вобастагӣ ва огоҳиҳо

Ҳуҷҷатҳо дар ин ҷо.

Тавре ки қаблан гуфта шуд, вобастагии оддии байни захираҳо гузаранда мебошанд. Дар омади гап, ҳангоми илова кардани вобастагӣ эҳтиёт шавед - шумо метавонед вобастагиҳои даврӣ эҷод кунед, ки боиси хатогии компиляция мегардад.

Баръакси вобастагӣ, огоҳиҳо гузаранда нестанд. Барои огоҳинома қоидаҳои зерин татбиқ мешаванд:

  • Агар манбаъ огоҳинома гирад, он нав карда мешавад. Амалҳои навсозӣ аз намуди захираҳо вобастаанд - exec фармонро иҷро мекунад, хизматрасонӣ хидматро аз нав оғоз мекунад, Маҷмӯъ бастаро аз нав насб мекунад. Агар манбаъ амали навсозӣ муайян карда нашавад, ҳеҷ чиз рӯй намедиҳад.
  • Дар давоми як даври лӯхтак, захира на бештар аз як маротиба нав карда мешавад. Ин имконпазир аст, зеро огоҳиҳо вобастагиҳоро дар бар мегиранд ва графики вобастагӣ давраҳоро дар бар намегирад.
  • Агар лӯхтак ҳолати захираро тағир диҳад, манбаъ ба ҳамаи захираҳои ба он обунашуда огоҳинома мефиристад.
  • Агар захира навсозӣ шавад, он ба ҳамаи захираҳои ба он обунашуда огоҳинома мефиристад.

Мубориза бо параметрҳои номаълум

Одатан, агар ягон параметри захиравӣ арзиши пешфарз надошта бошад ва ин параметр дар манифест нишон дода нашуда бошад, пас Puppet ин хосиятро барои манбаи мувофиқ дар гиреҳ тағир намедиҳад. Масалан, агар манбаи навъи файл параметр муайян карда нашудааст owner, пас Puppet соҳиби файли мувофиқро тағир намедиҳад.

Муқаддима ба синфҳо, тағирёбандаҳо ва таърифҳо

Фарз мекунем, ки мо якчанд гиреҳ дорем, ки як қисми конфигуратсияро доранд, аммо фарқиятҳо низ мавҷуданд - вагарна мо метавонем ҳамаашро дар як блок тавсиф кунем. node {}. Албатта, шумо метавонед танҳо қисмҳои якхелаи конфигуратсияро нусхабардорӣ кунед, аммо дар маҷмӯъ ин ҳалли бад аст - конфигуратсия афзоиш меёбад ва агар шумо қисми умумии конфигуратсияро тағир диҳед, шумо бояд ҳамон чизро дар бисёр ҷойҳо таҳрир кунед. Дар айни замон, хато кардан осон аст ва дар маҷмӯъ, принсипи DRY (худро такрор накунед) бо як сабаб ихтироъ шудааст.

Барои ҳалли ин мушкилот чунин тарҳ вуҷуд дорад класс.

Саволҳо

Синф блоки номдори рамзи попет аст. Барои дубора истифода бурдани код синфҳо лозиманд.

Пеш аз ҳама синфро тавсиф кардан лозим аст. Худи тавсиф ягон захираро дар ягон ҷо илова намекунад. Синф дар манифестҳо тасвир шудааст:

# Описание класса начинается с ключевого слова 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 бо ҳама гуна конфигуратсия истифода шавад.

Ин метавонад иҷро шавад бо истифода аз тағирёбандаҳо.

Диққат: тағирёбандаҳо дар Puppet тағирнопазиранд!

Илова бар ин, ба тағирёбанда танҳо пас аз эълон шудани он дастрас шудан мумкин аст, вагарна арзиши тағирёбанда 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,
) {
  ...
}

Синфҳо: номи синф ва синфро дар бар мегиранд{'classname':}

Ҳар як синф як манбаи намуд аст синф. Мисли ҳама гуна дигар захираҳо, дар як гиреҳ ду мисоли як синф буда наметавонанд.

Агар шумо кӯшиш кунед, ки синфро ба як гиреҳ ду маротиба илова кунед class { 'classname':} (ҳеҷ тафовут, бо параметрҳои гуногун ё якхела), хатои тартибдиҳӣ вуҷуд хоҳад дошт. Аммо агар шумо синфро дар услуби манбаъ истифода баред, шумо метавонед фавран ҳамаи параметрҳои онро дар манифест муқаррар кунед.

Аммо, агар шумо истифода баред include, он гоҳ синфро ҳар қадар, ки мехоҳед, илова кардан мумкин аст. Гап дар сари он аст include функсияи idempotent аст, ки тафтиш мекунад, ки оё синф ба директория илова карда шудааст. Агар синф дар директория набошад, онро илова мекунад ва агар он аллакай вуҷуд дошта бошад, ҳеҷ кор намекунад. Аммо дар сурати истифода бурдан include Шумо наметавонед параметрҳои синфро ҳангоми эъломияи синф муқаррар кунед - ҳамаи параметрҳои зарурӣ бояд дар манбаи додаҳои беруна - Hiera ё ENC муқаррар карда шаванд. Мо дар бораи онҳо дар мақолаи навбатӣ сӯҳбат хоҳем кард.

Муайян мекунад

Тавре ки дар блоки қаблӣ гуфта шуда буд, як синф наметавонад дар гиреҳ зиёда аз як маротиба ҳузур дошта бошад. Аммо, дар баъзе мавридҳо ба шумо лозим аст, ки як блоки кодро бо параметрҳои гуногун дар як гиреҳ истифода баред. Ба ибораи дигар, зарурати як намуди захираҳои худ вуҷуд дорад.

Масалан, барои насб кардани модули PHP, мо дар Avito амалҳои зеринро иҷро мекунем:

  1. Бастаро бо ин модул насб кунед.
  2. Биёед барои ин модул файли конфигуратсия эҷод кунем.
  3. Мо ба конфигуратсия барои php-fpm пайванди рамзӣ эҷод мекунем.
  4. Мо ба конфигуратсия барои php cli пайванди рамзӣ эҷод мекунем.

Дар чунин мавридҳо тарҳрезӣ ба монанди муайян (муайян кардан, навъи муайян, навъи захираҳои муайян). Муайянкунӣ ба синф шабоҳат дорад, аммо фарқиятҳо мавҷуданд: аввал, ҳар як Муайянкунӣ як намуди захира аст, на манбаъ; дуюм, ҳар як таъриф дорои параметри номуайян аст $title, вақте ки он эълон мешавад, номи манбаъ ба куҷо меравад. Ҳамон тавре ки дар мавриди синфҳо, аввал бояд таъриф тавсиф карда шавад, ки пас аз он метавон онро истифода бурд.

Намунаи соддакардашуда бо модул барои PHP:

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 обуна ба ҳамаи захираҳои синф/define обуна мешавад.

Изҳороти шартӣ ва интихобкунандагон

Ҳуҷҷатҳо дар ин ҷо.

if

Ин ҷо оддӣ аст:

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

агар

агар дар баръакс набошад: блоки код, агар ифода нодуруст бошад, иҷро карда мешавад.

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

мавриди

Дар ин ҷо низ ҳеҷ чизи мураккаб нест. Шумо метавонед арзишҳои муқаррариро (сатрҳо, рақамҳо ва ғ.), ифодаҳои муқаррарӣ ва намудҳои маълумотро ҳамчун арзиш истифода баред.

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

Интихобкунандагон

Селектор як сохтори забонест, ки ба он монанд аст case, аммо ба ҷои иҷрои блоки код, он арзишро бармегардонад.

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

Модулҳо

Вақте ки конфигуратсия хурд аст, он метавонад ба осонӣ дар як манифест нигоҳ дошта шавад. Аммо чӣ қадаре ки мо конфигуратсияҳоро бештар тасвир кунем, ҳамон қадар дар манифест синфҳо ва гиреҳҳо зиёданд, он афзоиш меёбад ва кор бо он нороҳат мешавад.

Илова бар ин, мушкилоти такрории код вуҷуд дорад - вақте ки ҳамаи рамзҳо дар як манифест ҳастанд, мубодилаи ин код бо дигарон душвор аст. Барои ҳалли ин ду мушкилот, Puppet дорои як объект бо номи модулҳо мебошад.

Модулҳо - инҳо маҷмӯи синфҳо, таърифҳо ва дигар объектҳои лӯхтак мебошанд, ки дар феҳристи алоҳида ҷойгир карда шудаанд. Ба ибораи дигар, модул як ҷузъи мустақили мантиқи лӯхтак аст. Масалан, модули кор бо nginx вуҷуд дошта метавонад ва он дорои он чизест, ки барои кор бо nginx чӣ ва танҳо он чизест, ки барои кор бо nginx лозим аст ё модул барои кор бо PHP вуҷуд дорад ва ғайра.

Модулҳо нусхабардорӣ карда мешаванд ва вобастагии модулҳо аз ҳамдигар низ дастгирӣ карда мешаванд. Анбори кушодаи модулҳо мавҷуд аст - Огоҳии лӯхтак.

Дар сервери лӯхтак модулҳо дар зеркаталоги модулҳои директорияи реша ҷойгиранд. Дар дохили хар як модул схемаи каталоги стандарти - манифестхо, файлхо, шаблонхо, lib ва гайра мавчуд аст.

Сохтори файл дар модул

Решаи модул метавонад директорияҳои зеринро бо номҳои тавсифӣ дар бар гирад:

  • manifests — манифестро дарбар мегирад
  • files - он дорои файлҳо
  • templates - он дорои қолабҳо
  • lib — он рамзи Ruby дорад

Ин рӯйхати пурраи директорияҳо ва файлҳо нест, аммо барои ин мақола ҳоло кофӣ аст.

Номҳои захираҳо ва номи файлҳо дар модул

Ҳуҷҷатҳо дар ин ҷо.

Манбаъҳоро (синфҳо, таърифҳо) дар модул бо ҳар чизе ки ба шумо маъқул номгузорӣ кардан мумкин нест. Илова бар ин, байни номи манбаъ ва номи файле, ки дар он Puppet тавсифи ин манбаъро ҷустуҷӯ мекунад, мукотибаи мустақим вуҷуд дорад. Агар шумо қоидаҳои номгузориро вайрон кунед, он гоҳ Puppet танҳо тавсифи манбаъро намеёбад ва шумо хатои ҷамъоварӣ мегиред.

Қоидаҳо оддӣ мебошанд:

  • Ҳама захираҳо дар модул бояд дар фазои номи модул бошанд. Агар модул даъват карда шавад 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 — он матни қолабро ҳамчун вуруд қабул мекунад, на номи файл.

Дар доираи қолибҳо, шумо метавонед ҳамаи тағирёбандаҳои лӯхтакро дар доираи ҷорӣ истифода баред.

Puppet қолибҳоро дар формати ERB ва EPP дастгирӣ мекунад:

Мухтасар дар бораи ERB

Сохторҳои назорат:

  • <%= ВЫРАЖЕНИЕ %> — арзиши ифодаро дохил кунед
  • <% ВЫРАЖЕНИЕ %> — арзиши ифодаро ҳисоб кунед (бе ворид кардани он). Одатан, изҳороти шартӣ (агар) ва ҳалқаҳо (ҳар як) одатан ба ин ҷо меоянд.
  • <%# КОММЕНТАРИЙ %>

Ифодаҳо дар ERB дар Ruby навишта шудаанд (ERB воқеан Embedded 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 ё формати калид=арзиш бароранд.

Фаромӯш накунед, ки далелҳо ба ҳама гиреҳҳое дахл доранд, ки аз ҷониби сервери poppet идора карда мешаванд, ки модули шумо дар он ҷойгир карда шудааст. Аз ин рӯ, дар скрипт ғамхорӣ кунед, ки система дорои тамоми барномаҳо ва файлҳои зарурӣ барои кори шумо мебошад.

#!/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. Дар асоси номҳои мизбон ifs насозед.
  5. Озод ҳис кунед, ки параметрҳоро барои синфҳо ва таърифҳо илова кунед - ин беҳтар аз мантиқи номуайяне, ки дар бадани синф/таъриф пинҳон шудааст, беҳтар аст.

Ман шарҳ медиҳам, ки чаро ман инро дар мақолаи навбатӣ тавсия медиҳам.

хулоса

Биёед бо муқаддима анҷом диҳем. Дар мақолаи навбатӣ ман ба шумо дар бораи Hiera, ENC ва PuppetDB нақл мекунам.

Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд. даромад, Лутфан.

Дарвоқеъ, маводи хеле бештар вуҷуд дорад - ман метавонам дар мавзӯъҳои зерин мақолаҳо нависам, овоз диҳам, ки шумо дар бораи он чизе ки хондан мехоҳед:

  • 59,1%Сохтмони мукаммали лӯхтак - баъзе чизҳои дар сатҳи оянда: ҳалқаҳо, харитасозӣ ва дигар ифодаҳои ламбда, коллекторҳои захираҳо, захираҳои содиротӣ ва иртиботи байни мизбон тавассути лӯхтак, тегҳо, провайдерҳо, навъҳои абстрактии додаҳо.13
  • 31,8%"Ман администратори модарам ҳастам" ё чӣ гуна мо дар Avito бо якчанд серверҳои поппети версияҳои гуногун дӯстӣ пайдо кардем ва дар асл қисмат дар бораи идоракунии сервери poppet.7
  • 81,8%Чӣ тавр мо рамзи лӯхтакро менависем: асбобсозӣ, ҳуҷҷатгузорӣ, санҷиш, CI/CD.18

22 корбар овоз доданд. 9 корбар худдорӣ карданд.

Манбаъ: will.com