Хүүхэлдэйн киноны танилцуулга

Хүүхэлдэй бол тохиргооны удирдлагын систем юм. Энэ нь хостуудыг хүссэн төлөвт хүргэж, энэ төлөвийг хадгалахад хэрэглэгддэг.

Би хүүхэлдэйтэй таван жил гаруй ажиллаж байна. Энэхүү текст нь үндсэндээ албан ёсны баримт бичгийн гол санаануудыг орчуулж, дахин эрэмбэлсэн эмхэтгэл бөгөөд эхлэгчдэд Хүүхэлдэйн киноны мөн чанарыг хурдан ойлгох боломжийг олгоно.

Хүүхэлдэйн киноны танилцуулга

Үндсэн мэдээлэл

Хүүхэлдэйн үйлдлийн систем нь үйлчлүүлэгч-сервер боловч хязгаарлагдмал ажиллагаатай сервергүй ажиллагааг дэмждэг.

Үйл ажиллагааны татах загварыг ашигладаг: анхдагч байдлаар, хагас цаг тутамд үйлчлүүлэгчид сервертэй холбогдож тохиргоогоо хийдэг. Хэрэв та Ansible-тэй ажиллаж байсан бол тэд өөр түлхэх загварыг ашигладаг: администратор тохиргоог хэрэгжүүлэх процессыг эхлүүлдэг, үйлчлүүлэгчид өөрсдөө юу ч хэрэглэхгүй.

Сүлжээний холболтын үед хоёр талын 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 }).
  • Параметрүүд дээрх сумнууд ижил түвшинд байх ёстой.
  • Тэдний өмнө нөөцийн харилцааны сумнууд бичигдсэн байдаг.

Pappetserver дээрх файлуудын байршил

Нэмэлт тайлбар хийхийн тулд би "үндсэн лавлах" гэсэн ойлголтыг танилцуулах болно. Үндсэн лавлах нь тодорхой зангилааны Хүүхэлдэйн тохиргоог агуулсан лавлах юм.

Үндсэн лавлах нь Puppet-ийн хувилбар болон ашигласан орчноос хамаарч өөр өөр байдаг. Хүрээлэн буй орчин нь тусдаа сангуудад хадгалагддаг бие даасан тохиргооны багц юм. Ихэвчлэн git-тэй хослуулан ашигладаг бөгөөд энэ тохиолдолд git салбаруудаас орчин бий болдог. Үүний дагуу зангилаа бүр нэг эсвэл өөр орчинд байрладаг. Үүнийг зангилаа өөрөө эсвэл ENC дээр тохируулж болно, би дараагийн өгүүллээр ярих болно.

  • Гурав дахь хувилбарт ("хуучин хүүхэлдэй") үндсэн лавлах байсан /etc/puppet. Орчны хэрэглээ нь сонголттой байдаг - жишээлбэл, бид тэдгээрийг хуучин Хүүхэлдэйтэй хамт ашигладаггүй. Хэрэв орчин ашиглаж байгаа бол тэдгээрийг ихэвчлэн хадгалдаг /etc/puppet/environments, үндсэн лавлах нь орчны лавлах болно. Хэрэв орчныг ашиглаагүй бол үндсэн лавлах нь үндсэн лавлах болно.
  • Дөрөв дэх хувилбараас ("шинэ хүүхэлдэй") эхлэн орчныг ашиглах нь зайлшгүй болж, үндсэн лавлах руу шилжсэн. /etc/puppetlabs/code. Үүний дагуу орчныг хадгалдаг /etc/puppetlabs/code/environments, root лавлах нь орчны лавлах юм.

Үндсэн директорт дэд лавлах байх ёстой 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 файлыг ашиглана)
  • зорилтот — тэмдэгт холбоосыг зааж өгөх ёстой (үүнтэй хамт ашиглах боломжгүй агуулга буюу эх үүсвэр)
  • эзэн — файлыг эзэмших ёстой хэрэглэгч
  • бүлэг - файлын хамаарах бүлэг
  • горим - файлын зөвшөөрөл (мөр хэлбэрээр)
  • дахих - рекурсив лавлах боловсруулалтыг идэвхжүүлдэг
  • Цэвэрлэх - Хүүхэлдэй дээр тайлбарлаагүй файлуудыг устгах боломжтой
  • хүч - Хүүхэлдэй дээр тодорхойлогдоогүй сангуудыг устгах боломжтой

Багц

Багцуудыг суулгаж, устгана. Мэдэгдэлтэй ажиллах боломжтой - параметрийг зааж өгсөн бол багцыг дахин суулгана дахин_сэргээхэд_суулгана уу.

Параметрүүд:

  • нөөцийн нэр - багцын нэр (заавал биш)
  • нэр - багцын нэр (нэрэнд заагаагүй бол)
  • үйлчилгээ үзүүлэгч - ашиглах багц менежер
  • хангах - багцын хүссэн төлөв:
    • present, installed - суулгасан ямар ч хувилбар
    • latest - хамгийн сүүлийн хувилбарыг суулгасан
    • absent - устгасан (apt-get remove)
    • purged — тохиргооны файлуудын хамт устгагдсан (apt-get purge)
    • held - багцын хувилбар түгжигдсэн (apt-mark hold)
    • любая другая строка - заасан хувилбарыг суулгасан
  • дахин_сэргээхэд_суулгана уу - хэрэв true, дараа нь мэдэгдлийг хүлээн авмагц багцыг дахин суулгах болно. Барилга байгууламжийн параметрүүдийг өөрчлөх үед багцуудыг дахин бүтээх шаардлагатай байж болзошгүй эх сурвалжид суурилсан түгээлтүүдэд ашигтай. Өгөгдмөл false.

үйлчилгээ

Үйлчилгээг удирддаг. Мэдэгдэл боловсруулах боломжтой - үйлчилгээг дахин эхлүүлнэ.

Параметрүүд:

  • нөөцийн нэр - удирдах үйлчилгээ (заавал биш)
  • нэр - удирдах шаардлагатай үйлчилгээ (хэрэв нэрэнд заагаагүй бол)
  • хангах - үйлчилгээний хүссэн төлөв:
    • running - эхлүүлсэн
    • stopped - зогсоосон
  • Идэвхжүүлэх - үйлчилгээг эхлүүлэх чадварыг хянадаг:
    • true - автоматаар ажиллуулах идэвхжсэн (systemctl enable)
    • mask - далдалсан (systemctl mask)
    • false - автоматаар ажиллуулах идэвхгүй болсон (systemctl disable)
  • дахин ачааллах - үйлчилгээг дахин эхлүүлэх команд
  • байдал — үйлчилгээний статусыг шалгах команд
  • дахин эхлүүлэх — үйлчилгээний initscript дахин эхлүүлэхийг дэмждэг эсэхийг заана. Хэрэв false мөн параметрийг зааж өгсөн болно дахин ачааллах - энэ параметрийн утгыг ашиглана. Хэрэв false ба параметр дахин ачааллах заагаагүй - үйлчилгээг зогсоож, дахин эхлүүлсэн (гэхдээ systemd командыг ашигладаг systemctl restart).
  • нөхцөл байдал — үйлчилгээний initscript командыг дэмжиж байгаа эсэхийг заана statusБайна. Хэрэв false, дараа нь параметрийн утгыг ашиглана байдал. Өгөгдмөл true.

ажиллуулах

Гадаад командуудыг ажиллуулдаг. Хэрэв та параметрүүдийг заагаагүй бол бий болгож байна, зөвхөн хэрэв, бол буюу шинэчлэн, Хүүхэлдэйг ажиллуулах болгонд тушаал ажиллана. Мэдэгдэл боловсруулах боломжтой - командыг ажиллуулдаг.

Параметрүүд:

  • нөөцийн нэр - гүйцэтгэх тушаал (заавал биш)
  • Тушаал - гүйцэтгэх тушаал (хэрэв нэрэнд заагаагүй бол)
  • зам — гүйцэтгэх файлыг хайх замууд
  • зөвхөн хэрэв — Хэрэв энэ параметрт заасан команд нь тэг буцах кодоор дууссан бол үндсэн командыг гүйцэтгэнэ
  • бол - Хэрэв энэ параметрт заасан тушаалыг тэгээс өөр буцах кодоор гүйцэтгэсэн бол үндсэн командыг гүйцэтгэнэ.
  • бий болгож байна — Хэрэв энэ параметрт заасан файл байхгүй бол үндсэн командыг гүйцэтгэнэ
  • шинэчлэн - хэрэв true, дараа нь энэ ажилтан бусад эх сурвалжаас мэдэгдэл хүлээн авах үед л тушаал ажиллана
  • cwd — командыг ажиллуулах лавлах
  • хэрэглэгчийн — командыг ажиллуулах хэрэглэгч
  • үйлчилгээ үзүүлэгч - тушаалыг хэрхэн ажиллуулах вэ:
    • posix - Хүүхдийн процессыг зүгээр л үүсгэсэн тул зааж өгөхөө мартуузай зам
    • бүрхүүл - командыг бүрхүүлд ажиллуулсан /bin/sh, тодорхойлоогүй байж болно зам, та globbing, pipes болон бусад бүрхүүлийн функцуудыг ашиглаж болно. Хэрэв ямар нэгэн тусгай тэмдэгт байгаа бол ихэвчлэн автоматаар илрүүлдэг (|, ;, &&, || гэх мэт).

cron

Cronjobs-ыг хянадаг.

Параметрүүд:

  • нөөцийн нэр - зүгээр л нэг төрлийн танигч
  • хангах - титмийн байдал:
    • present - байхгүй бол үүсгэх
    • absent - хэрэв байгаа бол устгах
  • Тушаал - ямар тушаал ажиллуулах
  • орчин — командыг ямар орчинд ажиллуулах вэ (орчны хувьсагчдын жагсаалт, тэдгээрийн утгуудын жагсаалт =)
  • хэрэглэгчийн — командыг аль хэрэглэгчээс ажиллуулах
  • минут, цаг, ажлын өдөр, сарын, сарын өдөр - cron-г хэзээ ажиллуулах вэ. Хэрэв эдгээр шинж чанаруудын аль нэгийг заагаагүй бол түүний crontab дахь утга нь байх болно *.

Хүүхэлдэйн 6.0 хувилбарт cron гэх мэт хайрцагнаас хасав хүүхэлдэйн серверт байгаа тул ерөнхий сайт дээр бичиг баримт байхгүй байна. Гэвч тэр хайрцагт байгаа puppet-agent-д байгаа тул тусад нь суулгах шаардлагагүй. Та үүнд зориулсан баримт бичгийг харж болно Хүүхэлдэйн тав дахь хувилбарын баримт бичигт, эсвэл GitHub дээр.

Ерөнхийдөө нөөцийн талаар

Нөөцийн өвөрмөц байдалд тавигдах шаардлага

Бидний хамгийн их тохиолддог алдаа бол Давхардсан мэдүүлэг. Энэ алдаа нь ижил төрлийн хоёр буюу түүнээс дээш ижил нэртэй эх сурвалжууд лавлахад гарч ирэхэд үүсдэг.

Тиймээс би дахин бичих болно: ижил зангилааны манифест нь ижил гарчигтай ижил төрлийн нөөцийг агуулж болохгүй!

Заримдаа ижил нэртэй боловч өөр өөр багц менежертэй багцуудыг суулгах шаардлага гардаг. Энэ тохиолдолд та параметрийг ашиглах хэрэгтэй nameалдаанаас зайлсхийхийн тулд:

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

Бусад нөөцийн төрлүүд давхардлаас зайлсхийхэд туслах ижил төстэй сонголтуудтай байдаг - name у үйлчилгээ, command у ажиллуулах, гэх мэт.

Метапараметрүүд

Нөөцийн төрөл бүр нь шинж чанараас үл хамааран зарим тусгай параметртэй байдаг.

Мета параметрүүдийн бүрэн жагсаалт Хүүхэлдэйн баримт бичигт.

Богино жагсаалт:

  • шаарддаг — энэ параметр нь энэ нөөц нь ямар нөөцөөс хамааралтай болохыг харуулж байна.
  • өмнө - Энэ параметр нь энэ нөөцөөс ямар нөөц хамаарахыг тодорхойлдог.
  • бүртгүүлэх — энэ параметр нь энэ нөөц ямар эх сурвалжаас мэдэгдэл хүлээн авахыг тодорхойлдог.
  • мэдэгдэх — Энэ параметр нь ямар эх сурвалжаас мэдэгдэл хүлээн авахыг тодорхойлдог.

Жагсаалтад орсон бүх метапараметрүүд нь нэг эх сурвалжийн холбоос эсвэл дөрвөлжин хаалт дахь холбоосуудын массивыг хүлээн зөвшөөрдөг.

Эх сурвалжуудын холбоосууд

Нөөцийн холбоос нь нөөцийн тухай зүгээр л дурддаг. Тэдгээрийг ихэвчлэн хамаарлыг илэрхийлэхэд ашигладаг. Байгаагүй нөөцийг лавлах нь эмхэтгэлд алдаа гаргах болно.

Холбоосын синтакс нь дараах байдалтай байна: том үсгээр эхийн төрөл (хэрэв төрлийн нэр нь давхар хоёр цэг агуулсан бол хоёр цэгийн хоорондох нэрийн хэсэг бүрийг том үсгээр бичнэ), дараа нь дөрвөлжин хаалтанд нөөцийн нэрийг (нэрийн тохиолдол) оруулна. өөрчлөгдөхгүй!). Хоосон зай байх ёсгүй, дөрвөлжин хаалт нь төрлийн нэрний дараа шууд бичигдэнэ.

Жишээ нь:

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

Хамаарал ба мэдэгдэл

Баримт бичгийг энд.

Өмнө дурьдсанчлан, нөөц хоорондын энгийн хамаарал нь шилжилтийн шинж чанартай байдаг. Дашрамд хэлэхэд, хамаарлыг нэмэхдээ болгоомжтой байгаарай - та мөчлөгийн хамаарлыг үүсгэж болох бөгөөд энэ нь эмхэтгэлд алдаа гаргах болно.

Хамааралтай байдлаас ялгаатай нь мэдэгдэл нь шилжилт хөдөлгөөн биш юм. Мэдэгдэлд дараах дүрмийг баримтална.

  • Хэрэв нөөц мэдэгдэл хүлээн авбал шинэчлэгддэг. Шинэчлэх үйлдлүүд нь нөөцийн төрлөөс хамаарна - ажиллуулах тушаалыг ажиллуулж, үйлчилгээ үйлчилгээг дахин эхлүүлэх, Багц багцыг дахин суулгана. Хэрэв нөөцөд шинэчлэх үйлдэл тодорхойлогдоогүй бол юу ч болохгүй.
  • Хүүхэлдэйг нэг удаа ажиллуулах явцад нөөцийг нэгээс илүүгүй удаа шинэчилдэг. Мэдэгдэлд хамаарлыг багтаасан бөгөөд хамаарлын график нь мөчлөгийг агуулаагүй тул энэ нь боломжтой юм.
  • Хэрэв хүүхэлдэй нөөцийн төлөвийг өөрчилвөл нөөц нь түүнд бүртгүүлсэн бүх нөөцөд мэдэгдэл илгээдэг.
  • Хэрэв нөөц шинэчлэгдсэн бол түүнд бүртгүүлсэн бүх нөөцөд мэдэгдэл илгээдэг.

Тодорхойгүй параметрүүдийг зохицуулах

Дүрмээр бол, хэрэв зарим нөөцийн параметр нь анхдагч утгагүй бөгөөд энэ параметрийг манифестэд заагаагүй бол Puppet нь зангилаа дээрх харгалзах нөөцийн хувьд энэ шинж чанарыг өөрчлөхгүй. Жишээ нь, хэрэв төрлийн нөөц бол Файл параметрийг заагаагүй байна owner, тэгвэл Хүүхэлдэй нь холбогдох файлын эзэмшигчийг өөрчлөхгүй.

Ангиуд, хувьсагч, тодорхойлолтуудын танилцуулга

Бидэнд тохиргооны ижил хэсэгтэй хэд хэдэн зангилаа байгаа гэж бодъё, гэхдээ бас ялгаа бий - эс тэгвээс бид бүгдийг нэг блокт дүрсэлж болно. 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 суулгахад ашиглаж болно.

Үүнийг хийж болно хувьсагч ашиглах.

Анхаар: Хүүхэлдэйн дэх хувьсагч өөрчлөгддөггүй!

Нэмж хэлэхэд хувьсагчийг зарласны дараа л хандах боломжтой, эс тэгвээс хувьсагчийн утга нь 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 нь санд анги нэмэгдсэн эсэхийг шалгадаг idempotent функц юм. Анги нь лавлахад байхгүй бол нэмдэг, хэрэв байгаа бол юу ч хийхгүй. Гэхдээ ашиглах тохиолдолд include Анги зарлах үед та ангийн параметрүүдийг тохируулах боломжгүй - шаардлагатай бүх параметрүүдийг гадаад мэдээллийн эх сурвалж - Hiera эсвэл ENC-д тохируулах ёстой. Бид тэдний талаар дараагийн өгүүллээр ярих болно.

тодорхойлдог

Өмнөх блок дээр дурдсанчлан нэг анги нь зангилаа дээр нэгээс олон удаа байж болохгүй. Гэсэн хэдий ч зарим тохиолдолд та ижил зангилаа дээр өөр өөр параметр бүхий нэг блок кодын ашиглах боломжтой байх шаардлагатай. Өөрөөр хэлбэл, өөрийн гэсэн нөөцийн төрөл хэрэгтэй байна.

Жишээлбэл, PHP модулийг суулгахын тулд бид Avito дээр дараахь зүйлийг хийдэг.

  1. Энэ модулийг ашиглан багцыг суулгана уу.
  2. Энэ модулийн тохиргооны файлыг үүсгэцгээе.
  3. Бид php-fpm-д зориулсан тохиргоонд симбол үүсгэнэ.
  4. Бид php cli-д зориулсан тохиргоонд сим холбоос үүсгэдэг.

Ийм тохиолдолд дизайн гэх мэт тодорхойлох (тодорхойлох, тодорхойлсон төрөл, тодорхойлсон нөөцийн төрөл). Define нь ангитай төстэй боловч ялгаатай талууд байдаг: нэгдүгээрт, Define бүр нь нөөц биш, нөөцийн төрөл юм; хоёрдугаарт, тодорхойлолт бүр нь далд параметртэй байдаг $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' }
}

Давхардсан мэдэгдлийн алдааг олж илрүүлэх хамгийн хялбар арга бол Define юм. Тодорхойлолтод тогтмол нэртэй нөөц байгаа бөгөөд зарим зангилаа дээр энэ тодорхойлолтын хоёр ба түүнээс дээш тохиолдол байгаа тохиолдолд энэ нь тохиолддог.

Үүнээс өөрийгөө хамгаалахад хялбар: тодорхойлолт доторх бүх нөөц нь үүнээс хамаарч нэртэй байх ёстой $title. Альтернатив хувилбар бол нөөцийг үл тоомсорлон нэмэх явдал юм; хамгийн энгийн тохиолдолд тодорхойлолтын бүх тохиолдлуудад нийтлэг байгаа нөөцүүдийг тусдаа ангид шилжүүлж, энэ ангиллыг функцийн тодорхойлолтонд оруулахад хангалттай. include хүчгүй.

Нөөц нэмэх үед чадваргүй байдалд хүрэх өөр аргууд байдаг, тухайлбал функцуудыг ашиглах defined и ensure_resources, гэхдээ би дараагийн ангид энэ тухай танд хэлэх болно.

Ангиуд болон тодорхойлолтуудын хамаарал ба мэдэгдэл

Ангиуд болон тодорхойлолтууд нь хамаарал болон мэдэгдлүүдийг зохицуулахад дараах дүрмийг нэмдэг:

  • ангиас хамаарал/тодорхойлох нь анги/тодорхойлох бүх нөөцөөс хамаарлыг нэмдэг;
  • анги/тодорхойлох хамаарал нь бүх ангид хамаарлыг нэмдэг/нөөцийг тодорхойлох;
  • class/define мэдэгдэл нь анги/тодорхойлох бүх нөөцийг мэдэгдэнэ;
  • class/define захиалга нь анги/тодорхойлох бүх нөөцийг захиална.

Нөхцөлт мэдэгдлүүд ба сонгогчид

Баримт бичгийг энд.

if

Энд энгийн:

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

бол

урвуу тохиолдолд if бол: илэрхийлэл худал бол кодын блок ажиллана.

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

хэрэг

Энд бас төвөгтэй зүйл байхгүй. Та ердийн утгууд (мөр, тоо гэх мэт), ердийн илэрхийлэл, өгөгдлийн төрлийг утга болгон ашиглаж болно.

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

Сонгогчид

Сонгогч нь хэлний бүтэцтэй төстэй case, гэхдээ кодын блокийг гүйцэтгэхийн оронд утгыг буцаана.

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

Модулиуд

Тохиргоо бага бол үүнийг нэг манифестэд хялбархан хадгалах боломжтой. Гэхдээ бид илүү олон тохиргоог дүрслэх тусам манифестэд илүү олон анги, зангилаа байх тусам энэ нь томорч, ажиллахад тохиромжгүй болно.

Нэмж дурдахад кодыг дахин ашиглах асуудал байдаг - бүх код нэг манифест байгаа үед энэ кодыг бусадтай хуваалцахад хэцүү байдаг. Эдгээр хоёр асуудлыг шийдэхийн тулд Puppet-д модулиуд гэж нэрлэгддэг нэгж байдаг.

Модулиуд - эдгээр нь тусдаа лавлахад байрлуулсан анги, тодорхойлолт болон бусад Хүүхэлдэйн нэгжүүдийн багц юм. Өөрөөр хэлбэл, модуль нь Хүүхэлдэйн логикийн бие даасан хэсэг юм. Жишээлбэл, nginx-тэй ажиллах модуль байж болох бөгөөд энэ нь nginx-тэй ажиллахад зөвхөн юу хэрэгтэйг агуулсан байх эсвэл PHP-тэй ажиллах модуль гэх мэт байж болно.

Модулиуд нь хувилбартай бөгөөд модулиудын бие биенээсээ хамаарлыг дэмждэг. Модулийн нээлттэй репозитор байдаг - Хүүхэлдэйн театр.

Хүүхэлдэйн сервер дээр модулиуд нь үндсэн директорийн модулиудын дэд директорт байрладаг. Модуль бүрийн дотор стандарт лавлах схем байдаг - манифест, файл, загвар, lib гэх мэт.

Модуль дахь файлын бүтэц

Модулийн үндэс нь тайлбарлах нэртэй дараах сангуудыг агуулж болно.

  • manifests - энэ нь манифест агуулдаг
  • files - энэ нь файлуудыг агуулдаг
  • templates - энэ нь загваруудыг агуулдаг
  • lib - энэ нь Ruby кодыг агуулдаг

Энэ нь лавлах болон файлуудын бүрэн жагсаалт биш боловч одоогоор энэ нийтлэлд хангалттай.

Модуль дахь нөөцийн нэр, файлын нэр

Баримт бичгийг энд.

Модульд байгаа нөөцүүдийг (анги, тодорхойлолт) таны хүссэнээр нэрлэх боломжгүй. Нэмж дурдахад, нөөцийн нэр болон 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 - энэ нь файлын нэрийг биш харин загвар текстийг оролт болгон хүлээн авдаг.

Загваруудын дотор та одоогийн хамрах хүрээ дэх бүх Хүүхэлдэйн хувьсагчийг ашиглаж болно.

Хүүхэлдэй нь 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: энэ бүгдийг хэрхэн ажиллуулж, дибаг хийх вэ?

Уг нийтлэлд хүүхэлдэйн кодын олон жишээ орсон байсан ч энэ кодыг хэрхэн ажиллуулах талаар огт хэлээгүй. За би өөрийгөө засаж байна.

Puppet-ийг ажиллуулахад агент хангалттай боловч ихэнх тохиолдолд танд сервер хэрэгтэй болно.

Агент

Наад зах нь хувилбар 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.

Сервер

Би энэ нийтлэлд pappetserver-ийн бүрэн тохиргоо болон түүнд код байршуулах талаар авч үзэхгүй; Цөөн тооны сервертэй ажиллах нэмэлт тохиргоо шаарддаггүй серверийн бүрэн ажиллагаатай хувилбар байгаа гэдгийг л би хэлэх болно. зангилаа (жишээлбэл, зуу хүртэл). Илүү олон тооны зангилаа тааруулах шаардлагатай болно - анхдагч байдлаар, хүүхэлдэйн сервер нь дөрвөөс илүүгүй ажилчдыг ажиллуулдаг, илүү сайн ажиллахын тулд та тэдний тоог нэмэгдүүлэх хэрэгтэй бөгөөд санах ойн хязгаарыг нэмэгдүүлэхээ бүү мартаарай, эс тэгвээс сервер ихэнх цагаа хог цуглуулах болно.

Код байршуулалт - хэрэв танд хурдан бөгөөд хялбар хэрэгтэй бол харна уу (r10k)[https://github.com/puppetlabs/r10k], жижиг суулгацын хувьд энэ нь хангалттай байх ёстой.

Нэмэлт 2: Кодлох заавар

  1. Бүх логикийг анги, тодорхойлолтод байрлуул.
  2. Ангиуд болон тодорхойлолтуудыг зангилааг дүрсэлсэн манифестт биш, харин модулиудад хадгал.
  3. Баримтуудыг ашигла.
  4. Хост нэр дээр үндэслэн if бүү хий.
  5. Ангиуд болон тодорхойлолтуудын параметрүүдийг нэмж болно - энэ нь анги/тодорхойлох хэсэгт нуугдсан далд логикоос илүү дээр юм.

Би яагаад үүнийг хийхийг санал болгож байгаагаа дараагийн өгүүллээр тайлбарлах болно.

дүгнэлт

Танилцуулгаар дуусгая. Дараагийн өгүүллээр би Hiera, ENC болон PuppetDB-ийн талаар танд хэлэх болно.

Зөвхөн бүртгэлтэй хэрэглэгчид санал асуулгад оролцох боломжтой. Нэвтрэх, гуйя.

Үнэн хэрэгтээ илүү их материал бий - би дараах сэдвээр нийтлэл бичиж, уншихыг хүсч буй зүйлийн талаар санал өгөх боломжтой.

  • 59,1%Нарийвчилсан хүүхэлдэйн бүтээцүүд - дараагийн түвшний новшууд: гогцоо, зураглал болон бусад ламбда илэрхийллүүд, нөөц цуглуулагчид, экспортолсон нөөцүүд болон Хүүхэлдэйгээр дамжуулан хост хоорондын харилцаа холбоо, шошго, үйлчилгээ үзүүлэгч, хийсвэр өгөгдлийн төрлүүд.13
  • 31,8%"Би ээжийнхээ админ" эсвэл бид Avito-д янз бүрийн хувилбарын хэд хэдэн попет серверүүдтэй хэрхэн нөхөрлөсөн тухай, мөн зарчмын хувьд poppet серверийг удирдах тухай хэсэг.7
  • 81,8%Бид хүүхэлдэйн кодыг хэрхэн бичих вэ: багаж хэрэгсэл, баримтжуулалт, туршилт, CI/CD.18

22 хэрэглэгч санал өгсөн. 9 хэрэглэгч түдгэлзсэн.

Эх сурвалж: www.habr.com