مدیریت متمرکز پیکربندی با استفاده از SALT

آموزش SALT1 مدیریت پیکربندی1-1 مقدمهابزار salt یک راهکار جدید در مدیریت زیرساخت با قابلیت‌هایی همچون نصب و راه‌اندازی آسان، با قابلیت گسترش‌پذیری سریع و آسان ایجاد کرده است. این ابزار با فراهم آوردن یک ارتباط پویا و مستقل از دیگر سرویس‌ها امکان هماهنگی، اجرای دستورات از راه دور و مدیریت پیکربندی را فراهم می‌آورد.به دلیل تنوع محصولات و فعالیت‌های پوشش داده شده، در ابزار Salt تلاش‌گردیده است تا اکثر امکانات به‌منظور قابل‌گسترش بودن، به‌صورت پیمانه‌ای پیاده‌سازی شده است. به‌طورمعمول تنها پیمانه‌های اجرایی و وضعیت موردتوجه‌ قرار می‌گیرند. بااین‌وجود قالب بخش‌های Salt به‌صورت پیمانه‌ای توسعه یافته است که در ادامه به برخی از آن‌ها خواهیم پرداخت.1-2 ساختار کلیدر شکل ‏2‑1معماری ارتباط masterبا minionها در ابزار saltمشاهده می‌شود.شکل ‏2‑1معماری ارتباط master با minionهادر ادامه‌ی این بخش در مثال‌ها از ساختاری مشابه شکل ‏2‑1 استفاده خواهد شد که در آن پنج minion به نام‌های ubuntu-200-199 ، ubuntu-220-235، ubuntu-220-249 ، ubuntu-221-22 و ubuntu-221-55 به ماشین master با نام ubunut-221-0 متصل شده است.1-2-1 راهکار‌های ارتباط در سامانهدر معماری برنامه‌های توزیع‌شده که در آن‌ها اجزای برنامه بر روی چندین میزبان چندین هسته‌ی پردازشی از طریق اینترنت به یکدیگر متصل‌ هستند، به‌طورمعمول ارتباط میان اجزا از طریق گذرگاه رخداد و یا پیام‌رسانی برقرار می‌شود.بهره‌گیری از این راهکارها امکان ارتباط نامتقارن با یکدیگر را فراهم می‌آورد. این راهکار‌ها به‌طورمعمول از مدل انتشار/اشتراک برای تبادل اطلاعات بهره می‌گیرند. در معماری ابزار Salt دو راهکار زیر را برای ارتباط پیشنهاد می‌کند.1-2-1-1 راهکارZeroMQبا وجود مزایای متعدد روش‌ها صف‌بندی پیام، یکی از معایب این روش‌ها عدم گسترش‌پذیری برای ابزار‌هایی نظیر Salt است.1-2-1-2 راهکار RAETراهکاری مطمئن با سربار بسیار کمتر از ZeroMQ که از پروتکل UDP استفاده می‌کند و برای ابزار salt در حال توسعه است.1-2-2 امنیت در ارتباطبرای ایجاد اتصال و امنیت در ارتباط، در ابزار salt از مکانیسم کلید عمومی برای ارتباط اولیه با master و رمزنگاری مقارن AES با طول کلید 256 بیت برای رمزنگاری داده‌های ارتباط استفاده می‌شود.1-2-3 بهره‌گیری از قالب برای انعطاف در پیکربندیهر قابلیتی در این ابزار به‌صورت فایل نمایش داده می‌شود. برای سادگی نمایش و خوانایی آن‌ها از زبان نشانه‌گذاری YAML استفاده است. این زبان علی‌رغم سادگی و خوانایی، قابلیت توسعه و گسترش‌پذیری ابزار را افزایش می‌دهد.همچنین ابزار Salt از موتور ایجاد قالب Jinja2 در پایتون بهره می‌برد. این ابزار که به‌صورت کامل از Unicode پشتیبانی می‌کند، با الهام از ساختار قالب در سامانه‌ی Django نوشته شده و قابلیت‌های فراوانی را به توسعه‌دهنده می‌دهد. یکی دیگر از قابلیت‌های بسیار مهم در این موتور، اجرا و تولید قالب به‌صورت ایزوله شده و درون ساعت شنی، همراه با قابلیت نادیده‌گیری مواردی برای برنامه‌های کاربردی در مواردی که امنیت از اهمیت بالای برخوردار است، اشاره کرد.ازجمله ویژگی‌های مهم Jinja2 می‌توان به موارد زیر اشاره کرد:اجرای فرمان‌ها در حالت ساعت شنینادیده‌گیری خودکار HTMLبرای جلوگیری از حملات XSSقابلیت ارث‌بری در قالب‌ها برای کاهش تکرار و اشتباه در ایجاد قالبکارایی بالا در ساخت و تفسیر قالب‌هاساختار نحوی قابل پیکربندی.1-3 راهنمای نصبراهکار نصب ابزار salt در توزیع‌های مختلف متفاوت است ولی ازآنجایی‌که نصب و توسعه‌ی آسان یکی از اهداف این ابزار است، در اکثر توزیع‌ها تنها با چند دستور قابل نصب و راه‌اندازی است. بااین‌وجود در توزیع‌های Ubuntu و debian دستورات پیش‌نیازی وجود دارد که در قطعه برنامه ‏2‑1 و قطعه برنامه ‏2‑2 آورده شده است. این دستورات تنها برای افزودن مخازن موردنیاز به سامانه‌ هستند.$ sudo apt-get install python-software-properties software-properties-common$ sudo add-apt-repository ppa:saltstack/salt$ sudo apt-get updateقطعه برنامه ‏2‑1دستورات پیش‌نیاز برای نصب salt در ubuntu$ sudo echo &quotdeb http://debian.saltstack.com/debian wheezy-saltstack main&quot >> /etc/apt/sources.list.d/salt.rep$ wget -q -O- &quothttp://debian.saltstack.com/debian-salt-team-joehealy.gpg.key&quot | apt-key add –$ apt-get updateقطعه برنامه ‏2‑2 دستورات پیش‌نیاز برای نصب salt در debianعلاوه بر راهکار‌های ارائه شده برای نصب هر یک از اجزا به‌صورت جدا‌گانه، ازآنجایی‌که این ابزار بر روی PyPi قرار دارد، می‌توان مطابق قطعه برنامه ‏2‑3 ابزار masterرا بر روی هر توزیع نصب کرد.pip install saltقطعه برنامه ‏2‑3 نصب کلیه‌ی ابزار‌ها با استفاده از pip1-3-1 نصب و پیکربندی اولیه masterهمان‌طور که در بخش ‏2-2 بیان شد، سامانه‌ای که نقش مدیریت دیگر سامانه‌ها را بر عهده دارد، master نامیده می‌شود. درصورتی‌که از قطعه برنامه ‏2‑3 استفاده نشده باشد، می‌توان برای نصب و راه‌اندازی این بخش از سامانه، بر روی ماشین موردنظر با توجه به توزیع ماشین از هر یک از قطعه برنامه ‏2‑4 و قطعه برنامه ‏2‑5 بهره برد.$ sudo apt-get install salt-master$ sudo service salt-master startقطعه برنامه ‏2‑4 نصب master بر روی توزیع‌های ubuntu و debian$sudo yum install salt-master$sudo systemctl enable salt-master.serviceقطعه برنامه ‏2‑5 نصب master بر روی توزیع‌ fedoraپس از نصب این بخش، فایل پیکربندی در آدرس /etc/salt/masterقرار خواهد گرفت که در بخش‌های بعدازآن بهره خواهیم جست. در این فایل آدرس دسترسی به شبکه به‌صورت پیکربندی ‏2‑1 اضافه گردد و سرویس salt-master راه‌اندازی مجدد گردد.interface: 10.0.0.1پیکربندی ‏2‑1تعیین آدرس در فایل پیکربندی master1-3-2 نصب و پیکربندی اولیه minionهمان‌طور که در بخش ‏2-2 بیان شد، سامانه‌ای که در سامانه به‌وسیله‌ی master مدیریت می‌شود دیگر سامانه‌ها را بر عهده دارد، minion نامیده می‌شود. درصورتی‌که از قطعه برنامه ‏2‑3 استفاده نشده باشد، می‌توان برای نصب و راه‌اندازی این بخش از سامانه، بر روی ماشین موردنظر با توجه به توزیع ماشین از هر یک از قطعه برنامه ‏2‑6 و قطعه برنامه ‏2‑7 بهره برد.$ sudo apt-get install salt-master$ sudo service salt-master startقطعه برنامه ‏2‑6 نصب minion بر روی توزیع‌های ubuntu و debian$sudo yum install salt-master$sudo systemctl enable salt-master.serviceقطعه برنامه ‏2‑7 نصب minion بر روی توزیع‌ fedoraپس از نصب این بخش، فایل پیکربندی در آدرس /etc/salt/minion قرار خواهد گرفت که در بخش‌های بعدازآن بهره خواهیم جست. در این فایل در صورت تمایل به اتصال به masterباید آدرس را به‌صورت پیکربندی ‏2‑2 به فایل پیکربندی اضافه و سرویس را راه‌اندازی مجدد کرد.master: 10.0.0.1پیکربندی ‏2‑2تعیین آدرس master در فایل پیکربندی minionبا اجرای minion اسمی برای ماشین جاری ایجاد می‌شود که در فایل /etc/salt/minion_id قرار می‌گیرد. از این اسم برای احراز هویت در master استفاده می‌شود. برای تعیین اسم ماشین، موارد زیر به ترتیب انجام می‌شود:1- فراخوانی تابع socket.getfqdn() در python2- بررسی محتوای فایل /etc/hostname در ماشین‌های که سیستم‌عامل آن‌ها windows نیست.3- بررسی فایل /etc/hosts و چک کردن هر مقداری که با آدرس 127.0.0.0/8 متناظر است.1-3-3 پذیرش اتصال minion ها به masterهمان‌طور که در ‏2-2-2 بیان شد، ارتباط بین master و minion از طریق رمزنگاری امن می‌گردد. برای جلوگیری از ایجاد ارتباط‌های ناخواسته، پس از اتصال minion به master باید آن minion در master احراز هویت گردد. برای پذیرش یک minion از طریق قطعه برنامه ‏2‑8 عمل می‌کنیم.$ salt-key –a MINION-NAMEقطعه برنامه ‏2‑8پذیرش یک اتصال در masterهمچنین می‌توان کلید تمام minionها را به صورت همزمان با قطعه برنامه ‏2‑9 پذیرفت.$ salt-key -Aقطعه برنامه ‏2‑9 پذیرش تمام کلید‌ها در masterبرای عدم پذیرش یک minion باید از قطعه برنامه ‏2‑10 استفاده کرد.$ salt-key -r MINION-NAMEقطعه برنامه ‏2‑10 عدم پذیرش یک اتصال در masterبرای مشاهده‌ی وضعیت تمام اتصالات می‌توان از قطعه برنامه ‏2‑11 استفاده کرد.$ salt-key -Lقطعه برنامه ‏2‑11مشاهده‌ی لیست وضعیت تمام اتصالات در masterبه عنوان مثال در شکل ‏2‑2مراحل مشاهده‌ی وضعیت اتصال minonها و پذیرش تمام کلید‌ها نشان داده شده است. در این شکل ابتدا با دستور salt-key –Lتمام کلید‌هایی که هنوز پذیرفته نشده اند مشاهده می‌شود. در ادامه با دستور salt-key –A تمام کلید‌ها پذیرفته می‌شوند که نتیجه‌ی آن را می‌توان با تغییر وضعیت نام minionها به حالت پذیرفته شده مشاهده کرد.شکل ‏2‑2 مراحل پذیرش تمام کلید‌ها در master1-4 انتخاب minion برای اجرای فرمانهمان‌طور که گفته‌شده هر master می‌تواند چندین minion را مدیریت کند. برای مشخص کردن ماشینی که قرار است فرمان‌ها بر روی آن اجرا شود می‌توان از روش‌های مختلفی استفاده کرد که در ادامه به آن‌ها خواهیم پرداخت.1-4-1 نام Minionهر minion با نام مشخصی در master ثبت‌نام می‌کند. برای اجرای دستورات می‌توان با استفاده از نام minionها به آن‌ها فرمان‌هایی را صادر کرد. در ادامه دستور test.ping را که تنها وجود ارتباط بین master و minion را با برگرداندن مقدار true به ازای هر فراخوانی مشخص می‌کند و ارتباطی با دستور سیستمی ping ندارد را بر روی مثال ‏2-2 نمایش خواهیم داد.با استفاده از قطعه برنامه ‏2‑12 می‌توان دستور test.ping را تنها بر روی ماشین ubuntu-220-199 اجرا کرد. در شکل ‏2‑3 نیز نتیجه‌ی اجرای این دستور قابل مشاهده است.$ salt 'ubuntu-220-199' test.pingقطعه برنامه ‏2‑12اجرای دستور Pingبر روی ماشین ubuntu-220-199شکل ‏2‑3 اجرای دستور تنها بر روی یک minionهمچنین می‌توان با استفاده از عبارات منظم دستورات را بر روی چندین دستگاه مختلف اجرا کرد. به عنوان مثال با استفاده از قطعه برنامه ‏2‑13 دستور test.ping بر روی ماشین‌هایی که در نام آنها‌ 220و 221 وجود دارد، اجرا می‌شود. در شکل ‏2‑4 نتیجه‌ی اجرای قطعه برنامه ‏2‑13 آورده شده است.$ salt '*220*' test.ping$ salt '*221*' test.pingقطعه برنامه ‏2‑13اجرای دستور Ping بر روی ماشین‌هایی که در نام آنها‌ 220و 221 وجود داردشکل ‏2‑4اجرای دستور Ping بر روی ماشین‌هایی که در نام آنها‌ 220 و 221 وجود داردبا استفاده از قطعه برنامه ‏2‑14بر روی تمام ماشین‌ها دستور ping را اجرا می‌شود که نتیجه‌ی آن را در شکل ‏2‑5 آورده شده است.$ salt '*' test.pingقطعه برنامه ‏2‑14اجرای دستور Ping بر روی تمام ماشین‌هاشکل ‏2‑5 اجرای دستور pingبر روی تمام ماشین‌ها1-4-2 آدرسIP ماشینمی‌توان از طریق آدرس شبکه نیز ماشین‌های موردنظر را انتخاب کرد. به‌عنوان‌مثال در قطعه برنامه ‏2‑15 دستور pingتنها بر روی ماشین با آدرس 192.168.40.20 اجرا می‌شود.salt -S 192.168.40.20 test.pingقطعه برنامه ‏2‑15اجرای دستور ping بر روی ماشین با ip مشخصهمچنین می‌توان دستورات را بر روی زیر‌دامنه‌ای از شبکه اجرا کرد. به‌عنوان‌مثال در قطعه برنامه ‏2‑16 دستور pingبر روی زیر دامنه‌ی 10.0.0.0/24 اجرا می‌شود.salt -S 10.0.0.0/24 test.pingقطعه برنامه ‏2‑16 اجرای دستورات بر روی زیر دامنه‌1-4-3 مقادیر Grainمقادیر Grainها مشخصاتی هستند که minionها برای master ارسال می‌کنند. این مشخصات که شامل مشخصات سیستم‌عامل، مشخصات سخت‌افزاری هستند می‌توانند در انتخاب هدف دستور‌ها مورد استفاده قرار گیرند. به‌عنوان‌مثال با استفاده از قطعه برنامه ‏2‑17 می‌توان از حضور ماشین‌های با سیستم‌عامل centOS اطلاع یافت.salt -G 'os:CentOS' test.pingقطعه برنامه ‏2‑17 اجرای دستور بر روی سیستم‌عامل خاصهمچنین با استفاده از قطعه برنامه ‏2‑18 می‌توان تعداد پردازنده‌های ماشین‌های با معماری 64 بیتی را مشاهده کرد.salt -G 'cpuarch:x86_64' grains.item num_cpusقطعه برنامه ‏2‑18 اجرای دستور بر روی ماشین با معماری خاص1-4-4 مقادیر Pillarعلاوه بر اطلاعاتی که هر minion از بررسی مشخصات خود جمع‌آوری و به master انتقال ‌می‌دهد، salt بستری ایمن برای minionها فراهم آورده است تا هر minion اطلاعات منحصربه‌فرد خود را که نیازی به اشتراک‌گذاری آن‌ها نیست را نگه‌داری کند. به‌عبارت‌دیگر grainاطلاعاتی است که minionها از وضعیت خود جمع‌آوری می‌کنند و به master انتقال می‌دهند ولی pillar اطلاعاتی است که master به‌صورت محرمانه در مورد هر minion به‌صورت جداگانه نگه‌داری می‌کند. به همین دلیل اطلاعاتی نظیر نوع سیستم‌عامل و نوع سخت‌افزار در grain و مواردی همچون کلید‌های رمزنگاری در pillarنگه‌داری می‌شود. اطلاعات موجود در pillar نیز می‌تواند برای انتخاب هدف دستورات مورد استفاده قرار گیرد.1-4-5 گروهی از Minionابزار salt امکان گروه‌بندی minion ها را نیز در اختیار قرار می‌دهد. هر minion ممکن است در چند گروه مختلف حضور داشته باشد.1-4-6 اجرای دسته‌ایهمان‌طور که در بخش‌های گذشته بیان شد می‌توان در هر دستور تعدادی از ماشین‌ها را انتخاب کرد. حال اگر بخواهیم اجرای دستور به‌صورت دسته‌ای، هر بار، بر روی بخشی از این گروه اجرا شود، مطابق دستورات زیر عمل می‌کنیم.1-4-6-1 اجرای تعداد مشخصیهمان‌طور که گفته شد می‌توان بر روی تعداد مشخصی از هر مجموعه‌ی تعیین شده از ماشین‌ها دستورات را اجرا کرد. به‌عنوان‌مثال در قطعه برنامه ‏2‑19 دستور ping بر روی تمامی ماشین‌ها، هر بار به تعداد 10 تا و به‌صورت پشت سر هم اجرا می‌شود.$ salt '*' -b 10 test.pingقطعه برنامه ‏2‑19اجرای دستور ping هر بار بر روی 10 ماشین1-4-6-2 اجرای درصد مشخصیمی‌توان در اجرای فرمان‌ها، درصد مشخصی را برای هر دستور مشخص کرد. به‌عنوان‌مثال در قطعه برنامه ‏2‑20هر بار در 25% ماشین‌هایی که سیستم‌عامل آن‌ها Redhat است، سرویس apache سیگنال راه‌اندازی مجدد دریافت می‌کنند.$salt -G 'os:RedHat' --batch-size 25% apache.signal restartقطعه برنامه ‏2‑20 اجرای دستور بر روی 25% ماشین‌های با سیستم‌عامل RedHat1-5 سامانه‌ی سرویس‌دهنده‌ی فایلابزار salt برای توزیع فایل‌های در minion ها از یک سرویس‌دهنده‌ی فایل بهره می‌برد. سرویس‌دهنده‌ی فایل یک سرویس‌دهنده‌ی بدون حالت بر روی بستر ارتباطی ZeroMQ است که در master پیاده ‌شده است. هدف از این سرویس‌دهنده در دسترس قرار دادن فایلهای پیکربندی در سیستم وضعیت salt است؛ بااین‌وجود هر نوع فایلی از طریق این سامانه قابل‌توزیع است. این سامانه علاوه بر توانایی مدیریت فایل‌های حجیم، توانایی مدیریت کارآمد فایل‌های با حجم کم را نیز دارد.1-5-1 سرویس‌دهنده‌ی فایل به‌صورت محلیسامانه‌ی سرویس‌دهنده‌ی فایل با آگاهی از متغیر‌های محیطی قادر به تخصیص مسیر‌های مختلفی به‌عنوان ریشه است. این قابلیت علاوه بر انعطاف‌پذیری امکان مدیریت بهتر فایل‌ها را فراهم می‌آورد. لیست تنظیمات محیط در سرویس‌دهنده‌ی فایل نشان‌دهنده‌ی مسیر‌هایی است که فایل‌ها برای اشتراک در آن‌ها قرار دارند. برای پیدا کردن یک فایل به ترتیب تعریف مسیر‌ها در فایل پیکربندی جستجو انجام می‌شود. به‌عنوان‌مثال در پیکربندی ‏2‑3 که چگونگی تعریف مسیر‌ها در فایل پیکربندی master قرارگرفته است، درصورتی‌که بخواهیم به آدرس salt://httpd/httpd.conf دسترسی داشته باشیم ابتدا مسیر /srv/salt/base/httpd/httpd.conf مورد جستجو قرار می‌گیرد و در صورت پیدا نشدن، مسیر /srv/salt/failover/httpd/httpd.conf بررسی می‌شود. استفاده از مسیر‌های مختلف، تنها به دلیل جداسازی منطقی فایل‌ها از یکدیگر است.file_roots:base:- /srv/salt/base- /srv/salt/failoverپیکربندی ‏2‑3پیکربندی چندین مسیر به‌عنوان file_roots1-5-2 سرویس‌دهنده‌ی فایل با استفاده از gitfsسامانه‌ی سرویس‌دهنده‌ی فایل در salt به‌صورت پیمانه‌ای معرفی شده است. این ویژگی قابلیت تجمیع این سامانه با سرویس‌دهنده‌های مختلف فایل و منابع خارج از سامانه‌ی salt را فراهم می‌آورد. به‌عنوان‌مثال توانایی استفاده از ابزار‌هایی نظیر git، mercurial و Subversion امکان اتصال و مدیریت ‌فایل‌ها از طریق دیگر مخازن را فراهم می‌آورد.برای استفاده از gitfs در سامانه، می‌توان از یکی از کتابخانه‌های pygit2، Dulwich و یا Gitpython استفاده کرد. برای پیکربندی این بخش می‌توان مطابق مراحل زیر عمل کرد:1- نصب pygit2 مطابق قطعه برنامه ‏2‑21 .apt-get install python-pygit2قطعه برنامه ‏2‑21نصب pygit22- تعریف git به‌عنوان سرویس‌دهنده در فایل پیکربندی master مطابق پیکربندی ‏2‑4.fileserver_backend:- gitپیکربندی ‏2‑4تعریف git به‌عنوان سرویس‌دهنده3- تعیین مخزن و راهکار ارتباط با در git در فایل پیکربندی master مطابق پیکربندی ‏2‑5 .gitfs_remotes:- git@github.com:user/repo.git:- pubkey: /root/.ssh/id_rsa.pub- privkey: /root/.ssh/id_rsa- passphrase: myawesomepassphraseپیکربندی ‏2‑5تعیین مخزن git در فایل پیکربندی4- راه‌اندازی مجدد master.1-6 پیمانه‌های اجراییپیمانه‌های اجرایی که هسته‌ی اصلی فعالیت‌های Salt را تشکیل می‌دهند، وظیفه‌ی اجرای دستورات و ارتباط با minions ها را بر عهده دارند. این پیمانه‌ها کتابخانه‌ای از فعالیت‌ها را ایجاد می‌کنند که دیگر پیمانه‌ها نظیر سامانه‌ی مدیریت وضعیت در فعالیت‌های خود از آن‌ها استفاده می‌کنند.ساختار این پیمانه‌ها باز و قابل‌گسترش است و تنها محدودیت آن‌ها، بازگرداندن یک شی JSON ترتیب پذیر است. در ادامه برخی از مفاهیم مورد استفاده در ساختار پیمانه‌های اجرای و نمونه‌هایی از این پیمانه‌ها را بررسی می‌کنیم.1-6-1 امکانات توسعه‌ی پیمانه‌های اجراییتوسعه و استفاده از پیمانه‌های اجرایی بسیار ساده است. تنها کافی ست پیمانه‌های نوشته‌شده در محیط‌های Python یا Cython را در مسیر _modules/ در مسیر ریشه‌ی مشخص‌شده‌ی file_roots که در فایل پیکربندی master تعیین‌شده است قرار داده و با یکی از دستورات زیر پیمانه را به minion ها برای اجرا انتقال دهیم.· State.highstate· Saltutil.sync_modules· Saltutil.sync_allبه‌طورمعمول اسم فایل نشان‌دهنده‌ی نام پیمانه است. درصورتی‌که پیمانه دارای خطا باشد، سامانه بدون بارگذاری پیمانه و بدون مشکل به ادامه‌ی فعالیت‌های خود می‌پردازد و از پیمانه‌ی دارای خطا صرف‌نظر می‌شود. اگر پیمانه در محیط Cython نوشته‌شده باشد، فایل باید به‌صورت <modulename>.pyx نام‌گذاری گردد. در این شرایط روند کامپایل پیمانه به‌صورت خودکار صورت می‌گیرد.1-6-1-1 ارتباط بین پیمانه‌هاتمام پیمانه‌ها به یکدیگر دسترسی دارند و می‌توانند توابع یکدیگر را فراخوانی کنند. این ارتباط از طریق قرار دادن متغیر __salt__ در پیمانه بعد از بارگذاری در minionصورت می‌گیرد. این متغیر که از نوع dictionary است شامل تمام توابع موجود است. کلید این متغیر رشته‌ای است که نشان‌دهنده‌ی نام پیمانه و نام تابع و مقدار آن تابع متناظر با رشته است. به‌عنوان‌مثال تابع قطعه کد ‏2‑1می‌تواند در یک پیمانه دستور bar را بر روی همان minion اجرا کند.def foo(bar):return __salt__['cmd.run'](bar)قطعه کد ‏2‑1فراخوانی تابع از پیمانه‌ای دیگر1-6-1-2 اطلاعات افزوده‌شده به پیمانه در زمان بارگذاریبرخی اطلاعاتی که به‌صورت پویا برای اجرای پیمانه‌ها فراهم می‌شود عبارت‌اند از:1. Grains:این اطلاعات که در بخش ‏2-4-3 آورده شده است در داده‌ساختار__grains__ قرار دارد. این داده‌ساختار که از نوع dictionary است، می‌تواند به‌وسیله‌ی تمام اشیاء قابل فراخوانی در پیمانه‌های پایتون مورداستفاده قرار گیرد. به‌عنوان‌مثال برای دسترسی به idماشینی که minion بر روی آن اجراشده است می‌توان از مقدار __grains__['id'] استفاده کرد.2. پیکربندی پیمانه:علاوه بر اطلاعات grain ، ابزار salt امکان انتقال مقادیر از طریق متغیرهای پیکربندی موجود در فایل پیکربندی minion را به پیمانه‌ها می‌دهد.1-6-1-3 پیمانه‌های مجازیدر برخی موارد پیمانه‌ها به‌صورت کلی پیاده‌سازی می‌شود تا بتوان از پیاده‌سازی‌های مختلف متناسب با نوع ماشین مقصد برای انجام فعالیت‌ها استفاده کرد. این قابلیت امکان ایجاد دستوراتی کلی و مستقل از ماشین‌ مقصد فراهم می‌آورد.یکی از مثال‌های پرکاربرد این روش، پیاده‌سازی پیمانه‌ی مدیریت بسته‌های نرم‌افزاری است. تمامی پیمانه‌های مدیریت بسته در salt شامل یک تابع __virtual__ هستند که مشخص‌کننده‌ی پیمانه‌ی جایگزین در minion است. این امکان ایجاد واسطی یکسان در تمامی توزیع‌هایی که از هر یک از ابزار‌ها apt-get ، Yum ، pacman و at بهره می‌برند، فراهم می‌آورد.1-6-2 نمونه پیمانه‌ی اجراییدر این بخش روند توسعه و به‌کارگیری یک پیمانه‌ی ساده با نام TUsalt را بررسی می‌کنیم. در سامانه‌ی مورد آزمایش دو ماشین با نام‌های ubuntu231 و ubuntu195 در ارتباط با master هستند.1-6-2-1 کد پیمانه اجرایی TUsaltTestهمان‌طور که در قطعه کد ‏2‑2پیمانه‌ی اجرایی آزمون TUsaltTest قابل‌مشاهده است، پیمانه‌ی آزمون تنها یک تابع ساده با نام echo دارد که رشته‌ی ورودی را به همان صورت بازمی‌گرداند. این عملکرد مشابه تابع test.echo است.# -*- coding: utf-8 -*-'''Module for running arbitrary tests'''# Import Salt libsimport saltimport salt.versionimport salt.loaderdef echo(text):return textقطعه کد ‏2‑2 پیمانه‌ی اجرایی آزمون TUsaltTest1-6-2-2 انتقال به ماشین‌ مقصدپس از نوشتن پیمانه مطابق ‏2-6-2-1 فایل پیمانه را در مسیر /srv/salt/ که در فایل پیکربندی به‌عنوان یکی از file_roots ها مشخص شده است در پوشه‌ی _modules قرار می‌دهیم. در شکل ‏2‑6 محتوی این پوشه نشان داده شده است. تا زمانی که دستور هم‌زمان‌سازی پیمانه‌ها به ماشین‌ها داده نشود، پیمانه‌ها قابل فراخوانی نیستند. برای نشان داده این امر در اینجا ما تنها بر روی ماشین ubuntu231 همزمان سازی را انجام می‌دهیم و انتظار داریم که پیمانه تنها بر روی این ماشین قابل‌اجرا باشد.شکل ‏2‑6 محتوی مسیر _modules و انتقال پیمانه‌ی آزمون به یکی از ماشین‌ها1-6-2-3 اجرای دستور آزمونپس از انتقال و هم‌زمان‌سازی ماشین‌ها مطابق شکل ‏2‑7 پیمانه را اجرا می‌کنیم. همان‌طور که از نتیجه‌ی اجرا مشخص است، تنها ماشین با نام Ubuntu 231 که مراحل همزمان سازی بر روی آن انجام شده است قادر به اجرای صحیح پیمانه‌ی آزمون است. و ماشین دیگر با نام ubuntu195 قادر به اجرای برنامه‌ی آزمون نیست.شکل ‏2‑7 اجرای پیمانه‌ی آزمون بر روی ماشین‌ها1-6-3 برخی از پیمانه‌های اجراییبا توجه به تنوع پیمانه‌های توسعه‌یافته در اینجا به برخی از پیمانه‌های پرکاربرد salt خواهیم پرداخت.1-6-3-1 پیمانه atبا استفاده از این پیمانه می‌توان به کمک ابزار at در سیستم‌عامل لینوکس وظایفی را برای انجام در آینده برنامه‌ریزی و زمان‌بندی کرد. در قطعه برنامه ‏2‑22برخی دستورات پیمانه‌ی at آورده شده است. خطوط 1 و 2 این قطعه کد شیوه‌ی افزودن کار جدید را نشان می‌دهد. خط سوم لیست‌ کارهای زمان‌بندی‌شده و خط چهارم وضعیت یک کار را نشان می‌دهد. خط پنجم تمام‌کارهای زمان‌بندی‌شده و خط ششم کار‌هایی که شماره آن‌ها به‌عنوان پارامتر داده‌شده را از لیست حذف می‌کند.1. salt '*' at.at 12:05am '/sbin/reboot' tag=reboot2. salt '*' at.at '3:05am +3 days' 'bin/myscript' tag=nightly runas=jim3. salt '*' at.atq4. salt '*' at.jobcheck <jobid>5. salt '*' at.atrm all6. salt '*' at.atrm <jobid> <jobid> .. <jobid>قطعه برنامه ‏2‑22برخی دستورات پیمانه‌ی atعلاوه بر این پیمانه، راهکار‌های دیگری نیز برای زمان‌بندی انجام کار موجود است که در ادامه بررسی خواهد شد.1-6-3-2 پیمانه augeas_cfgپیمانه augeas ابزاری برای ویرایش تنظیمات است. این ابزار با پویش فایل‌های پیکربندی، ساختاری درختی از متغیر‌های این فایل‌ها ایجاد می‌کند. این ابزار با به‌کارگیری زبانی منحصر به دامنه ساختار فایل‌های پیکربندی را توصیف می‌کند. این ابزار یک واسط برنامه‌نویسی برای پیکربندی در linux فراهم می‌آورد. هدف از این ابزار ارائه‌ی روش و جایگزین مطمئن برای دیگر روش‌های مستقل تغییر فایل‌های پیکربندی با استفاده از grep، sed و awk است.برای نصب پیش‌نیازهای این پیمانه بر روی ماشین‌های مقصد می‌توان قطعه برنامه ‏2‑23 استفاده کرد. خط سوم از این قطعه کد برای بررسی صحت نصب پیش‌نیاز‌ها است و در صورت وجود ابزار‌های موردنیاز به‌درستی اجرا می‌شود.1. salt '*' pkg.install python-augeas2. salt '*' pkg.install augeas-tools3. salt '*' cmd.run 'python -c &quotfrom augeas import Augeas&quot'قطعه برنامه ‏2‑23نصب پیش‌نیازهای موردنیاز برای پیمانه‌ی augeasدر قطعه برنامه ‏2‑24 برخی از کاربرد‌های این پیمانه آورده شده است. در خط اول این قطعه کد، دستورات ابزار augeas به‌صورت مستقل و کامل بر روی ماشین مقصد اجرا می‌شود. در خط دوم مقدار اولین IPدر فایل پیکربندی /etc/hosts در minion مقصد نشان داده می‌شود. خط سوم لیست زیر‌شاخه‌های موجود در فایل پیکربندی /etc/passwd را نشان‌ می‌دهد. خط چهارم مقدار متناظر با ssh در مسیر /etc/services/service-nameرا نشان می‌دهد. خط پنجم نیز مقدار net.ipv4.conf.all.log_martiansو مقدار متناظر با آن را از فایل پیکربندی /etc/sysctl.conf حذف می‌کند. خط ششم از این قطعه کد مقدار IP و رشته‌ی خط اول در فایل /etc/hosts را برابر 192.168.1.1 و test قرار می‌دهد.1. salt '*' augeas.execute /files/etc/redis/redis.conf commands='[&quotset bind 0.0.0.0&quot, &quotset maxmemory 1G&quot]'2. salt '*' augeas.get /files/etc/hosts/1/ ipaddr3. salt '*' augeas.ls /files/etc/passwd4. salt '*' augeas.match /files/etc/services/service-name ssh5. salt '*' augeas.remove /files/etc/sysctl.conf/net.ipv4.conf.all.log_martians6. salt '*' augeas.setvalue /files/etc/hosts/01/ipaddr 192.168.1.1 /files/etc/hosts/01/canonical testقطعه برنامه ‏2‑24برخی امکانات پیمانه‌ی augeas1-6-3-3 پیمانه apacheبه‌وسیله‌ی پیمانه‌ی apache می‌توان برخی از تنظیمات سرویس‌دهنده‌ی وب apacheرا انجام داد. در قطعه برنامه ‏2‑25 برخی تنظیمات نظیر افزودن و حذف کاربران و نمایش پیمانه‌های بارگذاری شده و تغییر پیکربندی را انجام داد.1. salt '*' apache.modules2. salt '*' apache.servermods3. salt '*' apache.signal restart4. salt '*' apache.useradd /etc/httpd/htpasswd larry badpassword5. salt '*' apache.userdel /etc/httpd/htpasswd larry6. salt '*' apache.config /etc/httpd/conf.d/ports.conf config=&quot[{'Listen': '22'}]&quotقطعه برنامه ‏2‑25 برخی موارد استفاده از پیمانه‌ی apache1-6-3-4 پیمانه pkgاین پیمانه‌ی مجازی در سامانه‌های مختلف به‌وسیله‌ی یکی از پیمانه‌های زیر جایگزین می‌شود:· salt.modules.aptpkg· salt.modules.brew· salt.modules.ebuild· salt.modules.freebsdpkg· salt.modules.openbsdpkg· salt.modules.pacman· salt.modules.pkgin· salt.modules.pkgng· salt.modules.pkgutil· salt.modules.solarispkg· salt.modules.win_pkg· salt.modules.yumpkg· salt.modules.zypperاین پیمانه‌ با توجه به سامانه‌ی مقصد می‌تواند یکی از عملیات‌هایی نظیر نصب، حذف بسته‌های نرم‌افزاری و مخازن نرم‌افزار را انجام دهد. در قطعه برنامه ‏2‑26 برخی از کاربرد‌های این پیمانه در ارتباط با مدیریت مخازن بسته‌ها آورده شده است. در خطوط اول تا سوم این قطعه برنامه چگونگی حذف و تغییر مخازن آورده شده است. در خطوط پنجم روش نمایش لیست مخازن و به‌روزرسانی پایگاه‌داده بسته‌ها آورده شده است.1. salt '*' pkg.del_repo &quotmyrepo definition&quot2. salt '*' pkg.mod_repo 'myrepo definition' uri=http://new/uri3. salt '*' pkg.mod_repo 'myrepo definition' comps=main,universe4. salt '*' pkg.list_repos5. salt '*' pkg.refresh_dbقطعه برنامه ‏2‑26 کاربرد‌های پیمانه‌ی pkgدر مدیریت مخازندر قطعه برنامه ‏2‑27 برخی کاربرد‌های پیمانه‌ی pkg در نصب، حذف و به‌روزرسانی بسته‌ها آورده شده است.1. salt '*' pkg.autoremove2. salt '*' pkg.file_list httpd postfix3. salt '*' pkg.install <package name>4. salt '*' pkg.install sources='[{&quotfoo&quot: &quotsalt://foo.deb]'5. salt '*' pkg.list_pkgs6. salt '*' pkg.list_upgrades7. salt '*' pkg.purge <package name>8. salt '*' pkg.remove <package name>9. salt '*' pkg.upgradeقطعه برنامه ‏2‑27کاربرد‌های پیمانه‌ی pkg در مدیریت بسته‌ها1-6-3-5 پیمانه blockdevبرای مدیریت دستگاه‌های ذخیره‌سازی بلوکی در سیستم‌عامل لینوکس می‌توان از پیمانه‌ی blockdev استفاده کرد. به‌عنوان‌مثال در صورت تغییر حجم پارتیشن می‌توان با استفاده از خط اول قطعه برنامه ‏2‑28 حجم فایل‌سیستم پارتیشن sda1 به‌اندازه پارتیشن تغییر کند. با استفاده از خطوط دوم و سوم نیز دستگاه تیون و وایپ می‌شود.1. salt '*' blockdev.resize2fs /dev/sda12. salt '*' blockdev.tune /dev/sda1 read-ahead=1024 read-write=True3. salt '*' blockdev.wipe /dev/sda1قطعه برنامه ‏2‑28 کاربرد‌های پیمانه‌ی blockdevدر مدیریت دستگاه‌های ذخیره‌سازی بلوکی1-6-3-6 پیمانه bridgeقابلیت bridge به‌عنوان بخشی از تنظیمات شبکه به‌وسیله‌ی پیمانه‌ی bridge در ابزار salt قابل پیکربندی است. همان‌طور که در قطعه برنامه ‏2‑29 قابل‌مشاهده است، با استفاده از این پیمانه قادر به ساخت و حذف bridgeو واسط‌های شبکه از bridgeخواهیم بود.1. salt '*' bridge.add br02. salt '*' bridge.addif br0 eth03. salt '*' bridge.delete br04. salt '*' bridge.delif br0 eth05. salt '*' bridge.interfaces br06. salt '*' bridge.list7. salt '*' bridge.show br08. salt '*' bridge.stp br0 enable9. salt '*' bridge.stp br0 disableقطعه برنامه ‏2‑29 برخی کاربرد‌های پیمانه‌ی bridge1-6-3-7 پیمانه btrfsسیستم‌فایل btrfs به‌عنوان یکی از سیستم‌فایل‌های پرکاربرد می‌تواند به‌وسیله‌ی پیمانه‌ی btrfsمدیریت شود. در قطعه برنامه ‏2‑30 برخی کاربرد‌های این پیمانه نظیر ساخت فایل‌سیستم، mount کردن و تبدیل فایل‌سیستم‌های دیگر به این سیستم‌فایل را مشاهده کرد.1. salt '*' btrfs.add /mountpoint /dev/sda1 /dev/sda22. salt '*' btrfs.convert /dev/sda1 permanent=True3. salt '*' btrfs.defragment /path/on/filesystem4. salt '*' btrfs.mkfs /dev/sda15. salt '*' btrfs.resize /mountpoint size=+1g6. salt '*' btrfs.usage /your/mountpointقطعه برنامه ‏2‑30 برخی کاربرد‌های پیمانه‌ی btrfs1-6-3-8 پیمانه cmdmodیکی از پیمانه‌های مهم ابزار salt پیمانه‌ی cmdmod است. این پیمانه قادر به اجرای دستورات و قطعه کد‌ در محیط مفسر‌های مختلف و دریافت نتیجه‌ی اجرای دستورات است. به‌عنوان‌مثال در خط اول از قطعه برنامه ‏2‑31 یک دستور در مفسر rubyاجرا می‌شود. در خط چهارم از این قطعه کد یک برنامه اجرا می‌شود و در خطوط 6 و 7 خروجی‌های استاندار برنامه دریافت می‌شود. همچنین در خط 8 و 9 یک قطعه کد اجرایی که در سرویس‌دهنده‌ی فایل masterقرار دارد بر روی تمام ماشین‌های minion اجرا می‌شود.1. salt '*' cmd.exec_code ruby 'puts &quotcheese&quot'2. salt '*' cmd.has_exec cat3. salt '*' cmd.retcode &quotgrep f&quot stdin='one\ntwo\nthree\nfour\nfive\n'4. salt '*' cmd.run &quotls -l | awk '/foo/{print \$2}'&quot5. salt '*' cmd.run_chroot /var/lib/lxc/container_name/rootfs 'sh /tmp/bootstrap.sh'6. salt '*' cmd.run_stderr &quotls -l | awk '/foo/{print \$2}'&quot7. salt '*' cmd.run_stdout &quotgrep f&quot stdin='one\ntwo\nthree\nfour\nfive\n'8. salt '*' cmd.script salt://scripts/runme.sh stdin='one\ntwo\nthree\nfour\nfive\n'9. salt '*' cmd.script_retcode salt://scripts/runme.sh10. salt '*' cmd.which catقطعه برنامه ‏2‑31 اجرای دستورات و قطعه کد با استفاده از cmdmod1-6-3-9 پیمانه cronیکی دیگر از پیمانه‌هایی که امکان زمان‌بندی و مدیریت اجرای برنامه‌ها در آینده را در اختیار می‌گذارد، پیمانه‌ی cron است. این پیمانه که واسطی برای ابزار cron است قادر به استفاده از تمام ویژگی‌های این ابزار است که برخی از این کاربرد‌ها در قطعه برنامه ‏2‑32 آورده شده است.1. salt '*' cron.list_tab root2. salt '*' cron.rm_job root /usr/local/weekly3. salt '*' cron.set_job root '*' '*' '*' '*' 1 /usr/local/weekly4. salt '*' cron.rm_env root MAILTO5. salt '*' cron.set_env root MAILTO user@example.com6. salt '*' cron.set_special root @hourly 'echo foobar'7. salt '*' cron.write_cron_file root /tmp/new_cronقطعه برنامه ‏2‑32 برخی کاربرد‌های پیمانه‌ی cron1-6-3-10 پیمانه ipغالب تنظیمات مربوط به شبکه‌ و واسط‌های شبکه را می‌توان با استفاده از پیمانه‌ی ip قابل مدیریت است. این پیمانه که در قطعه برنامه ‏2‑33 برخی از کاربرد‌های این پیمانه نظیر تغییر مسیریابی، تغییر وضعیت واسط شبکه آورده شده است.1. salt '*' ip.apply_network_settings2. salt '*' ip.build_bond bond0 mode=balance-alb3. salt '*' ip.build_interface eth0 eth <settings>4. salt '*' ip.build_network_settings <settings>5. salt '*' ip.build_routes eth0 <settings>6. salt '*' ip.down eth0 eth7. salt '*' ip.get_interface eth08. salt '*' ip.get_network_settings9. salt '*' ip.up eth0 ethقطعه برنامه ‏2‑33 برخی کاربرد‌های پیمانه‌ی ip1-6-3-11 پیمانه‌ iptablesیکی از ابزارهای مهم در سیستم‌عامل لینوکس iptables است. پیمانه‌ی iptables امکان مدیریت قوانین و زنجیره‌های قوانین را در اختیار می‌گذارد. برخی از کاربرد‌های این پیمانه نظیر حذف و اضافه کردن قوانین و زنجیره‌ها در قطعه برنامه ‏2‑34 آورده شده است.1. salt '*' iptables.append filter INPUT rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'2. salt '*' iptables.build_rule match=state connstate=RELATED,ESTABLISHED jump=ACCEPT3. salt '*' iptables.check filter INPUT rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'4. salt '*' iptables.check_chain filter INPUT5. salt '*' iptables.delete filter INPUT position=36. salt '*' iptables.delete filter INPUT rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'7. salt '*' iptables.delete_chain filter CUSTOM_CHAIN8. salt '*' iptables.flush filter INPUT9. salt '*' iptables.get_policy filter INPUT10.salt '*' iptables.get_rules11.salt '*' iptables.get_saved_policy filter INPUT conf_file=/etc/iptables.saved12.salt '*' iptables.get_saved_rules13.salt '*' iptables.insert filter INPUT position=3 rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'14.salt '*' iptables.new_chain filter CUSTOM_CHAIN15.salt '*' iptables.save /etc/sysconfig/iptables16.salt '*' iptables.set_policy filter INPUT ACCEPTقطعه برنامه ‏2‑34 برخی کاربرد‌های پیمانه‌ی iptables1-6-3-12 پیمانه kmodبرای مدیریت پیمانه‌های بارگذاری شده در کرنل لینوکس می‌توان از پیمانه‌ی kmodاستفاده کرد. این پیمانه قابلیت نمایش پیمانه‌های بارگذاری شده، بارگذاری و حذف پیمانه‌ها را فراهم می‌آورد. که در قطعه برنامه ‏2‑35 برخی کاربردهای پیمانه‌ی kmod آورده شده است.1. salt '*' kmod.available2. salt '*' kmod.check_available kvm3. salt '*' kmod.is_loaded kvm4. salt '*' kmod.load kvm5. salt '*' kmod.lsmod6. salt '*' kmod.mod_list7. salt '*' kmod.remove kvmقطعه برنامه ‏2‑35 برخی کاربردهای پیمانه‌ی kmod1-6-3-13 پیمانه linux_sysctlبرای مشاهده و تغییر متغیرهای سیستم‌عامل لینوکس که از طریق ابزار sysctl قابل‌دسترسی است می‌توان از پیمانه‌ی linux_sysctl استفاده کرد. در قطعه برنامه ‏2‑36 برخی کاربرد‌های پیمانه‌sysctl آورده شده است.salt '*' sysctl.assign net.ipv4.ip_forward 1salt -G 'kernel:Linux'sysctl.default_configsalt '*' sysctl.get net.ipv4.ip_forwardsalt '*' sysctl.persist net.ipv4.ip_forward 1salt '*' sysctl.showقطعه برنامه ‏2‑36 برخی کاربرد‌های پیمانه‌sysctl1-6-3-14 پیمانه nftablesیکی از ابزار‌های جدید در سیستم‌عامل لینوکس که از نسخه‌ی 3.13 کرنل لینوکس منتشر شده است، ابزار nftables است. این ابزار را می‌توان با استفاده از پیمانه‌ی nftablesمدیریت کرد. در قطعه برنامه ‏2‑37 برخی کاربرد‌های پیمانه‌ی nftables ازجمله افزودن و حذف قوانین از جداول پالایش این ابزار اشاره کرد.1. salt '*' nftables.append filter input rule='input tcp dport 22 log accept'2. salt '*' nftables.build_rule match=state connstate=RELATED,ESTABLISHED jump=ACCEPT3. salt '*' nftables.build_rule filter input command=insert position=3 full=True match=state state=related,established jump=accept4. salt '*' nftables.check filter input rule='input tcp dport 22 log accept'5. salt '*' nftables.check_chain filter input6. salt '*' nftables.check_table nat7. salt '*' nftables.delete filter input position=38. salt '*' nftables.delete filter input rule='input tcp dport 22 log accept'9. salt '*' nftables.delete_chain filter input10.salt '*' nftables.delete_table filter11. salt '*' nftables.flush filter12.salt '*' nftables.get_rule_handle filter input rule='input tcp dport 22 log accept'13. salt '*' nftables.insert filter input rule='input tcp dport 22 log accept'14.salt '*' nftables.insert filter input position=3 rule='input tcp dport 22 log accept'15.salt '*' nftables.new_chain filter input table_type=filter hook=input priority=016.salt '*' nftables.new_table filter17.salt '*' nftables.save /etc/nftablesقطعه برنامه ‏2‑37 برخی کاربرد‌های پیمانه‌ی nftables1-6-3-15 پیمانه serviceبه‌طورمعمول در سیستم‌عامل‌های مختلف ابزار‌های مختلفی برای سرویس‌دهنده‌ها وجود دارد. از این میان می‌توان به debian_service، upstart و system اشاره کرد. پیمانه‌ی service با فراهم آوردن واسطی یکپارچه می‌تواند وضعیت سرویس‌ها را در ماشین‌های مختلف مدیریت کند. در قطعه برنامه ‏2‑38 برخی قابلیت‌های مدیریت سرویس با استفاده از پیمانه service آورده شده است.1. salt '*' service.available <service name>2. salt '*' service.get_all3. salt '*' service.missing <service name>4. salt '*' service.reload <service name>5. salt '*' service.restart <service name>6. salt '*' service.start <service name>7. salt '*' service.status <service name> [service signature]8. salt '*' service.stop <service name>قطعه برنامه ‏2‑38 برخی قابلیت‌های مدیریت سرویس با استفاده از پیمانه service1-6-3-16 پیمانه systemبرای تغییر وضعیت ماشین به run level های مختلف و یا راه‌اندازی مجدد آن می‌توان از پیمانه‌ی system استفاده کرد. در قطعه برنامه ‏2‑39 کاربرد‌هایی از تغییر وضعیت سیستم با استفاده از پیمانه‌ی system آورده شده است.1. salt '*' system.halt2. salt '*' system.init 33. salt '*' system.poweroff4. salt '*' system.reboot5. salt '*' system.shutdownقطعه برنامه ‏2‑39 کاربرد‌هایی از تغییر وضعیت سیستم با استفاده از پیمانه‌ی system1-7 بازگرداننده‌هایکی از ویژگی‌های مفید در معماری امکان انتقال پاسخ‌ها و نتیجه‌ی رخدادها از محیط minion ها به محیطی خارجی برای بررسی و تحلیل است. پیمانه‌های بازگرداننده تنظیمات خود را تنها یک‌بار و در زمان بارگذاری از minionها دریافت می‌کنند. به‌عبارت‌دیگر پیکربندی هر بازگرداننده در زمان بارگذاری minionها انجام می‌شود و بعد از آن تنها بازگرداننده فراخوانی و مورد استفاده قرار می‌گیرد.1-7-1 نحوه‌ی استفاده از بازگرداننده‌هابرای استفاده از قابلیت پیمانه‌های بازگرداننده می‌توان مطابق خط اول قطعه برنامه ‏2‑40 در تمامی دستورات از یک بازگرداننده بهره گرفت. همچنین می‌توان از چندین بازگرداننده برای یک دستور استفاده کرد.salt '*' test.ping --return redis_returnsalt '*' test.ping --return mongo_return,redis_return,cassandra_returnقطعه برنامه ‏2‑40 شیوه‌ی به‌کارگیری از پیمانه‌های بازگرداننده1-7-2 برخی بازگرداننده‌های پرکاربردبه دلیل معماری پیمانه‌ای ابزار salt بازگرداننده‌های متعددی توسعه یافته است ولی در اینجا تنها به برخی از این بازگرداننده‌ها خواهیم پرداخت.1-7-2-1 بازگرداننده‌ djangoاین بازگرداننده با استفاده از سامانه‌ی سیگنال در قالب کاری djangoمی‌تواند اطلاعات بازگردانده شده را به این قالب کاری انتقال دهد. این بر عهده‌ی توسعه‌دهنده‌ی در محیط djangoاست که با تعریف تابع اطلاعات دریافتی را پردازش کند. در قطعه کد ‏2‑3یک نمونه‌ی ساده از تابع قابل تعریف در قالب کاری django آورده شده است.import salt.returners.django_returnfrom django.dispatch import receiver@receiver(salt.returners.django_return, sender=returner)def returner_callback(sender, ret):print('I received {0} from {1}'.format(ret, sender))قطعه کد ‏2‑3 نمونه تابع قابل تعریف در django برای استفاده از بازگرداننده1-7-2-2 بازگرداننده‌ mysqlیکی از بازگرداننده های مهم، پیمانه‌ی پایگاه‌داده‌ی mysqlاست. پیکربندی این پیمانه در پیکربندی ‏2‑6 آورده شده است.mysql.host: 'salt'mysql.user: 'salt'mysql.pass: 'salt'mysql.db: 'salt'mysql.port: 3306پیکربندی ‏2‑6پیکربندی بازگرداننده‌ی mysqlهمچنین برای قرارگیری اطلاعات بازگردانده شده باید پیش از استفاده از بازگرداننده‌ی mysql پایگاه داده و جداول موردنیاز ساخته شود. برای اینکار می‌توان از قطعه کد ‏2‑4 بهره برد.CREATE DATABASE `salt`DEFAULT CHARACTER SET utf8DEFAULT COLLATE utf8_general_ci;USE `salt`;---- Table structure for table `jids`--DROP TABLE IF EXISTS `jids`;CREATE TABLE `jids` (`jid` varchar(255) NOT NULL,`load` mediumtext NOT NULL,UNIQUE KEY `jid` (`jid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;---- Table structure for table `salt_returns`--DROP TABLE IF EXISTS `salt_returns`;CREATE TABLE `salt_returns` (`fun` varchar(50) NOT NULL,`jid` varchar(255) NOT NULL,`return` mediumtext NOT NULL,`id` varchar(255) NOT NULL,`success` varchar(10) NOT NULL,`full_ret` mediumtext NOT NULL,`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,KEY `id` (`id`),KEY `jid` (`jid`),KEY `fun` (`fun`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;---- Table structure for table `salt_events`--DROP TABLE IF EXISTS `salt_events`;CREATE TABLE `salt_events` (`id` BIGINT NOT NULL AUTO_INCREMENT,`tag` varchar(255) NOT NULL,`data` varchar(1024) NOT NULL,`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,`master_id` varchar(255) NOT NULL,PRIMARY KEY (`id`),KEY `tag` (`tag`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;قطعه کد ‏2‑4 ساختار پایگاه‌داده برای استفاده از بازگرداننده‌ی mysqlپس از پیکربندی و ساخت پایگاه‌داده و جداول در mysql می‌توان با استفاده از قطعه برنامه ‏2‑41 اطلاعات برگردانده شده را به پایگاه داده انتقال داد.salt '*' test.ping --return mysqlقطعه برنامه ‏2‑41 شیوه‌ی استفاده از بازگرداننده mysql1-7-2-3 بازگرداننده‌ smtpبرای ارسال اطلاعات از طریق ایمیل و با استفاده از پروتکل smtpمی‌توان از پیمانه‌ی بازگرداننده‌ی smtp استفاده کرد. برای استفاده از این پیمانه باید موارد پیکربندی ‏2‑7 را در فایل پیکربندی master مشخص نمود.smtp.from (required)smtp.to (required)smtp.host (required)smtp.port (optional, defaults to 25)smtp.username (optional)smtp.password (optional)smtp.tls (optional, defaults to False)smtp.subject (optional, but helpful)smtp.gpgowner (optional)smtp.fields: id,funپیکربندی ‏2‑7موارد قابل استفاده در پیکربندی بازگرداننده‌ی smtp1-7-2-4 بازگرداننده‌ smsاین بازگرداننده با استفاده از رابط برنامه‌نویسی twilioمی‌تواند اطلاعات را از طریق پیام‌کوتاه انتقال دهد. در پیکربندی ‏2‑8 تنظیمات موردنیاز برای این بازگرداننده آورده شده است.twilio.sid: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'twilio.token: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'twilio.to: '+1415XXXXXXX'twilio.from: '+1650XXXXXXX'پیکربندی ‏2‑8 پیکریندی بازگرداننده‌ی sms1-7-2-5 بازگرداننده‌ syslogاین بازگرداننده می‌توان از syslog سیستم‌عامل به‌عنوان بازگرداننده استفاده کند. برای استفاده از این بازگرداننده می‌توان مطابق قطعه برنامه ‏2‑42 عمل کرد.salt '*' test.ping --return syslogقطعه برنامه ‏2‑42 استفاده از بازگرداننده‌ی syslog1-7-3 توسعه‌ی بازگردانندهیک بازگرداننده، پیمانه‌ای به زبان پایتون و شامل تابعی با نام returnerاست. این تابع باید یک پارامتر را که شامل اطلاعات برگردانده شده است، بپذیرد. در قطعه کد ‏2‑5 نمونه‌ای از یک برگرداننده‌ی ساده آورده شده است که نتیجه را به‌صورت داده‌های ترتیب‌پذیر با ساختار JSONبه سرویس‌دهنده‌ی redisانتقال می‌دهد.import redisimport jsondef returner(ret):'''Return information to a redis server'''# Get a redis connectionserv = redis.Redis(host='redis-serv.example.com',port=6379,db='0')serv.sadd(&quot%(id)s:jobs&quot % ret, ret['jid'])serv.set(&quot%(jid)s:%(id)s&quot % ret, json.dumps(ret['return']))serv.sadd('jobs', ret['jid'])serv.sadd(ret['jid'], ret['id'])قطعه کد ‏2‑5 نمونه بازگردانندهپس از توسعه‌ی بازگرداننده، باید فایل مربوطه را در پوشه‌ی _returners از مسیر متغیر file_roots در فایل پیکربندی master قرار داده و یکی از سه دستور زیر را برای انتقال به بازگرداننده به mimonها استفاده کرد:· salt ‘*’ state.highstate· salt ‘*’ saltutil.sync_returners· salt ‘*’ saltutil.sync_all1-7-4 برگرداننده‌ی رخدادبرای حداکثر کردن میزان نظارت بر تاریخچه‌ی رخداد‌ها می‌توان تمام نتایج تولید‌شده از رخداد‌های مختلف ایجاد‌شده را در master به یک بازگرداننده انتقال داد. برای فعال سازی این قابلیت می‌توان گزینه‌ی event_retrurn را در پیکربندی master تعیین کرد تا بازگرداننده‌ی مدیریت کننده‌ی رخداد‌ها مشخص شود.لازم به ذکر است که تمامی بازگرداننده‌ها قابلیت مدیریت نتایج رخداد‌ها را ندارند و تنها بازگرداننده‌هایی که در آن‌ها تابع event_return() تعریف شده است، در این بخش قابل استفاده هستند.1-8 مدیریت پیکربندییکی از مهمترین و پرکاربرد‌ترین ویژگی‌های salt ساختار مدیریت پیکربندی یا وضعیت است. در این بخش، با توجه به نقش‌های هر ماشین و نیازمندی‌های آن، بر پیکربندی هر minionنظارت می‌گردد. این نظارت از طریق اعمال دسته‌ای دستورات با توجه به نقش ماشین انجام می‌شود.هسته‌ی اصلی این ساختار که فایل‌های sls هستند. این فایل‌ها شامل داده‌ها و تنضیمات و دستوراتی هستند که می‌توانند بر روی minionها اعمل شوند. فایل‌های sls در واقع داده‌ساختاری شامل انواع مختلفی از dictionary، لیست و رشته است. این معماری برای فایل‌ امکان درک و گسترش‌پذیری این فایل‌ها را افزایش می‌دهد.1-8-1 Top Fileاین فایل برای مشخص کردن نگاشت پیمانه‌های sls به minionها بکار می‌رود. این فایل مشخص می‌کند که هر گره از چه محیطی استفاده کند. تعریف محیط‌ها به‌صورت مفهومی درخت مسیرها را مرتب سازماندهی می‌کند. محیط‌ها در Top file با مسیر‌های ریشه در فایل پیکربندی masterدر تعریف می‌شوند. به‌عنوان‌مثال اگر پیکربندی مسیر ریشه به‌صورت پیکربندی ‏2‑9 و پیکربندی ‏2‑10 تعریف top file باشد، مشاهده می‌شود که به ازای هر محیط در top fileیک نگاشت از minion ها به فایل‌های وضعیت وجود دارد. ازآنجایی‌که هر چیزی در ابزار salt یک فایل است، محیط نیز یک فایل است. همان‌طور که در پیکربندی ‏2‑10 مشاهده می‌شود از روش‌های مختلفی می‌توان برای نگاشت بین ماشین‌ها و وضعیت‌ها استفاده کرد. تمامی روش‌هایی که در بخش ‏2-4 بیان شد در انتخاب ماشین‌های مقصد در این بخش قابل استفاده است.file_roots:base:- /srv/salt/basedev:- /srv/salt/devqa:- /srv/salt/qaprod:- /srv/salt/prodپیکربندی ‏2‑9 تعریف فایل پیکربندی masterbase:'*':- ldap-client- networking- salt.minion'salt-master*':- salt.master'^(memcache|web).(qa|prod).loc$':- match: pcre- nagios.mon.web- apache.server'os:Ubuntu':- match: grain- repos.ubuntu'os:(RedHat|CentOS)':- match: grain_pcre- repos.epel'foo,bar,baz':- match: list- database'somekey:abc':- match: pillar- xyzdev:'webserver*dev*':- webserver'db*dev*':- dbqa:'webserver*qa*':- webserver'db*qa*':- dbprod:'webserver*prod*':- webserver'db*prod*':- dbپیکربندی ‏2‑10تعریف محیط در Top Fileدر پیکربندی ‏2‑10 تمام ماشین‌ها وضعیت مربوط به ldap-client، شبکه و minionها را دریافت می‌کنند. هر ماشینی که با نام salt-masterشروع شود تنظیمات master را می‌گیرد. همچنین هر minionکه نام آن با “^(memcache|web).(qa|prod).loc$” تطابق یابد تنظیمات nagios.mon.web و apache.serverرا دریافت می‌کند. تمام ماشین‌های با سیستم‌عامل Ubuntuوضعیت repos.ubuntu و ماشین‌های با سیستم‌عامل CentOSو RHEL وضعیت مربوط به repos.epelرا دریافت می‌کنند. Minionهای foo ، bar و baz تنظیمات databaseرا دریافت می‌کنند. هر ماشینی که در pillarخود داده ای با کلید somkey با مقدار abc داشته باشد، وضعیت xyz را دریافت می‌کند. به همین ترتیب محیط‌های dev ، qa و prod نیز مقداردهی می‌شوند.1-8-2 تعریف فایل‌های slsقالب دستورات به‌صورت پیش‌فرض برای تعریف فایل‌های وضعیت yaml و jinja است. در پیکربندی ‏2‑11 یک نمونه وضعیت آورده شده است. در این پیکر‌بندی که با عنوان apacheدر فایل top معرفی خواهد شد درصورتی‌که بسته‌ی apacheنصب نباشد، آن را نصب و راه‌اندازی می‌کند. خط اول این پیکربندی نشان‌دهنده‌ی نام شناسایی داده‌ها را بیان می‌کند. در خط دوم و سوم فراخوانی توابعی از پیمانه‌های وضعیت را نشان می‌دهد. این توابع به‌صورت <state_module>.<function> مشخص می‌شود. به این ترتیب در خط دوم پیمانه‌ی وضعیت pkg.installed از نصب بودم یک بسته‌ی نرم‌افزار با استفاده از ابزار مدیریت بسته‌ بر روی ماشین مقصد اطمینان حاصل می‌کند. در خط سوم نیز از در حال اجرا بودن سرویس اطمینان حاصل می‌کند. ازآنجایی‌که امکان دارد یک بسته‌ی نرم‌افزار نصب نباشد، در خط چهارم پیش‌نیاز وضعیت در حال اجرا بودن سرویس را نصب بودن بسته‌ی apache اعلام می کند. به‌عبارت‌دیگر از بسته نرم‌افزاری نصب نباشد، ابتدا آن را نصب می‌کند و سپس وضعیت آن را به حالت در حال اجرا تغییر می‌دهد.apache:pkg.installed: []service.running:- require:- pkg: apacheپیکربندی ‏2‑11 نمونه‌ای ساده از فایل وضعیتعلاوه بر در حال اجرا بودن، ضرورت پیگیری روند تفییرات پیکربندی سرویس و بروز رسانی آن به‌صورت پویا احساس می‌گردد. در پیکربندی ‏2‑12 حالت تکمیل‌تر شده‌ی پیکربندی ‏2‑11 آورده شده است. خطوط یک تا پنجم مشابه پیکربندی ‏2‑11 است. در ادامه در خطوط 7 و 8 علاوه حالتی نظارتی بر روی فایل پیکربندی /etc/httpd/conf/httpd.conf و کاربر apacheنیز نظارت اعمال می‌شود. به این صورت که خطوط 9 تا 14 فایل پیکربندی /etc/httpd/conf/httpd.conf به‌صورت مدیریت شده معرفی شده است. محتویات این فایل از مسیر salt://apache/httpd.conf دریافت می‌شود و کاربر و گروه مالک و سطح دسترسی آن مشخص شده است. به این ترتیب در صورت تغییر محتوای salt://apache/httpd.conf تمام ماشین‌هایی که این پیکربندی بر روی آن‌ها اعمال شده است، فایل پیکربندی /etc/httpd/conf/httpd.conf آن‌ها بازنویسی و سرویس راه‌اندازی مجدد می‌شود. در خط هشتم نیز بر وجود کاربر apacheنظارت می‌شود. این نظارت از طریق خطوط 15 تا 21 اعمال می‌شود. این خطوط ویژگی‌های کاربر apache را مشخص می‌کند . در خط 21 نیز بر لزوم وجود گروه apache تاکید می‌کند. این الزام نیز در خطوط 22 تا 25 اعمال می‌شود.1. apache:2. pkg.installed: []3. service.running:4. - require:5. - pkg: apache6. - watch:7. - file: /etc/httpd/conf/httpd.conf8. - user: apache9. /etc/httpd/conf/httpd.conf:10. file.managed:11. - source: salt://apache/httpd.conf12. - user: root13. - group: root14. - mode: 64415. user.present:16. - uid: 8717. - gid: 8718. - home: /var/www/html19. - shell: /bin/nologin20. - require:21. - group: apache22. group.present:23. - gid: 8724. - require:25. - pkg: apacheپیکربندی ‏2‑12حالت کامل‌تر فایل وضعیتهمان‌طور که در مثال پیکربندی ‏2‑12 مشاهده شد، علاوه بر مدیریت متمرکز فایل‌های پیکربندی می‌توان بر تغییرات بخش‌های مختلف نظارت کرد.1-9 رخدادسامانه‌ی رخداد در ابزار salt برای انتقال اطلاعات وضعیت دستورات در حال اجرا و ارتباط برنامه‌های دیگر با ابزار salt است. این سامانه از دو بخش اصلی تشکیل شده است:· سوکت رخداد که رخداد‌ها را منتشر می‌کند.· کتابخانه‌ی رخداد که به رخداد‌ها گوش می دهد و به سامانه‌ی salt ارسال می‌کند.1-9-1 انواع رخدادبرخی از رخداد‌ها که در گذرگاه رخداد master قرار می‌گیرد عبارتند از:1. رخداد‌های احراز هویت: این رخداد‌ها در زمانی که minionها تست احراز‌ هویت را با master انجام می‌دهند، رخ می‌دهد.2. رخداد‌های شروع: این رخداد‌ها در زمانی که minionها به masterمتصل می‌شود، رخ می‌دهد.3. رخداد‌های کلید: این رخداد‌ها در زمان پذیرش و یا رد کلید رخ می‌دهد.4. رخداد‌های وظایف: این رخداد‌ها در زمان ارسال یک دستور به minionها رخ می‌دهد.5. رخداد‌های حضور: این رخداد‌ها به‌صورت دوره‌ای و وضعیت اتصال minionها را گزارش می‌دهد.1-9-2 گوش‌دادن برای دریافت رخدادهابرای دریافت رخداد‌ها و پردازش آن‌ها، خارج از ابزار saltمی‌توان مطابق قطعه برنامه ‏2‑43 رخداد‌ها را به‌صورت لحظه‌ای دریافت کرد و به‌وسیله‌ی ابزارة‌ای خارجی و قطعه کد‌های shell آن‌ها را پردازش کرد.salt-run state.event pretty=Trueقطعه برنامه ‏2‑43 دریافت رخداد‌ها در خط فرمانمی‌توان از طریق کتابخانه‌ی رخداد، به سامانه‌ی رخداد در ابزار salt دسترسی داشت. در قطعه کد ‏2‑6 راهکار دسترسی به رخداد‌ها از طریق محیط پایتون نمایش‌داده شده است. ازآنجایی‌که در برای دریافت رخداد‌ها این کتابخانه از سوکت‌های unix استفاده می‌کند، برای اتصال به سامانه، مسیر قرارگیری این سوکت‌ها که در فایل پیکربندی master با عنوان sock_dir مقدار‌دهی می‌شود، باید مشخص شود. رخداد‌ها از برچسب برای فراهم ساختن امکان پالایش رخدادها بهره می‌برد.import salt.configimport salt.utils.eventopts = salt.config.client_config('/etc/salt/master')event = salt.utils.event.get_event('master',sock_dir=opts['sock_dir'],transport=opts['transport'],opts=opts)while True:ret = sevent.get_event(full=True)if ret is None:continueif fnmatch.fnmatch(ret['tag'], 'salt/job/*/ret/*'):do_something_with_job_return(ret['data'])قطعه کد ‏2‑6 دریافت رخداد‌ها در پایتون1-9-3 ایجاد رخدادبرای ایجاد رخداد در خط فرمان می‌توان از طریق قطعه برنامه ‏2‑44 پیامی دلخواه را بر روی گذرگاه رخداد قرار داد.salt-call event.fire '{&quotdata&quot: &quotmessage to be sent in the event&quot}' 'tag'قطعه برنامه ‏2‑44 ایجاد رخداد در خط فرماناگر بخواهیم در پیمانه‌های اجرایی یک رخداد ایجاد کنیم، می‌توانیم مطابق قطعه کد ‏2‑7 رفتار کنیم.# /srv/salt/_modules/my_custom_module.pydef do_something():'''Do something and fire an event to the master when finishedCLI Example::salt '*' my_custom_module:do_something'''# do something!__salt__['event.send']('myco/my_custom_module/finished', {'finished': True,'message': &quotThe something is finished!&quot,})قطعه کد ‏2‑7 ایجاد رخداد در پیمانه‌ی اجراییهمچنین درصورتی‌که بخواهیم در ابزاری خارج از saltرخدادی ایجاد کنیم، مطابق قطعه کد ‏2‑8 می‌توان با استفاده از کتابخانه رخداد، این عمل را انجام داد.import salt.clientcaller = salt.client.Caller()caller.sminion.functions['event.send']('myco/myevent/success',{'success': True,'message': &quotIt works!&quot,})قطعه کد ‏2‑8 ایجاد رخداد در محیط پایتون1-9-4 سامانه واکنش‌گر[16]هدف از سامانه‌ی واکنش‌گر، ایجاد موتور منطقی برای انجام اعمالی مشخص، در صورت مشاهده‌ی رخداد مشخصی است. به‌عبارت‌دیگر این سامانه دو بخش رخداد و پیمانه‌های اجرایی را با یکدیگر تلفیق می‌کند.1-9-4-1 نگاشت رخداد به وضعیتنگاشت رخداد به فایل‌های sls در پیکربندی master انجام می‌شود. به‌صورت پیش‌فرض این پیکربندی در مسیر /etc/salt/master و یا /etc/salt/master.d/reactor.conf قرار دارد. در پیکربندی ‏2‑13 یک نمونه‌ی ساده از سامانه‌ی واکنش آورده شده است. در این پیکربندی به ازای اجرای تمام minionها فایل‌های start.slsو monitor.sls اجرای می‌شود. همچنین در صورت خاتمه‌ی فعالیت هر minion تمام فایلهای وضعیت موجود در پوشه‌ی destroy اجرا می‌شود. در عین حال اگر رخدادی از بیرون به سامانه اعمال شود، فایل وضعیت mycustom.slsاجرا می‌شود.reactor: # Master config section &quotreactor&quot- 'salt/minion/*/start': # Match tag &quotsalt/minion/*/start&quot- /srv/reactor/start.sls # Things to do when a minion starts- /srv/reactor/monitor.sls # Other things to do- 'salt/cloud/*/destroyed': # Globs can be used to matching tags- /srv/reactor/destroy/*.sls # Globs can be used to match file names- 'myco/custom/event/tag': # React to custom event tags- salt://reactor/mycustom.sls # Put reactor files under file_rootsپیکربندی ‏2‑13 پیکربندی واکنش‌گر در فایل پیکربندی masterساختار فایل‌های واکنش بسیار شبیه فایل‌های وضعیت که در بخش ‏2-8 معرفی شد است و به‌صورت پیش‌فرض می‌تواند از قالب yaml و jinja باشد. تنها تفاوت این فایل‌ها در اضافه شدن دو متغیر tag و data به این فایل‌ها است که به‌صورت زیر تعریف می‌شوند:· متغیر tagکه مشخص کننده‌ی برچسب رخداد فعال شده است.· متغیر dataحاوی اطلاعات رخداد است.در قطعه کد ‏2‑9 نمونه‌ای ساده واکنش آورده شده است. در این قطعه کد از قالب jinja برای افزایش قابلیت واکنش استفاده شده است. به‌عنوان‌مثال تنها اگر id رخداد mysql1 باشد و یا به عبارتی رخداد به‌وسیله‌ی minion با نام mysql1 ایجاد شده باشد، واکنش موردنظر انجام می‌شود.{% if data['id'] == 'mysql1' %}highstate_run:local.state.highstate:- tgt: mysql1{% endif %}قطعه کد ‏2‑9 نمونه‌ای ساده فایل واکنش1-9-4-2 مثالی از سامانه‌ی واکنش‌گردر اینجا مثال هدف پذیرش خودکار احراز هویت برخی از minionهایی که به masterمتصل می‌شوند است. در این مثال تعدادی سرویس‌دهنده‌ی به‌صورت تصادفی آنلاین می‌شوند و در برخی از آن‌ها نیاز به پذیرش خودکار کلید‌ آن‌ها وجود دارد. در اینجا فرض بر این است که تمام ماشین‌هایی که نام آن‌ها با ‘ink’ شروع می‌شود باید پذیرفته شوند و دستور state.highstate بر روی آن‌ها اعمال شود.برای انجام این فعالیت در فایل پیکربندی master مطابق پیکربندی ‏2‑14 رخداد‌های با برچسب ‘salt/auth’ مورد پردازش قرار می‌گیرند. در این پیکربندی که در مسیر /etc/salt/master.d/reactor.conf قرار می‌گیرد، تمام رخ داد‌های احراز هویت را با استفاده از فایل واکنش auth-pending.sls و تمام رخداد‌های شروع ماشین‌هایی که نام آن‌ها با Ink شروع می‌شود را با فایل واکنش auth-accept.slsمدیریت می‌کند.reactor:- 'salt/auth':- /srv/reactor/auth-pending.sls- 'salt/minion/ink*/start':- /srv/reactor/auth-complete.slsپیکربندی ‏2‑14تنظیمات فایل پیکربندی master برای مثال اولدر قطعه کد ‏2‑10 واکنش نسبت به احراز هویت تعیین می‌شود. در بخش اول این واکنش اگر احراز هویت به‌درستی انجام نشد، کلید مربوط به آن minion حذف و با استفاده از ssh سرویس minion راه‌اندازی مجدد می‌شود. در بخش دو نیز در صورت رخداد درخواست احراز هویت از minion ای که نام آن با ‘ink’ شروع می‌شود.{# Ink server faild to authenticate -- remove accepted key #}{% if not data['result'] and data['id'].startswith('ink') %}minion_remove:wheel.key.delete:- match: {{ data['id'] }}minion_rejoin:local.cmd.run:- tgt: salt-master.domain.tld- arg:- ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no &quot{{ data['id'] }}&quot 'sleep 10 && /etc/init.d/salt-minion restart'{% endif %}{# Ink server is sending new key -- accept this key #}{% if 'act' in data and data['act'] == 'pend' and data['id'].startswith('ink') %}minion_add:wheel.key.accept:- match: {{ data['id'] }}{% endif %}قطعه کد ‏2‑10 فایل auth-pending.slsدر ادامه بعد از احراز هویت minion‌هایی که با نام ‘ink’ شروع می‌شود، رخداد start را ایجاد می‌کنند که در نیتجه‌ی آن با توجه به پیکربندی ‏2‑14 فایل auth.complete.slsاجرا می‌شود که محتویات این فایل در قطعه کد ‏2‑11 آورده شده است. همان‌طور که در این کد مشاهده می‌کنید، ماشینی که رخداد start را ایجاد کرده است، دستور state.highstateبر روی آن اجرا می‌شود و نتیجه‌ی آن از طریق بازگرداننده‌ی smtp به سرویس‌دهنده‌ی موردنظر انتقال داده می‌شود.{# When an Ink server connects, run state.highstate. #}highstate_run:local.state.highstate:- tgt: {{ data['id'] }}- ret: smtp_returnقطعه کد ‏2‑11فایل auth-complete.sls1-10 رابط برنامه‌نویسی پایتونبه‌صورت ساده می‌توان با استفاده از قطعه کد ‏2‑12 دستورات را بر روی master به minionها صادر کرد. با استفاده از این قطعه کد بر روی تمام ماشین‌ها دستور whoami اجرا خواهد شد.import salt.clientlocal = salt.client.LocalClient()local.cmd('*', 'cmd.run', ['whoami'])قطعه کد ‏2‑12 استفاده از رابط برنامه‌نویسی پایتون برای ارسال دستوربه‌طور کلی پارامتر‌هایی که می‌توان با استفاده از local.cmdاجرا کرد به ترتیت به‌صورت زیر است:پارامتر · tgt : لیست ماشین‌های که قرار است دستورات بر روی آن‌ها اعمال شود.پارامتر · fun : لیستی از دستورات که می‌خواهیم بر روی ماشین‌ها اجرا شود.پارامتر · arg : لیستی از آرگومان‌هایی که برای اجرای دستورات پارامتر funنیاز است. لازم به ذکر است که طول این لیست باید متناظر با پارامتر‌ fun باشد.پارامتر · timeout : تعداد ثانیه‌هایی که بعد از آخرین minion منتظر می‌ماند.پارامتر · expr_form : نشان دهنده‌ی نوع معرفی در پارامتر tgt است.پارامتر · ret : نوع تابع بازگرداننده ای که برای دستورات می‌تواند مورد استفاده قرار گیرد.پارامتر · kwarg : یک dictionary همراه با لغات کلیدی برای توابع.مقداری که تابع local.cmd بر می‌گرداند یک dictionary است که کلید آن نام minion و مقدار متناظر با آن، داده های برگردانده شده از اجرای دستور است.یکی از مشکلات قطعه کد ‏2‑12 وجود timeoutو بلاکینگ بودن ساختار آن است. برای حل این مشکل می‌توان مطابق ... دستورات را به‌صورت غیر متقارن فرستاد تا روند اجرای برنامه برای انجام دستور متوقف نشود. پارامتر‌های این روش نیز همانند راهکار بلاکینگ است با این تفاوت که مقدار برگردانده شده از این تابع، شماره فعالیت زمان‌بندی شده برای اجرا است.local.cmd_async('*', 'test.sleep', [300])قطعه کد ‏2‑13 اجرای نامتقارن دستور بر روی ماشین‌ها در محیط پایتون2 مراجع[1]“Network-attached storage - Wikipedia, the free encyclopedia.” [Online]. Available: http://en.wikipedia.org/wiki/Network-attached_storage. [Accessed: 24-Jul-2013].https://teaching.iranmodares.com/teaching-index.php?metaword=%D9%85%D8%AD%D9%85%D8%AF+%D8%AD%D8%B3%DB%8C%D9%86+%D8%AC%D9%84%DB%8C%D9%84%DB%8C