د ګوډاګی پیژندنه

ګوډاګی د ترتیب مدیریت سیسټم دی. دا مطلوب حالت ته د کوربه راوستلو او دا حالت ساتلو لپاره کارول کیږي.

زه له پنځو کلونو راهیسې د ګوډاګی سره کار کوم. دا متن په اصل کې د رسمي اسنادو څخه د کلیدي ټکو ژباړل شوی او بیا ترتیب شوی تالیف دی، کوم چې به پیل کونکو ته اجازه ورکړي چې ژر تر ژره د Puppet په ماهیت پوه شي.

د ګوډاګی پیژندنه

لومړني معلومات

د ګوډاګي عملیاتي سیسټم د مراجعینو سرور دی، که څه هم دا د محدود فعالیت سره د سرور پرته عملیات هم ملاتړ کوي.

د عملیاتو یو پل ماډل کارول کیږي: په ډیفالټ ، په هر نیم ساعت کې یوځل ، پیرودونکي د ترتیب لپاره سرور سره اړیکه نیسي او پلي کوي. که تاسو د ځواب وړ سره کار کړی وي، نو بیا دوی د مختلف فشار ماډل کاروي: مدیر د ترتیب پلي کولو پروسه پیل کوي، پیرودونکي پخپله هیڅ شی نه پلي کوي.

د شبکې اړیکو په جریان کې، دوه طرفه TLS کوډ کول کارول کیږي: سرور او پیرودونکي خپل شخصي کیلي او ورته سندونه لري. عموما سرور د پیرودونکو لپاره سندونه صادروي، مګر په اصل کې دا ممکنه ده چې د بهرني CA کارول.

د منشور پیژندنه

د ګوډاګي په اصطلاح کې د ګوډاګي سرور ته نښلول نوډونه (نوډونه). د نوډونو لپاره ترتیب لیکل شوی په منشور کې په ځانګړې پروګرامینګ ژبه کې - Puppet DSL.

Puppet DSL یوه اعلامیه ژبه ده. دا د نوډ مطلوب حالت د انفرادي سرچینو د اعلامیې په بڼه بیانوي، د بیلګې په توګه:

  • فایل شتون لري او دا ځانګړي مینځپانګه لري.
  • کڅوړه نصب شوې ده.
  • خدمت پیل شو.

سرچینې کولی شي یو له بل سره وصل شي:

  • انحصار شتون لري، دوی په ترتیب اغیزه کوي په کوم کې چې سرچینې کارول کیږي.
    د مثال په توګه، "لومړی کڅوړه نصب کړئ، بیا د ترتیب فایل سم کړئ، بیا خدمت پیل کړئ."
  • خبرتیاوې شتون لري - که یوه سرچینه بدله شوې وي، نو دا د هغې ګډون شویو سرچینو ته خبرتیاوې لیږي.
    د مثال په توګه، که د تشکیلاتو فایل بدل شي، تاسو کولی شئ په اتوماتيک ډول خدمت بیا پیل کړئ.

برسیره پردې، د ګوډاګۍ DSL دندې او تغیرات لري، په بیله بیا شرطي بیانات او انتخابونکي. د ټیمپلینګ مختلف میکانیزمونه هم ملاتړ کیږي - EPP او ERB.

ګوډاګی په روبی لیکل شوی، نو ډیری ساختمانونه او اصطلاحات له هغه ځایه اخیستل شوی. روبي تاسو ته اجازه درکوي پوپټ پراخه کړئ - پیچلي منطق ، نوي ډول سرچینې ، دندې اضافه کړئ.

پداسې حال کې چې ګوډاګی روان دی، په سرور کې د هر ځانګړي نوډ لپاره څرګندونه په لارښود کې تنظیم شوي. نوملړ د منابعو او د هغوی د اړیکو لیست دی چې د دندو، تغیراتو او د مشروط بیانونو پراخولو ارزښت محاسبه کوي.

نحو او کوډ سټایل

دلته د رسمي اسنادو برخې دي چې تاسو سره به د نحو په پوهیدو کې مرسته وکړي که چمتو شوي مثالونه کافي نه وي:

دلته د هغه څه یوه بیلګه ده چې منشور ورته ښکاري:

# Комментарии пишутся, как и много где, после решётки.
#
# Описание конфигурации ноды начинается с ключевого слова 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 }).
  • په پیرامیټونو کې تیر باید په ورته کچه وي.
  • د سرچینې اړیکې تیر د دوی په مخ کې لیکل شوي.

په پاپیټسرور کې د فایلونو موقعیت

د نورو توضیحاتو لپاره، زه به د "روټ لارښود" مفهوم معرفي کړم. د روټ ډایرکټر هغه ډایرکټر دی چې د ځانګړي نوډ لپاره د Puppet ترتیب لري.

د روټ لارښود د پوپټ نسخه او کارول شوي چاپیریال پورې اړه لري. چاپیریال د تشکیلاتو خپلواکه سیټونه دي چې په جلا لارښودونو کې زیرمه شوي. معمولا د 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 - symlink
  • محتوا - د فایل مینځپانګې (یوازې د منظم فایلونو لپاره مناسب دي ، سره یوځای نشي کارول کیدی سرچينه او یا هدف)
  • سرچينه - د هغه لارې لینک چې تاسو غواړئ د فایل مینځپانګې کاپي کړئ (د سره یوځای نشي کارول کیدی محتوا او یا هدف). د سکیم سره د 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 - اتومات فعال شوی (systemctl enable)
    • mask - په پټه (systemctl mask)
    • false - اتومات غیر فعال دی (systemctl disable)
  • بیا روښانه کول - د خدمت بیا پیل کولو امر
  • حالت - د خدماتو وضعیت چیک کولو امر
  • بیا پیل - په ګوته کړئ چې ایا د خدماتو initscript د بیا پیل کولو ملاتړ کوي. که false او پیرامیټر مشخص شوی بیا روښانه کول - د دې پیرامیټر ارزښت کارول کیږي. که false او پیرامیټر بیا روښانه کول مشخص شوی نه دی - خدمت ودرول شوی او بیا پیل کول پیل شوي (مګر systemd کمانډ کاروي systemctl restart).
  • hasstatus - په ګوته کړئ چې ایا د خدمت initscript د قوماندې ملاتړ کوي status. که false، بیا د پیرامیټر ارزښت کارول کیږي حالت. ډیفالټ true.

Exec

بهرني حکمونه چلوي. که تاسو پیرامیټونه مشخص نه کړئ جوړوي, یوازې که, مګر او یا په تازه ډول، کمانډ به هرکله چې ګوډاګی چلیږي چلیږي. د خبرتیاو پروسس کولو توان - یو کمانډ چلوي.

پیرامیټرې:

  • د سرچینې نوم - د اجرا کولو امر (اختیاري)
  • د قوماندې - د اجرا کولو امر (که چیرې دا په نوم نه وي مشخص شوی)
  • لاره - هغه لارې چې د اجرا وړ فایل په لټه کې دي
  • یوازې که - که چیرې پدې پیرامیټر کې مشخص شوي کمانډ د صفر بیرته راستنیدو کوډ سره بشپړ شي ، اصلي کمانډ به اجرا شي
  • مګر - که چیرې پدې پیرامیټر کې مشخص شوي کمانډ د غیر صفر بیرته راستنیدو کوډ سره بشپړ شي ، اصلي کمانډ به اجرا شي
  • جوړوي - که چیرې پدې پیرامیټر کې مشخص شوی فایل شتون ونلري ، اصلي کمانډ به اجرا شي
  • په تازه ډول - که true، نو کمانډ به یوازې هغه وخت چلیږي کله چې دا اجرا کونکي د نورو سرچینو څخه خبرتیا ترلاسه کړي
  • cwd - لارښود له کوم څخه چې کمانډ چلوي
  • د کارونکي عکس - هغه کارن چې له چا څخه قومانده پرمخ وړي
  • برابرونکي - د کمانډ چلولو څرنګوالی:
    • پوکس - د ماشوم پروسه په ساده ډول جوړه شوې، ډاډ ترلاسه کړئ چې مشخص کړئ لاره
    • مرمۍ - کمانډ په شیل کې پیل شوی /bin/sh، کیدای شي مشخص نه شي لاره، تاسو کولی شئ د ګلوبینګ ، پایپونو او نورو شیل ځانګړتیاو څخه کار واخلئ. معمولا په اتوماتيک ډول کشف کیږي که چیرې کوم ځانګړي حروف شتون ولري (|, ;, &&, || وغيره).

cron

کرونجابونه کنټرولوي.

پیرامیټرې:

  • د سرچینې نوم - یوازې یو ډول پیژندونکی
  • ډاډ - د تاج کار حالت:
    • present - که شتون ونلري جوړ کړئ
    • absent - که شتون ولري حذف کړئ
  • د قوماندې - کوم قومانده چلوي
  • چاپیریال - په کوم چاپیریال کې کمانډ چلول کیږي (د چاپیریال متغیرونو لیست او د دوی ارزښتونه له لارې =)
  • د کارونکي عکس - له کوم کارونکي څخه کمانډ چلوي
  • دقیقې, ساعت, د اونۍ ورځ, میاشت, میاشتنۍ ورځ - کله چې کرون پرمخ بوځي. که چیرې د دې ځانګړتیاو څخه کوم مشخص نه وي، په کرونټاب کې به یې ارزښت وي *.

په ګوډاګی 6.0 کې cron لکه چې له بکس څخه لرې شوی په puppetserver کې، نو په عمومي سایټ کې هیڅ اسناد شتون نلري. خو هغه په بکس کې دی په ګوډاګی ایجنټ کې، نو اړتیا نشته چې دا په جلا توګه نصب کړئ. تاسو کولی شئ د دې لپاره اسناد وګورئ د ګوډاګي د پنځمې نسخې لپاره په اسنادو کې، یا په 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 (خپل ځان مه تکرار کړئ) اصول د یو دلیل لپاره ایجاد شوی.

د دې ستونزې د حل لپاره داسې ډیزاین شتون لري класс.

ټولګی

کللس د پاپټ کوډ نومول شوی بلاک دی. د کوډ بیا کارولو لپاره ټولګیو ته اړتیا ده.

لومړی باید ټولګي تشریح شي. تشریح پخپله هیڅ سرچینې هیڅ ځای نه اضافه کوي. ټولګي په منشور کې تشریح شوي:

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

له دې وروسته ټولګي کارول کیدی شي:

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

د تیرې دندې څخه یوه بیلګه - راځئ چې د نګینکس نصب او ترتیب ټولګي ته واړوو:

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
}

تغیرات

د تیر مثال ټولګي په هیڅ ډول انعطاف وړ ندي ځکه چې دا تل ورته نګینکس ترتیب راوړي. راځئ چې د ترتیب متغیر ته لاره پیدا کړو، بیا دا ټولګي د هر ډول ترتیب سره د نګینکس نصبولو لپاره کارول کیدی شي.

دا کیدی شي د متغیرونو کارول.

پاملرنه: په ګوډاګی کې متغیرونه د تغیر وړ دي!

برسېره پردې، یو متغیر یوازې وروسته له دې چې اعلان شي لاسرسی ومومي، که نه نو د متغیر ارزښت به وي 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_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, 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,
) {
  ...
}

ټولګي: د ټولګي نوم vs ټولګي شامل دي{'classname':}

هر ټولګي د ډول سرچینه ده ټولګي. لکه د کوم بل ډول سرچینې سره، په ورته نوډ کې د ورته ټولګي دوه مثالونه نشي کیدی.

که تاسو هڅه وکړئ په ورته نوډ کې دوه ځله په کارولو سره ټولګي اضافه کړئ class { 'classname':} (هیڅ توپیر نشته، د مختلف یا ورته پیرامیټونو سره)، د تالیف کولو تېروتنه به وي. مګر که تاسو د سرچینې سټایل کې ټولګي وکاروئ ، تاسو کولی شئ سمدلاسه د دې ټول پیرامیټونه په ښکاره ډول تنظیم کړئ.

په هرصورت، که تاسو کاروئ include، بیا ټولګی هرڅومره ځله اضافه کیدی شي څومره چې وغواړي. حقیقت دا دی include یو ایډمپوټینټ فنکشن دی چې ګوري چې ایا ټولګی په لارښود کې اضافه شوی که نه. که ټولګي په لارښود کې نه وي، دا اضافه کوي، او که دا دمخه شتون ولري، دا هیڅ نه کوي. مګر د کارولو په صورت کې include تاسو نشئ کولی د ټولګي اعالمیه په جریان کې د ټولګي پیرامیټونه تنظیم کړئ - ټول اړین پیرامیټونه باید د بهرنۍ ډیټا سرچینې - هیرا یا ENC کې تنظیم شي. موږ به په راتلونکې مقاله کې د هغوی په اړه خبرې وکړي.

تعریفوي

لکه څنګه چې په تیر بلاک کې ویل شوي وو، ورته ټولګي نشي کولی په نوډ کې یو ځل شتون ولري. په هرصورت، په ځینو مواردو کې تاسو اړتیا لرئ چې د کوډ ورته بلاک په ورته نوډ کې د مختلف پیرامیټونو سره وکاروئ. په بل عبارت، د خپل ډول سرچینې ته اړتیا ده.

د مثال په توګه، د PHP ماډل نصبولو لپاره، موږ په Avito کې لاندې کار کوو:

  1. د دې ماډل سره کڅوړه نصب کړئ.
  2. راځئ چې د دې ماډل لپاره د ترتیب کولو فایل جوړ کړو.
  3. موږ د php-fpm لپاره ترتیب ته سم لینک جوړوو.
  4. موږ د php cli لپاره ترتیب ته سم لینک جوړوو.

په داسې حاالتو کې، یو ډیزاین لکه تعریف (تعریف، تعریف شوی ډول، د سرچینې ډول تعریف شوی). تعریف یو ټولګي ته ورته دی، مګر توپیرونه شتون لري: لومړی، هر تعریف د سرچینې ډول دی، نه سرچینه. دوهم، هر تعریف یو اړخیز پیرامیټر لري $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، مګر زه به یې په راتلونکي قسط کې تاسو ته ووایم.

د ټولګیو او تعریفونو لپاره انحصار او خبرتیاوې

ټولګي او تعریفونه د انحصار او خبرتیاو اداره کولو لپاره لاندې قواعد اضافه کوي:

  • په ټولګي / تعریف باندې انحصار د ټولګي / تعریف په ټولو سرچینو باندې انحصار زیاتوي؛
  • ټولګي/تخصصي ټولګي ته انحصار زیاتوي
  • د ټولګي/تعریف خبرتیا د ټولګي/تعریف ټولې سرچینې خبر ورکوي؛
  • ټولګي/تعریف سبسکرپشن د ټولګي/تعریف ټولو سرچینو ته ګډون کوي.

مشروط بیانونه او ټاکونکي

دلته اسناد.

if

دلته ساده ده:

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

مګر

پرته لدې چې یو که په برعکس وي: د کوډ بلاک به اجرا شي که بیان غلط وي.

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

قضيه

دلته هم هیڅ پیچلی ندی. تاسو کولی شئ د ارزښتونو په توګه منظم ارزښتونه (سترګو، شمیرې، او نور)، منظم بیانونه، او د معلوماتو ډولونه وکاروئ.

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

ټاکونکي

انتخاب کونکی د ژبې جوړښت دی چې ورته ورته دی case، مګر د کوډ بلاک پلي کولو پرځای ، دا ارزښت بیرته راګرځوي.

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

ماډلونه

کله چې تشکیلات کوچنی وي، دا په اسانۍ سره په یوه منشور کې ساتل کیدی شي. مګر هرڅومره چې موږ تشریح کوو ، هومره نور ټولګي او نوډونه په مینی فیسټ کې شتون لري ، دا وده کوي ، او د کار کولو لپاره ناامنه کیږي.

سربیره پردې، د کوډ د بیا کارولو ستونزه شتون لري - کله چې ټول کوډ په یوه ښکاره کې وي، نو دا ستونزمنه ده چې دا کوډ د نورو سره شریک کړئ. د دې دوو ستونزو د حل لپاره، Puppet د ماډلونو په نوم یو وجود لري.

ماډلونه - دا د ټولګیو، تعریفونو او نورو ګوډاګی ادارو سیټونه دي چې په جلا لارښود کې ځای په ځای شوي. په بل عبارت، ماډل د ګوډاګي منطق یوه خپلواکه برخه ده. د مثال په توګه، ممکن د نګینکس سره د کار کولو لپاره ماډل وي، او دا به هغه څه ولري چې یوازې د نګینکس سره کار کولو ته اړتیا لري، یا ممکن د PHP سره کار کولو لپاره ماډل وي، او داسې نور.

ماډلونه نسخه شوي، او په یو بل باندې د ماډلونو انحصار هم ملاتړ کیږي. د ماډلونو خلاص ذخیره شتون لري - ګوډاګی فورج.

په ګوډاګی سرور کې، ماډلونه د روټ ډایرکټر د ماډلونو فرعي لارښود کې موقعیت لري. د هر ماډل دننه یو معیاري لارښود سکیم شتون لري - څرګندونه ، فایلونه ، ټیمپلیټونه ، لیب او داسې نور.

د فایل جوړښت په ماډل کې

د ماډل ریښه ممکن د تشریحي نومونو سره لاندې لارښودونه ولري:

  • manifests - دا منشورونه لري
  • files - دا فایلونه لري
  • templates - دا ټیمپلیټونه لري
  • lib - دا د روبي کوډ لري

دا د لارښودونو او فایلونو بشپړ لیست ندی، مګر دا د اوس لپاره د دې مقالې لپاره کافی دی.

په ماډل کې د سرچینو نومونه او د فایلونو نومونه

دلته اسناد.

په ماډل کې سرچینې (ټولګي، تعریفونه) نشي کولی هر هغه څه چې تاسو یې خوښوي نومول کیدی شي. برسېره پر دې، د سرچینې نوم او د فایل نوم ترمنځ مستقیم اړیکه شتون لري چې په هغه کې پوپټ به د دې سرچینې توضیحات وګوري. که تاسو د نومولو قواعدو څخه سرغړونه وکړئ، نو پوپټ به په ساده ډول د سرچینې توضیحات ونه موندل شي، او تاسو به د تالیف غلطی ترلاسه کړئ.

قواعد ساده دي:

  • په ماډل کې ټولې سرچینې باید د ماډل نوم ځای کې وي. که موډل ویل کیږي 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 کې څرګندونې په روبي کې لیکل شوي (ERB په حقیقت کې سرایت شوی روبی دی).

له منشور څخه متغیرونو ته د لاسرسي لپاره ، تاسو اړتیا لرئ اضافه کړئ @ د متغیر نوم ته. د لاین وقفې لرې کولو لپاره چې د کنټرول جوړونې وروسته څرګندیږي ، تاسو اړتیا لرئ د تړلو ټګ وکاروئ -%>.

د ټیمپلیټ کارولو مثال

راځئ چې ووایو زه د 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 -%>

حقیقتونه او جوړ شوي تغیرات

ډیری وختونه د ترتیب ځانګړې برخه پدې پورې اړه لري چې اوس مهال په نوډ کې څه پیښیږي. د مثال په توګه ، پدې پورې اړه لري چې د ډیبیان خوشې کول څه دي ، تاسو اړتیا لرئ د کڅوړې یو یا بل نسخه نصب کړئ. تاسو کولی شئ دا ټول په لاسي ډول وڅارئ، د بیا لیکلو څرګندونه که نوډونه بدل شي. مګر دا یو جدي چلند ندی؛ اتوماتیک خورا ښه دی.

د نوډونو په اړه د معلوماتو ترلاسه کولو لپاره، ګوډاګی د حقیقت په نوم یو میکانیزم لري. حقایق - دا د نوډ په اړه معلومات دي، چې په نړیوال نوم ځای کې د عادي متغیرونو په بڼه کې شتون لري. د مثال په توګه، د کوربه نوم، د عملیاتي سیسټم نسخه، د پروسیسر جوړښت، د کاروونکو لیست، د شبکې انٹرفیسونو لیست او د دوی پته، او نور ډیر څه. حقایق په منشورونو او ټیمپلیټونو کې د منظم تغیراتو په توګه شتون لري.

د حقایقو سره د کار کولو یوه بیلګه:

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

په رسمی توګه، یو حقیقت یو نوم (سټرینګ) او یو ارزښت لري (مختلف ډولونه شتون لري: تارونه، سرې، لغتونه). خوړل د جوړ شوي حقایقو مجموعه. تاسو هم کولی شئ خپل ځان ولیکئ. د حقیقت راټولونکي بیان شوي لکه په روبي کې افعالیا لکه د اجرا وړ فایلونه. حقایق هم په فورمه کې وړاندې کیدی شي د متن فایلونه د معلوماتو سره په نوډونو کې.

د عملیاتو په جریان کې، د ګوډاګي اجنټ لومړی ټول موجود حقایق راټولونکي د پیپټسرور څخه نوډ ته کاپي کوي، بیا وروسته دوی پیلوي او راټول شوي حقایق سرور ته لیږي؛ له دې وروسته، سرور د کتلاګ تالیف پیل کوي.

د اجرا وړ فایلونو په بڼه حقیقتونه

دا ډول حقایق په لارښود کې په ماډلونو کې ځای پر ځای شوي دي facts.d. البته، فایلونه باید د اجرا وړ وي. کله چې چلول کیږي، دوی باید په یاهم YAML یا key=value بڼه کې معیاري محصول ته معلومات تولید کړي.

مه هېروئ چې حقایق په ټولو نوډونو کې پلي کیږي چې د پاپټ سرور لخوا کنټرول کیږي چیرې چې ستاسو ماډل ځای په ځای شوی. له همدې امله، په سکریپټ کې، پام وکړئ چې وګورئ چې سیسټم ټول پروګرامونه او فایلونه لري چې ستاسو د حقیقت کار کولو لپاره اړین دي.

#!/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).

دلته د اسنادو اړونده برخه ده.

جوړ شوي متغیرات

د حقایقو سربیره، دا هم شتون لري ځینې ​​متغیراتپه نړیوال نوم ځای کې شتون لري.

  • باوري حقایق - متغیرات چې د پیرودونکي سند څخه اخیستل شوي (ځکه چې سند معمولا په پاپیټ سرور کې صادریږي ، اجنټ نشي کولی یوازې خپل سند واخلي او بدل کړي ، نو متغیرات "باور لري"): د سند نوم ، د سند نوم کوربه او ډومین، د سند څخه غزول.
  • د سرور حقایق د سرور په اړه د معلوماتو پورې اړوند متغیرونه - نسخه، نوم، د سرور IP پته، چاپیریال.
  • د اجنټ حقایق - متغیرونه په مستقیم ډول د ګوډاګی اجنټ لخوا اضافه شوي، نه د فکتور لخوا - د سند نوم، د اجنټ نسخه، د ګوډاګی نسخه.
  • ماسټر متغیرات - Pappetmaster متغیرات (sic!). دا د هغه په ​​څیر دی د سرور حقایق، د ترتیب کولو پیرامیټر ارزښتونه شتون لري.
  • تالیف کونکي تغیرات - د تالیف کونکي متغیرونه چې په هره ساحه کې توپیر لري: د اوسني ماډل نوم او د ماډل نوم چې اوسني څیز ته لاسرسی موندلی و. دوی د مثال په توګه کارول کیدی شي ترڅو وګوري چې ستاسو شخصي ټولګي په مستقیم ډول د نورو ماډلونو څخه نه کارول کیږي.

1 اضافه کول: دا ټول څنګه چلول او ډیبګ کول؟

په مقاله کې د ګوډاګي کوډ ډیری مثالونه شتون لري، مګر موږ ته یې نه دي ویلي چې دا کوډ څنګه پرمخ بوځي. ښه، زه خپل ځان اصلاح کوم.

یو اجنټ د ګوډاګی چلولو لپاره کافي دی ، مګر د ډیری قضیو لپاره تاسو به سرور ته هم اړتیا ولرئ.

اجنټ

لږترلږه د XNUMX نسخه راهیسې، د ګوډاګی اجنټ کڅوړې له دې څخه د Puppetlabs رسمي ذخیره ټول انحصارونه لري (روبي او ورته جواهرات)، نو د نصب کولو ستونزې شتون نلري (زه د ډیبیان پر بنسټ توزیعونو په اړه خبرې کوم - موږ د 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. د ټولګیو او تعریفونو لپاره د پیرامیټونو اضافه کولو لپاره وړیا احساس وکړئ - دا د ټولګي/تعریف په بدن کې د پټ منطق څخه غوره دی.

زه به تشریح کړم چې ولې زه په راتلونکي مقاله کې دا کولو وړاندیز کوم.

پایلې

راځئ چې د پیژندنې سره پای ته ورسیږو. په راتلونکې مقاله کې به زه تاسو ته د هیرا، ENC او PuppetDB په اړه ووایم.

یوازې راجستر شوي کاروونکي کولی شي په سروې کې برخه واخلي. ننوزئمهرباني وکړئ

په حقیقت کې، ډیر نور مواد شتون لري - زه کولی شم په لاندې موضوعاتو مقالې ولیکم، هغه څه ته رایه ورکړئ چې تاسو یې په اړه لوستلو کې لیوالتیا لرئ:

  • ۸۵٪پرمختللی ګوډاګی جوړونه - یو څه د بلې کچې شیټ: لوپونه، نقشه کول او نور لامبډا بیانونه، د سرچینو راټولونکي، صادر شوي سرچینې او د پوپټ، ټاګونو، چمتو کونکو، د خلاصې ډاټا ډولونه.
  • ۸۵٪"زه زما د مور اډمین یم" یا څنګه چې موږ په Avito کې د مختلف نسخو ډیری پاپیټ سرورونو سره ملګري پیدا کړل، او په اصل کې، د پاپیټ سرور اداره کولو برخه.
  • ۸۵٪موږ څنګه د ګوډاګي کوډ لیکو: وسیله، اسناد، ازموینه، CI/CD.18

22 کاروونکو رایه ورکړه. 9 کاروونکي منع شوي.

سرچینه: www.habr.com