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

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

By ashkan

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

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

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