برنامه نویسی

تعمیر و نگهداری پیشگیرانه عروسکی منبع باز

Summarize this content to 400 words in Persian Lang
هنگام مدیریت هر پشته فناوری، همه ما سوالات زیر را چه در داخل یا چه از همتایان خود پرسیده ایم:

آیا پشته به طور بهینه پیکربندی شده است؟
آیا مسائلی وجود دارد که نیاز به توجه فوری من (یا تیم من) داشته باشد؟
آیا “گوچا” بالقوه ای وجود دارد که باید در هفته ها/ماه های آینده مورد توجه قرار گیرد؟

در مورد Puppet، برای پاسخ به این سؤالات، مدیران از نظر تاریخی به موارد زیر روی می آورند:

بررسی خروجی تماس های مختلف HTTP API.
بررسی داشبوردهای عملیاتی حاوی نمایش بصری معیارهای مختلف.
تجزیه فایل(های) log برای اجزای مختلف.

در حالی که همه این منابع بینش ارزشمندی در مورد نحوه عملکرد یک نصب عروسکی ارائه می دهند، همه آنها در یک چیز مشترک هستند. این حجم قابل توجهی از اطلاعات ارائه شده به مدیر است. اطلاعاتی که نیاز به تجربه قبلی در مورد آنچه که باید جستجو کرد، کجا جستجو کرد و چگونه به دست آورد نیاز دارد. تجربه را کنار بگذاریم، جمع آوری همه این اطلاعات زمان می برد. زمانی که احتمالاً مجبور نیستید در وسط یک شیفت کاری شبانه وقت بگذارید. حتی اگر مقصر را پیدا کردید، آن دفترچه یادداشت با یادداشت‌های مرموز شما در مورد چگونگی حل آن از آخرین باری که با این سناریو مواجه شدید کجا رفته است؟ یا شاید این اولین باری است که در این سناریو هستید و Google-Fu شما را در حالت محروم از کافئین شکست می دهد؟

خوب، با فرضیات بس است. اگر به شما بگویم گزینه ساده تری وجود دارد چه؟ خوب، شما خوش شانس هستید، ماژول puppetlabs/puppet_status_check یک راه فعال را برای تعیین زمانی که نصب عروسک در وضعیت ایده آل نیست، ارائه می دهد. این ماژول از نشانگرهای از پیش پیکربندی شده استفاده می کند تا نه تنها خروجی ساده ای را برای تشخیص اشتباه ارائه دهد، بلکه شما را به مراحل بعدی برای تفکیک راهنمایی می کند.

“این عالی به نظر می رسد، اما چگونه می توانم این مورد را تنظیم و استفاده کنم؟” خوب بیایید شیرجه بزنیم؟

برپایی

ابتدا باید ماژول را در پایگاه کد خود وارد کنیم. اگر از یک مخزن کنترل و یک Puppetfile برای مدیریت محتویات پایگاه کد خود استفاده می کنید، به راحتی می توانید موارد زیر را به Puppetfile خود اضافه کنید، زیرا ماژول های وابستگی وجود ندارد:

mod ‘puppetlabs-puppet_status_check’, ‘0.9.2’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر وب هوک یا اتوماسیون دیگری برای مدیریت این کار برای شما ندارید، حتماً کد خود را مستقر کنید. برای مثال، کاربران r10k ممکن است با اجرای موارد زیر به صورت محلی روی سرور(های) Puppet خود مستقر شوند:

r10k deploy environment production -mv

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا دفعه بعد که عامل Puppet روی گره های این محیط اجرا می شود، Puppet_status_check و نقش_بررسی_وضعیت_عروسکی حقایق بر روی هر گره با پلاگین همگام سازی می شوند. این حقایق چیزی است که در نهایت اطلاعاتی را که به دنبال آن هستیم در اختیار ما قرار می دهد.

با این حال، قبل از شروع استفاده از این حقایق، ابتدا باید آنها را فعال کرده و به صورت اختیاری پیکربندی کنیم که کدام زیرمجموعه از چک‌هایی را که می‌خواهیم در نظر بگیریم.

برای فعال کردن حقایق بررسی وضعیت، به سادگی باید گره(های) خود را با دسته بندی کنیم Puppet_status_check کلاس برای مثال، ممکن است موارد زیر را به مخزن کنترل خود اضافه کنید manifests/site.pp:

node default {
include ‘puppet_status_check’
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شایان ذکر است، تعریف پیش‌فرض گره برای تمام گره‌هایی اعمال می‌شود که تعریف گره خاص‌تری در گره ندارند. manifests/site.pp.

شایان ذکر است که رفتار پیش فرض از Puppet_status_check کلاس برای پیکربندی نقش بررسی وضعیت است عامل. این بدان معنی است که برای این گره ها، فقط بررسی وضعیت مربوط به عملکرد عامل عروسکی فعال است.

برای سرور عروسکی شما، در حالی که دانستن عملکرد صحیح عامل Puppet مفید است، خدمات مهم دیگری که بر روی سرور عروسکی اجرا می شوند چطور؟ برای فعال کردن بررسی وضعیت برای این سرویس‌های دیگر، تنها کاری که باید انجام دهیم این است که پارامتر نقش را تنظیم کنیم Puppet_status_check کلاس به اولیه برای گره(های) خاص. به عنوان مثال، شما manifests/site.pp همچنین ممکن است یک تعریف گره مانند این داشته باشد:

node ‘puppet-primary.corp.com’ {
class { ‘puppet_status_check’:
role => ‘primary’,
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که این تغییرات طبقه بندی در سرور(های) Puppet شما مستقر شد و عامل Puppet روی گره(های) شما اجرا شد، ما در نهایت آماده هستیم تا تمام کارهای سخت خود را بررسی کنیم.

بررسی خروجی

بیایید با نگاه کردن به آن شروع کنیم Puppet_status_checkاین واقعیت به طور مستقیم در یکی از گره های ما با نقش بررسی وضعیت تنظیم شده است عامل:

root@agent01:~# puppet facts puppet_status_check
{
“puppet_status_check”: {
“AS001”: true,
“AS003”: true,
“AS004”: true,
“S0001”: false,
“S0003”: true,
“S0012”: true,
“S0013”: true,
“S0021”: true,
“S0030”: true
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حالت ایده‌آل، در این خروجی هر یک از بررسی‌های وضعیت برمی‌گردد درست است، واقعی، به این معنی که هر چک خاصی به دنبال آن باشد مطابق انتظار است. کلیدهایی مانند AS001 شناسه های شاخص خاصی هستند که می توانند با جدولی در مستندات puppetlabs/puppet_status_check ارجاع داده شوند.

در گره مثال من، به نظر می رسد که S0001 در حال بازگشت است نادرست، یعنی چیزی با عامل Puppet در این گره خاص درست نیست. با ارجاع به جدول در مستندات ماژول ها، به سرعت می توانم تعیین کنم که عروسک خیمه شب بازی سرویس در این گره اجرا نمی‌شود و حتی مراحلی وجود دارد که به من می‌گوید چگونه وضعیت را اصلاح کنم (در این مورد پیوند مستندات است).

بیایید سعی کنیم مراحل سلف سرویس را دنبال کنیم تا ببینیم آیا نمی توانیم مشکل را حل کنیم.

root@agent01:~# puppet resource service puppet ensure=running
Notice: /Service[puppet]/ensure: ensure changed ‘stopped’ to ‘running’
service { ‘puppet’:
ensure => ‘running’,
provider => ‘systemd’,
}
root@agent01:~# puppet facts puppet_status_check
{
“puppet_status_check”: {
“AS001”: true,
“AS003”: true,
“AS004”: true,
“S0001”: true,
“S0003”: true,
“S0012”: true,
“S0013”: true,
“S0021”: true,
“S0030”: true
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عالی! حالا که همه چک ها برگشته اند درست است، واقعی در این گره، عامل Puppet دوباره در وضعیت خوبی قرار دارد.

بسیار خوب، اکنون می دانم که احتمالاً به چه چیزی فکر می کنید: “شما فقط به آن نگاه کرده اید Puppet_status_check واقعیت به طور مستقیم در یک گره. من صدها (یا هزاران) گره دارم، آیا بررسی هر یک به صورت جداگانه خسته کننده نیست؟”

مشاهده وضعیت برای چندین گره – پیچ

برای کاربران بولت، ماژول puppetlabs/puppet_status_check به راحتی یک مورد را فراهم می کند puppet_status_check::summary برای حل این اطلاعات در چندین گره برنامه ریزی کنید. مثلا:

someuser@jumpbox:~#bolt plan run puppet_status_check::summary targets=puppet-primary.corm.com,agent01.corp.com
Starting: plan puppet_status_check::summary
Finished: plan puppet_status_check::summary in 7.85 sec
{
“nodes”: {
“details”: {
“puppet-primary.corp.com”: {
“passing_tests_count”: 32,
“failed_tests_count”: 0,
“failed_tests_details”: [

] },
“agent01.corp.com”: {
“passing_tests_count”: 9,
“failed_tests_count”: 0,
“failed_tests_details”: [

] }
},
“passing”: [
“puppet-primary.corp.com”,
“agent01.corp.com”
],
“failing”: [

] },
“errors”: {
},
“status”: “passing”,
“passing_node_count”: 2,
“failing_node_count”: 0
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که در این مثال مشاهده می شود، من به صراحت دو گره را که قبلاً راه اندازی کرده بودیم هدف قرار می دهم، اگرچه در عمل ممکن است بخواهید از فایل های موجودی استفاده کنید یا بولت را به PuppetDB متصل کنید تا گروه ها را تعریف کنید تا نیازی به هدف قرار دادن گره ها به صورت جداگانه نداشته باشید.

مشاهده وضعیت برای چندین گره – PuppetDB

برای کاربران PuppetDB، شما همچنین می توانید از PuppetDB API برای جستجو در پایگاه داده برای جدیدترین موارد استفاده کنید. Puppet_status_check خروجی واقعیت گزارش شده توسط هر گره.

یک نمونه پرس و جو برای همه گره های طبقه بندی شده با Puppet_status_check کلاس:

root@puppet-primary:~# curl -s -X GET https://$(puppet config print certname):8081/pdb/query/v4 \
–cacert $(puppet config print localcacert) \
–cert $(puppet config print hostcert) \
–key $(puppet config print hostprivkey) \
–data-urlencode ‘pretty=true’ \
–data-urlencode ‘query=facts[certname,value] { name = “puppet_status_check” }’
[ {
“certname”: “agent01.corp.com”,
“value”: {
“AS001”: true,
“S0003”: true,
“S0001”: true,
“S0021”: true,
“S0030”: true,
“S0013”: true,
“AS003”: true,
“S0012”: true,
“AS004”: true
}
},
{
“certname”: “puppet-primary.corp.com”,
“value”: {
“S0035”: true,
“S0039”: true,
“AS001”: true,
“S0036”: true,
“S0038”: true,
“S0003”: true,
“S0001”: true,
“S0007”: true,
“S0008”: true,
“S0021”: true,
“S0014”: true,
“S0030”: true,
“S0024”: true,
“S0010”: true,
“S0034”: true,
“S0009”: true,
“S0005”: true,
“S0019”: true,
“S0045”: true,
“S0011”: true,
“S0017”: true,
“S0004”: true,
“S0033”: true,
“S0029”: true,
“S0013”: true,
“S0027”: true,
“AS003”: true,
“S0023”: true,
“S0016”: true,
“S0012”: true,
“S0026”: true,
“AS004”: true
}
} ]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمونه ای که برای یک مورد خاص پرس و جو می کند نقش_بررسی_وضعیت_عروسکی، در این مورد اولیه:

root@puppet-primary:~# curl -s -X GET https://$(puppet config print certname):8081/pdb/query/v4 \
–cacert $(puppet config print localcacert) \
–cert $(puppet config print hostcert) \
–key $(puppet config print hostprivkey) \
–data-urlencode ‘pretty=true’ \
–data-urlencode ‘query=facts[certname,value] { name = “puppet_status_check” and certname in facts[certname] { name = “puppet_status_check_role” and value = “primary”}}’
[ {
“certname”: “puppet-primary.corp.com”,
“value”: {
“S0035”: true,
“S0039”: true,
“AS001”: true,
“S0036”: true,
“S0038”: true,
“S0003”: true,
“S0001”: true,
“S0007”: true,
“S0008”: true,
“S0021”: true,
“S0014”: true,
“S0030”: true,
“S0024”: true,
“S0010”: true,
“S0034”: true,
“S0009”: true,
“S0005”: true,
“S0019”: true,
“S0045”: true,
“S0011”: true,
“S0017”: true,
“S0004”: true,
“S0033”: true,
“S0029”: true,
“S0013”: true,
“S0027”: true,
“AS003”: true,
“S0023”: true,
“S0016”: true,
“S0012”: true,
“S0026”: true,
“AS004”: true
}
} ]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جایزه نکته

اگر شما هم مثل من هستید و از اینکه نشانگرهای وضعیت در خروجی مرتب نشده اند ناراحتتان می کند، همیشه می توانید از فروشنده در زمان اجرای Ruby که عامل Puppet همراه با آن است و مقداری کد روبی درون خطی سریع استفاده کنید:

root@puppet-primary:~# curl -s -X GET https://$(puppet config print certname):8081/pdb/query/v4 \
–cacert $(puppet config print localcacert) \
–cert $(puppet config print hostcert) \
–key $(puppet config print hostprivkey) \
–data-urlencode ‘pretty=true’ \
–data-urlencode ‘query=facts[certname,value] { name = “puppet_status_check” and certname in facts[certname] { name = “puppet_status_check_role” and value = “primary”}}’ \
| /opt/puppetlabs/puppet/bin/ruby -rjson -e “puts JSON.pretty_generate(JSON.parse(STDIN.read).each {|h| h[‘value’] = h[‘value’].sort.to_h })”
[
{
“certname”: “puppet-primary.corp.com”,
“value”: {
“AS001”: true,
“AS003”: true,
“AS004”: true,
“S0001”: true,
“S0003”: true,
“S0004”: true,
“S0005”: true,
“S0007”: true,
“S0008”: true,
“S0009”: true,
“S0010”: true,
“S0011”: true,
“S0012”: true,
“S0013”: true,
“S0014”: true,
“S0016”: true,
“S0017”: true,
“S0019”: true,
“S0021”: true,
“S0023”: true,
“S0024”: true,
“S0026”: true,
“S0027”: true,
“S0029”: true,
“S0030”: true,
“S0033”: true,
“S0034”: true,
“S0035”: true,
“S0036”: true,
“S0038”: true,
“S0039”: true,
“S0045”: true
}
}
]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استثناهای شاخص

در حالی که من توصیه می کنم با شروع گزارش در مورد همه شاخص های پیش فرض، ممکن است سناریوهایی وجود داشته باشد که بخواهید برخی از شاخص ها را در سازمان خود حذف کنید.

به عنوان مثال، فرض کنید سرور اصلی عروسکی خود را دقیقاً همانطور که در بالا توضیح داده شد با نقش پیکربندی کرده اید اولیه. این نشانگرها را برای عامل Puppet، Puppet Server، PuppetDB و Certificate Authority فعال می کند. با این حال، فرض کنید که PuppetDB روی آن گره نصب نشده است. هر بار که عامل Puppet روی آن گره اجرا می شود، خروجی مشابهی خواهید داشت:

root@puppet-primary:~# puppet agent -t
Info: Using environment ‘production’
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Warning: Facter: Error in fact ‘puppet_status_check.S0007’ when checking postgres info: statvfs() function failed: No such file or directory
Warning: Facter: Error in fact ‘puppet_status_check.S0011′ failed to get service name: undefined method `[]’ for nil:NilClass
tail: cannot open ‘/var/log/puppetlabs/puppetdb/puppetdb.log’ for reading: No such file or directory
Notice: Requesting catalog from puppet-primary.corp.com:8140 (172.31.112.200)
Notice: Catalog compiled by puppet-primary.corp.com
Info: Caching catalog for puppet-primary.corp.com
Info: Applying configuration version ‘puppet-primary-production-f457e3d2333’
Notice: S0007 is at fault, Checks that there is at least 20% disk space free on PostgreSQL data partition. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0007]/message: defined ‘message’ as ‘S0007 is at fault, Checks that there is at least 20% disk space free on PostgreSQL data partition. Refer to documentation for required action.’
Notice: S0010 is at fault, Checks that puppetdb service is running and enabled on relevant components. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0010]/message: defined ‘message’ as ‘S0010 is at fault, Checks that puppetdb service is running and enabled on relevant components. Refer to documentation for required action.’
Notice: S0011 is at fault, Checks that postgres service is running and enabled on relevant components. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0011]/message: defined ‘message’ as ‘S0011 is at fault, Checks that postgres service is running and enabled on relevant components. Refer to documentation for required action.’
Notice: S0027 is at fault, Checks that the Puppetdb JVM heap max is set to an efficient volume. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0027]/message: defined ‘message’ as ‘S0027 is at fault, Checks that the Puppetdb JVM heap max is set to an efficient volume. Refer to documentation for required action.’
Notice: S0029 is at fault, Checks whether the number of current connections to PostgreSQL DB is approaching 90% of the max_connections defined. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0029]/message: defined ‘message’ as ‘S0029 is at fault, Checks whether the number of current connections to PostgreSQL DB is approaching 90% of the max_connections defined. Refer to documentation for required action.’
Notice: Applied catalog in 0.02 seconds

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این سناریوی خاص، تمام این خروجی نویز اشتباه است، همانطور که می دانید PuppetDB نصب نشده است. آیا واقعاً می خواهید به شما هشدار داده شود که puppetdb سرویس در حال اجرا نیست، و غیره در این سناریو؟ من شرط نمی بندم، پس بیایید این سر و صدا را خاموش کنیم؟

برای غیرفعال کردن نشانگرها، تنها کاری که باید انجام دهیم این است که آن را تنظیم کنیم indicator_exclusions پارامتر از Puppet_status_check کلاس و به آن بگویید کدام شاخص ها را حذف کند.

مثلا:

node ‘puppet-primary.corp.com’ {
class { ‘puppet_status_check’:
role => ‘primary’,
indicator_exclusions => [
‘S0007’, ‘S0010’, ‘S0011’,
‘S0017’, ‘S0027’, ‘S0029’
],
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از استقرار کد خود، عامل Puppet را اجرا کنید تا پیکربندی اعمال شود.

root@puppet-primary:~# puppet agent -t
Info: Using environment ‘production’
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Warning: Facter: Error in fact ‘puppet_status_check.S0007’ when checking postgres info: statvfs() function failed: No such file or directory
Warning: Facter: Error in fact ‘puppet_status_check.S0011′ failed to get service name: undefined method `[]’ for nil:NilClass
tail: cannot open ‘/var/log/puppetlabs/puppetdb/puppetdb.log’ for reading: No such file or directory
Notice: Requesting catalog from puppet-primary.corp.com:8140 (172.31.112.200)
Notice: Catalog compiled by puppet-primary.corp.com
Info: Caching catalog for puppet-primary.corp.com
Info: Applying configuration version ‘puppet-primary-5bc7859de41’
Notice: /Stage[main]/Puppet_status_check/File[/opt/puppetlabs/puppet/cache/state/status_check.json]/content:
— /opt/puppetlabs/puppet/cache/state/status_check.json 2024-07-31 22:18:33.311548817 +0000
+++ /tmp/puppet-file20240731-23598-baocro 2024-07-31 22:29:21.437758201 +0000
@@ -2,5 +2,5 @@
“role”: “primary”,
“pg_config”: “pg_config”,
“postgresql_service”: “postgresql@%{pg_major_version}-main”,
– “indicator_exclusions”: “[]”
+ “indicator_exclusions”: “[S0007, S0010, S0011, S0017, S0027, S0029]”
}

Notice: /Stage[main]/Puppet_status_check/File[/opt/puppetlabs/puppet/cache/state/status_check.json]/content: content changed ‘{sha256}e62e3a6ce0380a07dc426d2c936a74061daba893846696a19c0d91ef69f4cc6c’ to ‘{sha256}6db3bfddabe0b2f6e78d25a229184746ca3d003caa7980c9fbc20370d5ccb265’
Notice: Applied catalog in 0.05 seconds

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دفعه بعد که مامور Puppet اجرا می شود، تمام آن سر و صدا باید از بین برود!

root@puppet-primary:~# puppet agent -t
Info: Using environment ‘production’
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Notice: Requesting catalog from puppet-primary.corp.com:8140 (172.31.112.200)
Notice: Catalog compiled by puppet-primary.corp.com
Info: Caching catalog for puppet-primary.corp.com
Info: Applying configuration version ‘puppet-primary-production-5bc7859de41’
Notice: Applied catalog in 0.04 seconds

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

علاوه بر این، ما نباید شاخص هایی را که در خروجی واقعی حذف کرده ایم ببینیم:

root@puppet-primary:~# puppet facts puppet_status_check
{
“puppet_status_check”: {
“AS001”: true,
“AS003”: false,
“AS004”: true,
“S0001”: true,
“S0003”: true,
“S0004”: true,
“S0005”: true,
“S0008”: true,
“S0009”: true,
“S0012”: true,
“S0013”: true,
“S0014”: true,
“S0016”: true,
“S0019”: true,
“S0021”: true,
“S0023”: true,
“S0024”: true,
“S0026”: true,
“S0030”: true,
“S0033”: true,
“S0034”: true,
“S0035”: true,
“S0036”: true,
“S0038”: true,
“S0039”: true,
“S0045”: true
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگام مدیریت هر پشته فناوری، همه ما سوالات زیر را چه در داخل یا چه از همتایان خود پرسیده ایم:

  • آیا پشته به طور بهینه پیکربندی شده است؟
  • آیا مسائلی وجود دارد که نیاز به توجه فوری من (یا تیم من) داشته باشد؟
  • آیا “گوچا” بالقوه ای وجود دارد که باید در هفته ها/ماه های آینده مورد توجه قرار گیرد؟

در مورد Puppet، برای پاسخ به این سؤالات، مدیران از نظر تاریخی به موارد زیر روی می آورند:

  • بررسی خروجی تماس های مختلف HTTP API.
  • بررسی داشبوردهای عملیاتی حاوی نمایش بصری معیارهای مختلف.
  • تجزیه فایل(های) log برای اجزای مختلف.

در حالی که همه این منابع بینش ارزشمندی در مورد نحوه عملکرد یک نصب عروسکی ارائه می دهند، همه آنها در یک چیز مشترک هستند. این حجم قابل توجهی از اطلاعات ارائه شده به مدیر است. اطلاعاتی که نیاز به تجربه قبلی در مورد آنچه که باید جستجو کرد، کجا جستجو کرد و چگونه به دست آورد نیاز دارد. تجربه را کنار بگذاریم، جمع آوری همه این اطلاعات زمان می برد. زمانی که احتمالاً مجبور نیستید در وسط یک شیفت کاری شبانه وقت بگذارید. حتی اگر مقصر را پیدا کردید، آن دفترچه یادداشت با یادداشت‌های مرموز شما در مورد چگونگی حل آن از آخرین باری که با این سناریو مواجه شدید کجا رفته است؟ یا شاید این اولین باری است که در این سناریو هستید و Google-Fu شما را در حالت محروم از کافئین شکست می دهد؟

خوب، با فرضیات بس است. اگر به شما بگویم گزینه ساده تری وجود دارد چه؟ خوب، شما خوش شانس هستید، ماژول puppetlabs/puppet_status_check یک راه فعال را برای تعیین زمانی که نصب عروسک در وضعیت ایده آل نیست، ارائه می دهد. این ماژول از نشانگرهای از پیش پیکربندی شده استفاده می کند تا نه تنها خروجی ساده ای را برای تشخیص اشتباه ارائه دهد، بلکه شما را به مراحل بعدی برای تفکیک راهنمایی می کند.

“این عالی به نظر می رسد، اما چگونه می توانم این مورد را تنظیم و استفاده کنم؟” خوب بیایید شیرجه بزنیم؟

برپایی

ابتدا باید ماژول را در پایگاه کد خود وارد کنیم. اگر از یک مخزن کنترل و یک Puppetfile برای مدیریت محتویات پایگاه کد خود استفاده می کنید، به راحتی می توانید موارد زیر را به Puppetfile خود اضافه کنید، زیرا ماژول های وابستگی وجود ندارد:

mod 'puppetlabs-puppet_status_check', '0.9.2'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر وب هوک یا اتوماسیون دیگری برای مدیریت این کار برای شما ندارید، حتماً کد خود را مستقر کنید. برای مثال، کاربران r10k ممکن است با اجرای موارد زیر به صورت محلی روی سرور(های) Puppet خود مستقر شوند:

r10k deploy environment production -mv
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا دفعه بعد که عامل Puppet روی گره های این محیط اجرا می شود، Puppet_status_check و نقش_بررسی_وضعیت_عروسکی حقایق بر روی هر گره با پلاگین همگام سازی می شوند. این حقایق چیزی است که در نهایت اطلاعاتی را که به دنبال آن هستیم در اختیار ما قرار می دهد.

با این حال، قبل از شروع استفاده از این حقایق، ابتدا باید آنها را فعال کرده و به صورت اختیاری پیکربندی کنیم که کدام زیرمجموعه از چک‌هایی را که می‌خواهیم در نظر بگیریم.

برای فعال کردن حقایق بررسی وضعیت، به سادگی باید گره(های) خود را با دسته بندی کنیم Puppet_status_check کلاس برای مثال، ممکن است موارد زیر را به مخزن کنترل خود اضافه کنید manifests/site.pp:

node default {
  include 'puppet_status_check'
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شایان ذکر است، تعریف پیش‌فرض گره برای تمام گره‌هایی اعمال می‌شود که تعریف گره خاص‌تری در گره ندارند. manifests/site.pp.

شایان ذکر است که رفتار پیش فرض از Puppet_status_check کلاس برای پیکربندی نقش بررسی وضعیت است عامل. این بدان معنی است که برای این گره ها، فقط بررسی وضعیت مربوط به عملکرد عامل عروسکی فعال است.

برای سرور عروسکی شما، در حالی که دانستن عملکرد صحیح عامل Puppet مفید است، خدمات مهم دیگری که بر روی سرور عروسکی اجرا می شوند چطور؟ برای فعال کردن بررسی وضعیت برای این سرویس‌های دیگر، تنها کاری که باید انجام دهیم این است که پارامتر نقش را تنظیم کنیم Puppet_status_check کلاس به اولیه برای گره(های) خاص. به عنوان مثال، شما manifests/site.pp همچنین ممکن است یک تعریف گره مانند این داشته باشد:

node 'puppet-primary.corp.com' {
  class { 'puppet_status_check':
    role => 'primary',
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که این تغییرات طبقه بندی در سرور(های) Puppet شما مستقر شد و عامل Puppet روی گره(های) شما اجرا شد، ما در نهایت آماده هستیم تا تمام کارهای سخت خود را بررسی کنیم.

بررسی خروجی

بیایید با نگاه کردن به آن شروع کنیم Puppet_status_checkاین واقعیت به طور مستقیم در یکی از گره های ما با نقش بررسی وضعیت تنظیم شده است عامل:

root@agent01:~# puppet facts puppet_status_check
{
  "puppet_status_check": {
    "AS001": true,
    "AS003": true,
    "AS004": true,
    "S0001": false,
    "S0003": true,
    "S0012": true,
    "S0013": true,
    "S0021": true,
    "S0030": true
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حالت ایده‌آل، در این خروجی هر یک از بررسی‌های وضعیت برمی‌گردد درست است، واقعی، به این معنی که هر چک خاصی به دنبال آن باشد مطابق انتظار است. کلیدهایی مانند AS001 شناسه های شاخص خاصی هستند که می توانند با جدولی در مستندات puppetlabs/puppet_status_check ارجاع داده شوند.

در گره مثال من، به نظر می رسد که S0001 در حال بازگشت است نادرست، یعنی چیزی با عامل Puppet در این گره خاص درست نیست. با ارجاع به جدول در مستندات ماژول ها، به سرعت می توانم تعیین کنم که عروسک خیمه شب بازی سرویس در این گره اجرا نمی‌شود و حتی مراحلی وجود دارد که به من می‌گوید چگونه وضعیت را اصلاح کنم (در این مورد پیوند مستندات است).

جدول نشانگر بررسی وضعیت

بیایید سعی کنیم مراحل سلف سرویس را دنبال کنیم تا ببینیم آیا نمی توانیم مشکل را حل کنیم.

root@agent01:~# puppet resource service puppet ensure=running
Notice: /Service[puppet]/ensure: ensure changed 'stopped' to 'running'
service { 'puppet':
  ensure   => 'running',
  provider => 'systemd',
}
root@agent01:~# puppet facts puppet_status_check
{
  "puppet_status_check": {
    "AS001": true,
    "AS003": true,
    "AS004": true,
    "S0001": true,
    "S0003": true,
    "S0012": true,
    "S0013": true,
    "S0021": true,
    "S0030": true
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عالی! حالا که همه چک ها برگشته اند درست است، واقعی در این گره، عامل Puppet دوباره در وضعیت خوبی قرار دارد.

بسیار خوب، اکنون می دانم که احتمالاً به چه چیزی فکر می کنید: “شما فقط به آن نگاه کرده اید Puppet_status_check واقعیت به طور مستقیم در یک گره. من صدها (یا هزاران) گره دارم، آیا بررسی هر یک به صورت جداگانه خسته کننده نیست؟”

مشاهده وضعیت برای چندین گره – پیچ

برای کاربران بولت، ماژول puppetlabs/puppet_status_check به راحتی یک مورد را فراهم می کند puppet_status_check::summary برای حل این اطلاعات در چندین گره برنامه ریزی کنید. مثلا:

someuser@jumpbox:~#bolt plan run puppet_status_check::summary targets=puppet-primary.corm.com,agent01.corp.com
Starting: plan puppet_status_check::summary
Finished: plan puppet_status_check::summary in 7.85 sec
{
  "nodes": {
    "details": {
      "puppet-primary.corp.com": {
        "passing_tests_count": 32,
        "failed_tests_count": 0,
        "failed_tests_details": [

        ]
      },
      "agent01.corp.com": {
        "passing_tests_count": 9,
        "failed_tests_count": 0,
        "failed_tests_details": [

        ]
      }
    },
    "passing": [
      "puppet-primary.corp.com",
      "agent01.corp.com"
    ],
    "failing": [

    ]
  },
  "errors": {
  },
  "status": "passing",
  "passing_node_count": 2,
  "failing_node_count": 0
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که در این مثال مشاهده می شود، من به صراحت دو گره را که قبلاً راه اندازی کرده بودیم هدف قرار می دهم، اگرچه در عمل ممکن است بخواهید از فایل های موجودی استفاده کنید یا بولت را به PuppetDB متصل کنید تا گروه ها را تعریف کنید تا نیازی به هدف قرار دادن گره ها به صورت جداگانه نداشته باشید.

مشاهده وضعیت برای چندین گره – PuppetDB

برای کاربران PuppetDB، شما همچنین می توانید از PuppetDB API برای جستجو در پایگاه داده برای جدیدترین موارد استفاده کنید. Puppet_status_check خروجی واقعیت گزارش شده توسط هر گره.

یک نمونه پرس و جو برای همه گره های طبقه بندی شده با Puppet_status_check کلاس:

root@puppet-primary:~# curl -s -X GET https://$(puppet config print certname):8081/pdb/query/v4 \
--cacert $(puppet config print localcacert) \
--cert $(puppet config print hostcert) \
--key $(puppet config print hostprivkey) \
--data-urlencode 'pretty=true' \
--data-urlencode 'query=facts[certname,value] { name = "puppet_status_check" }'
[ {
    "certname": "agent01.corp.com",
    "value": {
      "AS001": true,
      "S0003": true,
      "S0001": true,
      "S0021": true,
      "S0030": true,
      "S0013": true,
      "AS003": true,
      "S0012": true,
      "AS004": true
    }
  },
  {
    "certname": "puppet-primary.corp.com",
    "value": {
      "S0035": true,
      "S0039": true,
      "AS001": true,
      "S0036": true,
      "S0038": true,
      "S0003": true,
      "S0001": true,
      "S0007": true,
      "S0008": true,
      "S0021": true,
      "S0014": true,
      "S0030": true,
      "S0024": true,
      "S0010": true,
      "S0034": true,
      "S0009": true,
      "S0005": true,
      "S0019": true,
      "S0045": true,
      "S0011": true,
      "S0017": true,
      "S0004": true,
      "S0033": true,
      "S0029": true,
      "S0013": true,
      "S0027": true,
      "AS003": true,
      "S0023": true,
      "S0016": true,
      "S0012": true,
      "S0026": true,
      "AS004": true
    }
  } ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمونه ای که برای یک مورد خاص پرس و جو می کند نقش_بررسی_وضعیت_عروسکی، در این مورد اولیه:

root@puppet-primary:~# curl -s -X GET https://$(puppet config print certname):8081/pdb/query/v4 \
--cacert $(puppet config print localcacert) \
--cert $(puppet config print hostcert) \
--key $(puppet config print hostprivkey) \
--data-urlencode 'pretty=true' \
--data-urlencode 'query=facts[certname,value] { name = "puppet_status_check" and certname in facts[certname] { name = "puppet_status_check_role" and value = "primary"}}'
[ {
    "certname": "puppet-primary.corp.com",
    "value": {
      "S0035": true,
      "S0039": true,
      "AS001": true,
      "S0036": true,
      "S0038": true,
      "S0003": true,
      "S0001": true,
      "S0007": true,
      "S0008": true,
      "S0021": true,
      "S0014": true,
      "S0030": true,
      "S0024": true,
      "S0010": true,
      "S0034": true,
      "S0009": true,
      "S0005": true,
      "S0019": true,
      "S0045": true,
      "S0011": true,
      "S0017": true,
      "S0004": true,
      "S0033": true,
      "S0029": true,
      "S0013": true,
      "S0027": true,
      "AS003": true,
      "S0023": true,
      "S0016": true,
      "S0012": true,
      "S0026": true,
      "AS004": true
    }
  } ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جایزه نکته

اگر شما هم مثل من هستید و از اینکه نشانگرهای وضعیت در خروجی مرتب نشده اند ناراحتتان می کند، همیشه می توانید از فروشنده در زمان اجرای Ruby که عامل Puppet همراه با آن است و مقداری کد روبی درون خطی سریع استفاده کنید:

root@puppet-primary:~# curl -s -X GET https://$(puppet config print certname):8081/pdb/query/v4 \
--cacert $(puppet config print localcacert) \
--cert $(puppet config print hostcert) \
--key $(puppet config print hostprivkey) \
--data-urlencode 'pretty=true' \
--data-urlencode 'query=facts[certname,value] { name = "puppet_status_check" and certname in facts[certname] { name = "puppet_status_check_role" and value = "primary"}}' \
| /opt/puppetlabs/puppet/bin/ruby -rjson -e "puts JSON.pretty_generate(JSON.parse(STDIN.read).each {|h| h['value'] = h['value'].sort.to_h })"
[
  {
    "certname": "puppet-primary.corp.com",
    "value": {
      "AS001": true,
      "AS003": true,
      "AS004": true,
      "S0001": true,
      "S0003": true,
      "S0004": true,
      "S0005": true,
      "S0007": true,
      "S0008": true,
      "S0009": true,
      "S0010": true,
      "S0011": true,
      "S0012": true,
      "S0013": true,
      "S0014": true,
      "S0016": true,
      "S0017": true,
      "S0019": true,
      "S0021": true,
      "S0023": true,
      "S0024": true,
      "S0026": true,
      "S0027": true,
      "S0029": true,
      "S0030": true,
      "S0033": true,
      "S0034": true,
      "S0035": true,
      "S0036": true,
      "S0038": true,
      "S0039": true,
      "S0045": true
    }
  }
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استثناهای شاخص

در حالی که من توصیه می کنم با شروع گزارش در مورد همه شاخص های پیش فرض، ممکن است سناریوهایی وجود داشته باشد که بخواهید برخی از شاخص ها را در سازمان خود حذف کنید.

به عنوان مثال، فرض کنید سرور اصلی عروسکی خود را دقیقاً همانطور که در بالا توضیح داده شد با نقش پیکربندی کرده اید اولیه. این نشانگرها را برای عامل Puppet، Puppet Server، PuppetDB و Certificate Authority فعال می کند. با این حال، فرض کنید که PuppetDB روی آن گره نصب نشده است. هر بار که عامل Puppet روی آن گره اجرا می شود، خروجی مشابهی خواهید داشت:

root@puppet-primary:~# puppet agent -t
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Warning: Facter: Error in fact 'puppet_status_check.S0007' when checking postgres info: statvfs() function failed: No such file or directory
Warning: Facter: Error in fact 'puppet_status_check.S0011' failed to get service name: undefined method `[]' for nil:NilClass
tail: cannot open '/var/log/puppetlabs/puppetdb/puppetdb.log' for reading: No such file or directory
Notice: Requesting catalog from puppet-primary.corp.com:8140 (172.31.112.200)
Notice: Catalog compiled by puppet-primary.corp.com
Info: Caching catalog for puppet-primary.corp.com
Info: Applying configuration version 'puppet-primary-production-f457e3d2333'
Notice: S0007 is at fault, Checks that there is at least 20% disk space free on PostgreSQL data partition. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0007]/message: defined 'message' as 'S0007 is at fault, Checks that there is at least 20% disk space free on PostgreSQL data partition. Refer to documentation for required action.'
Notice: S0010 is at fault, Checks that puppetdb service is running and enabled on relevant components. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0010]/message: defined 'message' as 'S0010 is at fault, Checks that puppetdb service is running and enabled on relevant components. Refer to documentation for required action.'
Notice: S0011 is at fault, Checks that postgres service is running and enabled on relevant components. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0011]/message: defined 'message' as 'S0011 is at fault, Checks that postgres service is running and enabled on relevant components. Refer to documentation for required action.'
Notice: S0027 is at fault, Checks that the Puppetdb JVM heap max is set to an efficient volume. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0027]/message: defined 'message' as 'S0027 is at fault, Checks that the Puppetdb JVM heap max is set to an efficient volume. Refer to documentation for required action.'
Notice: S0029 is at fault, Checks whether the number of current connections to PostgreSQL DB is approaching 90% of the max_connections defined. Refer to documentation for required action.
Notice: /Stage[main]/Puppet_status_check/Notify[puppet_status_check S0029]/message: defined 'message' as 'S0029 is at fault, Checks whether the number of current connections to PostgreSQL DB is approaching 90% of the max_connections defined. Refer to documentation for required action.'
Notice: Applied catalog in 0.02 seconds
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این سناریوی خاص، تمام این خروجی نویز اشتباه است، همانطور که می دانید PuppetDB نصب نشده است. آیا واقعاً می خواهید به شما هشدار داده شود که puppetdb سرویس در حال اجرا نیست، و غیره در این سناریو؟ من شرط نمی بندم، پس بیایید این سر و صدا را خاموش کنیم؟

برای غیرفعال کردن نشانگرها، تنها کاری که باید انجام دهیم این است که آن را تنظیم کنیم indicator_exclusions پارامتر از Puppet_status_check کلاس و به آن بگویید کدام شاخص ها را حذف کند.

مثلا:

node 'puppet-primary.corp.com' {
  class { 'puppet_status_check':
    role                 => 'primary',
    indicator_exclusions => [
      'S0007', 'S0010', 'S0011',
      'S0017', 'S0027', 'S0029'
    ],
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از استقرار کد خود، عامل Puppet را اجرا کنید تا پیکربندی اعمال شود.

root@puppet-primary:~# puppet agent -t
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Warning: Facter: Error in fact 'puppet_status_check.S0007' when checking postgres info: statvfs() function failed: No such file or directory
Warning: Facter: Error in fact 'puppet_status_check.S0011' failed to get service name: undefined method `[]' for nil:NilClass
tail: cannot open '/var/log/puppetlabs/puppetdb/puppetdb.log' for reading: No such file or directory
Notice: Requesting catalog from puppet-primary.corp.com:8140 (172.31.112.200)
Notice: Catalog compiled by puppet-primary.corp.com
Info: Caching catalog for puppet-primary.corp.com
Info: Applying configuration version 'puppet-primary-5bc7859de41'
Notice: /Stage[main]/Puppet_status_check/File[/opt/puppetlabs/puppet/cache/state/status_check.json]/content:
--- /opt/puppetlabs/puppet/cache/state/status_check.json    2024-07-31 22:18:33.311548817 +0000
+++ /tmp/puppet-file20240731-23598-baocro   2024-07-31 22:29:21.437758201 +0000
@@ -2,5 +2,5 @@
   "role": "primary",
   "pg_config": "pg_config",
   "postgresql_service": "postgresql@%{pg_major_version}-main",
-  "indicator_exclusions": "[]"
+  "indicator_exclusions": "[S0007, S0010, S0011, S0017, S0027, S0029]"
 }

Notice: /Stage[main]/Puppet_status_check/File[/opt/puppetlabs/puppet/cache/state/status_check.json]/content: content changed '{sha256}e62e3a6ce0380a07dc426d2c936a74061daba893846696a19c0d91ef69f4cc6c' to '{sha256}6db3bfddabe0b2f6e78d25a229184746ca3d003caa7980c9fbc20370d5ccb265'
Notice: Applied catalog in 0.05 seconds
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دفعه بعد که مامور Puppet اجرا می شود، تمام آن سر و صدا باید از بین برود!

root@puppet-primary:~# puppet agent -t
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Notice: Requesting catalog from puppet-primary.corp.com:8140 (172.31.112.200)
Notice: Catalog compiled by puppet-primary.corp.com
Info: Caching catalog for puppet-primary.corp.com
Info: Applying configuration version 'puppet-primary-production-5bc7859de41'
Notice: Applied catalog in 0.04 seconds
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

علاوه بر این، ما نباید شاخص هایی را که در خروجی واقعی حذف کرده ایم ببینیم:

root@puppet-primary:~# puppet facts puppet_status_check
{
  "puppet_status_check": {
    "AS001": true,
    "AS003": false,
    "AS004": true,
    "S0001": true,
    "S0003": true,
    "S0004": true,
    "S0005": true,
    "S0008": true,
    "S0009": true,
    "S0012": true,
    "S0013": true,
    "S0014": true,
    "S0016": true,
    "S0019": true,
    "S0021": true,
    "S0023": true,
    "S0024": true,
    "S0026": true,
    "S0030": true,
    "S0033": true,
    "S0034": true,
    "S0035": true,
    "S0036": true,
    "S0038": true,
    "S0039": true,
    "S0045": true
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا