آموزش انسیبل برای دوآپس – قسمت اول از بخش اول

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

اینونتوری‌ها – 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 خواهیم پرداخت و خواهیم آموخت بصورت پویا اینونتوری‌های خود را ایجاد کنیم.
لطفا زمانی را صرف مطالعه این صحفه از مستندات انسیبل را تحت عنوان «چگونه اینوتوری‌های انسیبل را بنوسیم» کنید.


دیدگاه‌ها

12 پاسخ به “آموزش انسیبل برای دوآپس – قسمت اول از بخش اول”

  1. علیرضا نیم‌رخ
    علیرضا

    خیلی خوب. سپاس

    1. خواهش میکنم.

  2. شما خودتون این مطاب را از کجا بلدید؟

    1. سلام فرهاد جان،
      خیلی ممنون از پیامت. اول از همه بنظرم میاد که شما منطورتون «مطالب» هست؟ اگر همین مد نظرتون هست، بله من چند سال سابقه کار در ضمینه دوآپس دارم و با الهام گرفتن از دوره‌هایی که در آلمان دیدم تصمیم گرفتم یک محتوای آموزش انسیبل برای دوآپس تولید کنم. امیدوارم پستها و ویدئوهای من را دنبال کنی و از اونها خوشت بیاد. 🙂

  3. محمد علی جوانمردی نیم‌رخ
    محمد علی جوانمردی

    خیلی عالی. بنظرم کیفیت صدا اصلا خوب نیست ولی.

    1. سلام.
      ممنون از نظرتون. بله حق با شماست سعی میکنم در قسمتهای بعدی این مشکل را برطرف کنم.

  4. صفحه اول گوگل مبارک. «آموزش انسیبل»

    1. ممنونم مرمر جان. لطف عالی مستدام

  5. درود. قسمت جدید کی میاد؟

    1. سلام شایان عزیز،
      ممنون از کامنت و پیگیری‌هاتون. در دست تولید هست بزودی منتشر میشه.

  6. عالی

  7. Good post. I learn something totally new and challenging on blogs I stumbleupon every day. It will always be interesting to read through articles from other writers and use a little something from other sites.

پاسخی بگذارید

%d وب‌نوشت‌نویس این را دوست دارند: