در قسمت صفرم از این سری آموزش انسیبل محیط آزمایشگاه را فراهم آوردیم که بعد از این بیشتر اوقات خود را در آن سپری کنیم.
http://https://youtu.be/6H8J8fH_uXM
اینونتوریها – Inventories
در این قسمت ما در خصوص اینونتوریها (Inventories) صحبت میکنیم.
- تعریف کردن هاستها(سرورها)
- تعریف کردن متغیرهای گروهی
- دسته بندی هاستها(سرورها)
- بهترین رویکرد برای تنظیم کردن دستری root
- مولتی تارگتینگ – Multi Targeting
اگر بگوییم ماژول ping
یکی از ساده ترین و البته معروف ترین ماژولهای انسیبل است، کم بیراه نگفته ایم. این ماژول برای برسی کردن ارتباط بین کنترلر و سرور است.
(venv) $ ansible <target> -m ping (venv) $ ansible <target> -m ping -o # Shortened output
در اینجا <target>
یک place holder از سرور یا سرورهایی است که ما میخواهیم بر آنها از ماژول پینگ اعمال کنیم. مرسوم ترین و البته بهترین راه برای تعریف گردن اهداف(سرورها) استفاده از اینونتوری (Inventory) است.
اینونتوری ها معمولا با فرمت ini
نوشته میشوند:
[centos] centos1 centos2 centos3 [ubuntu] ubuntu1 ubuntu2 ubuntu3
در مثال بالا ما سروهای centos و ubuntu را به دو گروه تقسیم کردهایم. به این ترتیب میتوانیم ماژول پینگ را فقط را بر سرورهای centos و یا ubuntu اعمال کنیم.
(venv) $ ansible centos -m ping -o (venv) $ ansible ubuntu -m ping -o
استفاده کردن از فرمتهای کافینگ مثل ini به قدرت انعطاف زیادی میدهد. در ادامه به این مطلب خواهیم پرداخت. اما گاها ممکن است بخواهیم که برای هر سرور متغیر خاصی تعریف کنیم. در مثال پائین ما مشخص میکنیم که برای سرورها centos انسیبل از root استفاده کند:
[centos] centos1 ansible_user=root centos2 ansible_user=root centos3 ansible_user=root [ubuntu] ubuntu1 ubuntu2 ubuntu3
در انسیبل متغیر anisble_user
مشخص میکند که انسیبل با کدام user اعمال خواهد شد. انسیبل متغیر های متونعی دارد که بصورت های مختلف قابل تعریف شدن هستند. داکیومنت انسیبل لیست بزرگی از انواع متغیر را در اینجا مشخص کرده است. ما در قسمت متغیرها به تفصیل درباره تعدادی از آنها صحبت خواهیم کرد. در بخش فقط در خصوص تعدای از آنها که با اینونتوریها رابطه مستقیم دارند صحبت خواهیم کرد.
حال اگر بخواهیم برای سرورهای ubuntu هم از root استفاده کنیم میتوانیم از متغیرهای خاص دیگری نیز استفاده کینم. به این ترتیب از در روش مختلف برای توزیعهای ubuntu و centos بهره خواهیم گرفت.
[centos] centos1 ansible_user=root centos2 ansible_user=root centos3 ansible_user=root [ubuntu] ubuntu1 ansible_become=true ansible_become_pass=password ansible_password=password ubuntu2 ansible_become=true ansible_become_pass=password ansible_password=password ubuntu3 ansible_become=true ansible_become_pass=password ansible_password=password
متغیر ansible_become
یک از نوع boolean است مشخص میکند که انسیبل باید به یوزری مبدل شود. استفاده از این متغیر بصورت پیشفرض از مثل اجرا کردن یک دستور لینوکسی با sudo
است. البته انسیبل میتواند از مکانیزمهای متفاوتی برای تبدیل شدن (become) استفاده کند.
متغیر ansible_become_pass
برای مشخص کردن کلمه عبوری است که انسیبل برای تبدیل شدن باید از آن استفاده کند.
متغیر ansible_password
پسوردی است که انسیبل باید برای ssh از آن استفاده کند.
در بخش anisble-vault
به تفصیل در خصوص امن نگه داشتن کلمات عبوری و اطلاعات طبقه بندی شده صحبت خواهیم کرد.
[centos] centos1 ansible_user=root ansible_port=22 centos2 ansible_user=root centos3 ansible_user=root [ubuntu] ubuntu1 ansible_become=true ansible_become_pass=password ubuntu2 ansible_become=true ansible_become_pass=password ubuntu3 ansible_become=true ansible_become_pass=password
ممکن است در سناریو های مختلف sshd.service به پورت ۲۲ گوش نکند. در این حالت میتوان از متغیر ansible_port
استفاده کرد.
[centos] centos1 ansible_user=root ansible_port=2222 centos2 ansible_user=root centos3 ansible_user=root
یا
ansible_password=password
[centos] centos1:22 ansible_user=root centos2 ansible_user=root centos3 ansible_user=root
انسیبل میتواند به روشهای مختلفی به سرورها متصل شود و دستورات اعم از ad-hoc و یا مطابق با playbooks اجرا کند. به عنوان مثال میتوان دستورات را بر سرور کنترلر هم اعمال کرد.
[control] ubuntu-c ansible_connection=local
برای دسته بندی هاستها در اینونتوری میتوان از place holder براکت []
هم استفاده کرد. در مثال زیر ما بجای نوشتن هاستهای centos2 و centos3 و برای هاستهای ابونتو از این place holder استفاده کردهایم.
[control] ubuntu-c ansible_connection=local [centos] centos1 ansible_port=22 centos[2:3] [centos:vars] ansible_user=root [ubuntu] ubuntu[1:3] [ubuntu:vars] ansible_become=true ansible_become_pass=password ansible_password=password
بنابراین برای تعریف متغیر ها هم از همین روش استفاده میکنیم. به این صورت متغیرها را یکبار بصورت گروهی تعیرف میکنیم. [ubuntu:vars]
و [centos:vars]
حال میشود از همین رویکرد برای ایجاد دستههای والد هم استفاده کرد. مثلا توزیعهای اوبونتو و سنتاواس هر دو در تقسیم بندی لینوکس قرار خواهند گرفت.
[control] ubuntu-c ansible_connection=local [centos] centos1 ansible_port=2222 centos[2:3] [centos:vars] ansible_user=root [ubuntu] ubuntu[1:3] [ubuntu:vars] ansible_become=true ansible_become_pass=password [linux:children] centos ubuntu
برای تعریف کردن متغیرهای گروهی میتوان از کلیدواژه all هم استفاده کرد. مثلا:
[all:vars] ansible_port=1234
اینونتوریها را میتوان با فرمت yaml و json هم نوشت:
--- control: hosts: ubuntu-c: ansible_connection: local centos: hosts: centos1: ansible_port: 22 centos2: centos3: vars: ansible_user: root ubuntu: hosts: ubuntu1: ubuntu2: ubuntu3: vars: ansible_become: true ansible_become_pass: password ansible_password: password linux: children: centos: ubuntu: ...
{ "control": { "hosts": { "ubuntu-c": { "ansible_connection": "local" } } }, "ubuntu": { "hosts": { "ubuntu1": null, "ubuntu2": null, "ubuntu3": null }, "vars": { "ansible_become": true, "ansible_become_pass": "password", "ansible_password": "password" } }, "centos": { "hosts": { "centos3": null, "centos2": null, "centos1": { "ansible_port": 22 } }, "vars": { "ansible_user": "root" } }, "linux": { "children": { "centos": null, "ubuntu": null } } }
تا به اینجا تقریبا بخش زیادی از مبحث Ansible Inventories پوشش داده شده. در آینده به مبحث Ansible dynamic inventories خواهیم پرداخت و خواهیم آموخت بصورت پویا اینونتوریهای خود را ایجاد کنیم.
لطفا زمانی را صرف مطالعه این صحفه از مستندات انسیبل را تحت عنوان «چگونه اینوتوریهای انسیبل را بنوسیم» کنید.
خیلی خوب. سپاس
خواهش میکنم.
شما خودتون این مطاب را از کجا بلدید؟
سلام فرهاد جان،
خیلی ممنون از پیامت. اول از همه بنظرم میاد که شما منطورتون «مطالب» هست؟ اگر همین مد نظرتون هست، بله من چند سال سابقه کار در ضمینه دوآپس دارم و با الهام گرفتن از دورههایی که در آلمان دیدم تصمیم گرفتم یک محتوای آموزش انسیبل برای دوآپس تولید کنم. امیدوارم پستها و ویدئوهای من را دنبال کنی و از اونها خوشت بیاد. 🙂
خیلی عالی. بنظرم کیفیت صدا اصلا خوب نیست ولی.
سلام.
ممنون از نظرتون. بله حق با شماست سعی میکنم در قسمتهای بعدی این مشکل را برطرف کنم.
صفحه اول گوگل مبارک. «آموزش انسیبل»
ممنونم مرمر جان. لطف عالی مستدام
درود. قسمت جدید کی میاد؟
سلام شایان عزیز،
ممنون از کامنت و پیگیریهاتون. در دست تولید هست بزودی منتشر میشه.
عالی