devops, کلاسترینگ, مقالات

آموزش Ansible : کتاب راهنما، دستورات و مثال


آموزش Ansible برای مبتدیان: کتاب راهنما، دستورات و مثال

Ansible چیست؟

 

Ansible یک ابزار اتوماسیون و هماهنگ سازی متن باز برای تهیه نرم افزار، مدیریت پیکربندی و استقرار نرم افزار است. Ansible می تواند به راحتی سیستم های شبه یونیکس و همچنین سیستم های ویندوز را برای ارائه زیرساخت به عنوان کد اجرا و پیکربندی کند. این شامل زبان برنامه نویسی اعلامی خود برای پیکربندی و مدیریت سیستم است. Ansible به دلیل سادگی نصب، سهولت استفاده در مواردی که به اتصال به مشتریان مربوط می شود، عدم وجود عامل برای مشتریان Ansible و مهارت های بسیار محبوب است. با اتصال از طریق SSH به کلاینت ها عمل می کند، بنابراین نیازی به عامل خاصی در سمت کلاینت ندارد و با فشار دادن ماژول ها به کلاینت ها، ماژول ها به صورت محلی در سمت کلاینت اجرا می شوند و خروجی به عقب رانده می شود. به سرور Ansible. از آنجایی که از SSH استفاده می کند، می تواند به راحتی با استفاده از کلیدهای SSH به کلاینت ها متصل شود و کل فرآیند را ساده تر کند. جزئیات مشتری، مانند نام هاست یا آدرس های IP و پورت های SSH، در فایل هایی به نام فایل های  inventory ذخیره می شوند. هنگامی که یک فایل  inventory ایجاد کردید و آن را پر کردید، ansible می تواند از آن استفاده کند. در این آموزش Ansible برای مبتدیان، گام به گام Ansible را یاد خواهید گرفت:

Ansible چیست؟

چرا از Ansible استفاده کنیم؟

تاریخچه Ansible

اصطلاحات مهم استفاده شده در Ansible

نصب Ansible در لینوکس

دستورات Ad-hoc Ansible

Ansible Playbooks

Ansible Roles

 دستورات  Ansible Cheat Sheet 

چرا از Ansible استفاده کنیم؟

 

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

تاریخچه Ansible

در اینجا، نشانه های مهم تاریخی از تاریخ Ansible است: در فوریه 2012 پروژه Ansible آغاز شد. اولین بار توسط Michael DeHaan، خالق Cobbler and Func، Fedora Unified Network Controller توسعه داده شد. شرکتی که در ابتدا AnsibleWorks Inc نام داشت، شرکتی که بودجه ابزار Ansible را تامین می کرد در سال 2015 توسط RedHat خریداری شد و بعداً به همراه RedHat تحت حمایت IBM قرار گرفتند. در حال حاضر، Ansible در توزیع هایی مانند Fedora Linux، RHEL، Centos و Oracle Linux گنجانده شده است.

اصطلاحات مهم استفاده شده در Ansible

 

Ansible server:

دستگاهی که Ansible در آن نصب شده است و تمام وظایف و playbooks  از آن اجرا می شود.

Module:

اساسا، یک ماژول یک دستور یا مجموعه ای از دستورات مشابه Ansible است که قرار است در سمت کلاینت اجرا شوند.

Task:

وظیفه بخشی است که از یک رویه واحد تشکیل شده است که باید تکمیل شود.

Role:

راهی برای سازماندهی وظایف و فایل‌های مرتبط که بعداً در یک playbooks فراخوانی شوند.

Fact:

اطلاعات از سیستم مشتری از متغیرهای سراسری با عملیات جمع آوری حقایق واکشی شده است

Inventory:

فایل حاوی داده‌های مربوط به سرورهای کلاینت قابل تشخیص. در مثال های بعدی به عنوان فایل hosts تعریف شده است.

Play:

اجرای playbooks

Handler:

وظیفه ای که فقط در صورت وجود اعلان کننده فراخوانی می شود.

Notifier:

بخش منتسب به وظیفه ای که در صورت تغییر خروجی، یک کنترل کننده را فرا می خواند.

Tag:

نام برای یک کار تنظیم شده است که می تواند بعداً برای صدور آن کار خاص یا گروهی از وظایف استفاده شود.

 

نصب Ansible در لینوکس

 

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

نصب بر روی نسخه های RedHat/Centos

Step 1) Install EPEL repo

[root@ansible-server ~]# sudo yum install epel-release

Step 2) Install ansible package

[root@ansible-server ~]# sudo yum install -y ansible

 

نصب بر روی نسخه های Ubuntu/Debian

Step 1) Perform an update to the packages

$ sudo apt update

Step 2) Install the software-properties-common package

$ sudo apt install software-properties-common

Step 3) Install ansible personal package archive

$ sudo apt-add-repository ppa:ansible/ansible

Step 4) Install ansible

$ sudo apt update

$ sudo apt install ansible

Ansible ad-hoc commands

 

یکی از ساده ترین راه هایی که می توان از Ansible استفاده کرد استفاده از دستورات ad-hoc است. این ها می توانند زمانی استفاده شوند که می خواهید برخی از دستورات را روی یک سرور یا دسته ای از سرورها صادر کنید. دستورات Ad-hoc برای استفاده های بعدی ذخیره نمی شوند، بلکه نشان دهنده یک راه سریع برای تعامل با سرورهای مورد نظر هستند. برای این آموزش Ansible، یک فایل میزبان دو سرور ساده، شامل host1 و host2 پیکربندی خواهد شد. با صدور دستور ping در همه هاست ها می توانید از دسترسی به هاست ها از سرور ansible اطمینان حاصل کنید.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}




توضیح:

1- وضعیت فرمان، در این مورد، SUCCESS 

2- میزبانی که فرمان روی آن اجرا شد

3- فرمان صادر شده از طریق پارامتر -m، در این مورد، پینگ

4- با پارامتر -i می توانید به فایل host اشاره کنید.

 

در صورت نیاز می توانید همین دستور را فقط روی یک هاست خاص صادر کنید.

 

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}





توضیح:

1- پارامتر Limit را می توان برای صدور دستورات فقط بر روی هاست های خاص در فایل میزبان استفاده کرد

2- نام میزبان همانطور که در فایل موجودی تعریف شده است

اگر نیاز دارید که یک فایل را به سرعت در چندین مقصد کپی کنید، می توانید از ماژول کپی در ansible استفاده کنید که از SCP استفاده می کند. بنابراین دستور و خروجی آن مانند زیر است:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}





توضیح:

1- ماژول کپی تعریف شده است

2- آرگومان های ماژول، در این مورد، مسیر مطلق مبدا و مسیر مطلق مقصد هستند.

3- خروجی فرمان قابل قبولی که منعکس کننده موفقیت فرمان کپی و جزئیات دیگر مانند جمع‌های چک sha1 یا md5 برای بررسی یکپارچگی فایل و ابرداده‌هایی مانند مالک، اندازه یا مجوزها است.نصب بسته‌ای روی دسته‌ای از سرورها کار ساده‌ای است. Ansible چندین ماژول دارد که با نصب کننده های استفاده شده مانند yum، apt، dnf و غیره تعامل دارند.

در مثال بعدی، نحوه نصب یک بسته را از طریق ماژول yum روی دو هاست Centos خواهید فهمید.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}




توضیح:

1- در این مثال از ماژول Yum استفاده شده است

2- آرگومان های ماژول را تعریف می کند و در این صورت شما نام بسته و وضعیت آن را انتخاب می کنید. به عنوان مثال، اگر حالت وجود نداشته باشد، بسته جستجو می شود و در صورت یافتن، حذف می شود

3- هنگامی که به رنگ زرد رنگ می شود، خروجی دستور ansible را با تغییر حالت مشاهده خواهید کرد، به این معنی که در این حالت بسته پیدا شده و نصب شده است.

4- وضعیت دستور yum install صادر شده از طریق ansible. در این مورد بسته ncdu.x86_64 0:1.14-1.el7 نصب شد.

البته، همه گزینه های نصب کننده yum را می توان از طریق ansible استفاده کرد، از جمله به روز رسانی، نصب، آخرین نسخه یا حذف. در مثال زیر همان فرمان برای حذف بسته ncdu نصب شده قبلی صادر شد.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

توضیح:

خروجی دستور yum نشان می دهد که بسته حذف شده است. یکی دیگر از ویژگی های مفید و ضروری که ansible برای تعامل با سرور مشتری استفاده می کند، جمع آوری برخی از حقایق در مورد سیستم است. بنابراین، اطلاعات سخت‌افزار، نرم‌افزار و نسخه‌سازی را از سیستم دریافت می‌کند و هر مقدار را در متغیری ذخیره می‌کند که می‌تواند بعداً مورد استفاده قرار گیرد. در صورت نیاز به اطلاعات دقیق در مورد سیستم هایی که باید از طریق ansible اصلاح شوند، می توان از دستور بعدی استفاده کرد. ماژول راه اندازی اطلاعات را از متغیرهای سیستم جمع آوری می کند.

Ansible Playbooks

 

Ansible Playbooks راهی برای ارسال دستورات به سیستم های راه دور از طریق اسکریپت است. از Playbooks Ansible برای پیکربندی محیط‌های پیچیده سیستم برای افزایش انعطاف‌پذیری با اجرای یک اسکریپت در یک یا چند سیستم استفاده می‌شود. Playbookهای Ansible بیشتر یک زبان پیکربندی هستند تا یک زبان برنامه نویسی. دستورات Ansible playbook از فرمت YAML استفاده می کنند، بنابراین سینتکس زیادی مورد نیاز نیست، اما تورفتگی باید رعایت شود. همانطور که از نامش مشخص است،Playbooks  مجموعه ای از نمایشنامه است. از طریق یک Playbooks ، می‌توانید نقش‌های خاصی را برای برخی میزبان‌ها و نقش‌های دیگر را برای میزبان‌های دیگر تعیین کنید. با انجام این کار، می توانید چندین سرور را در سناریوهای بسیار متنوع، همه در یک Playbooks هماهنگ کنید. برای اینکه قبل از ادامه مثال‌های Playbooks Ansible، تمام جزئیات را دقیق داشته باشیم، ابتدا باید یک وظیفه را تعریف کنیم. اینها رابط ماژول های قابل تنظیم برای نقش ها و Playbooks هستند. اکنون، بیایید Playbooks Ansible را از طریق یک مثال با Playbooks با یک نمایشنامه، حاوی چندین کار مانند زیر یاد بگیریم:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

در مثال بالا Ansible playbook، گروه 1 میزبان ها در فایل میزبان برای نصب بسته lldpad با استفاده از ماژول yum هدف قرار می گیرد و پس از آن سرویس lldpad ایجاد شده پس از نصب با استفاده از ماژول سرویس که بیشتر برای تعامل با مجموعه systemd استفاده می شود، شروع می شود.

توضیح:

1- گروهی از میزبان ها که playbook روی آنها اجرا می شود

2- ماژول Yum در این کار برای نصب lldpad استفاده می شود

3- ماژول سرویس برای بررسی اینکه آیا سرویس پس از نصب فعال است یا خیر استفاده می شود

هر ansible playbook با یک فایل inventory کار می کند. فایل inventory شامل لیستی از سرورها است که برای کنترل بهتر برای جزئیاتی مانند آدرس IP و پورت SSH برای هر میزبان به گروه‌هایی تقسیم شده‌اند. فایل inventory که می توانید برای این مثال کتاب بازی Ansible استفاده کنید مانند زیر است. دو گروه به نام‌های گروه 1 و گروه 2 وجود دارد که هر کدام به ترتیب شامل میزبان 1 و میزبان 2 هستند.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

توضیح:

1- اسم گروه نام میزبان،

2- با آدرس IP و پورت ssh، در این مورد، یک پیش فرض، 22.

یکی دیگر از نمونه های مفید Ansible playbook  که شامل این بار دو بازی برای دو میزبان است، مورد بعدی است. برای گروه اول میزبان ها، گروه 1، selinux فعال خواهد شد. اگر فعال باشد، پیامی روی صفحه میزبان ظاهر می شود. برای گروه دوم هاست ها، بسته httpd فقط در صورتی نصب می شود که ansible_os_family RedHat و ansible_system_vendor HP باشد. Ansible_os_family و ansible_system_vendor متغیرهایی هستند که با گزینه collect_facts جمع آوری شده اند و می توانند مانند این مثال شرطی استفاده شوند.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'



توضیح:

1- مثالی از بند When، در این مورد، زمانی که نوع سیستم عامل Debian باشد. متغیر ansible_os_family از طریق عملکرد collect_facts جمع آوری می شود.

2- خروجی وظیفه برای استفاده در آینده با نام آن enable_selinux ثبت شده است

3- مثال دیگری از بند When. در این حالت، اگر SELinux قبلاً فعال شده باشد، پیامی برای کاربر میزبان نمایش داده می شود.

4- مثال دیگری از بند زمانی که از دو قانون تشکیل شده است

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


---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

در این حالت، اگر وظیفه اول، “sshd config file modify port” تغییر کند، به این معنی که اگر پورت در وهله اول 28675 نباشد، تغییر داده می شود و وظیفه به کنترل کننده با همین نام اطلاع می دهد تا اجرا شود. ، و سرویس sshd را مجددا راه اندازی می کند



توضیح:

1- نمونه ای از یک اعلان کننده

2- نمونه ای از یک کنترل کننده

Ansible Roles

 

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

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files


فایل yaml در دایرکتوری پیش‌فرض حاوی لیستی از متغیرهای پیش‌فرض است که باید همراه با playbook استفاده شوند. دایرکتوری handlers برای ذخیره گرداننده ها استفاده می شود. فرادایرکتوری قرار است اطلاعاتی در مورد وابستگی نویسنده و نقش داشته باشد. در فهرست وظایف، فایل yaml اصلی برای نقش وجود دارد. دایرکتوری tests شامل یک نمونه فایل yaml playbook و یک نمونه فایل موجودی است و بیشتر برای اهداف آزمایشی قبل از ایجاد نقش واقعی استفاده می شود. دایرکتوری vars حاوی فایل yaml است که در آن تمام متغیرهای استفاده شده توسط نقش تعریف می شوند. الگوهای دایرکتوری و فایل‌های دایرکتوری باید حاوی فایل‌ها و الگوهایی باشند که توسط وظایف موجود در نقش استفاده می‌شوند. برای ایجاد درخت دایرکتوری برای یک نقش، باید از دستور زیر با آخرین پارامتر یعنی نام نقش استفاده کنید:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible همچنین با قالب ها به خوبی کار می کند. به عنوان زبانی برای الگوسازی، از Jinja2 استفاده می کند. در مثال بعدی متوجه خواهید شد که چگونه یک قالب اصلی jinja2 به نظر می رسد و از آن در یک نقش استفاده می کنید. در زمان اجرا، بسته به، فرض کنید سرور شما در کدام مرکز داده قرار دارد، می‌توانید با استفاده از متغیر «resolver_ip_addresses» از بین بیش از یک سرور نام که هر کدام مربوط به یک مرکز داده است، انتخاب کنید.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

در این مثال، در فهرست راهنمای playbook، متغیرهایی از جمله متغیری به نام solver_ip_addresses با مقادیر متفاوت بسته به مرکز داده تعریف شده است.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver	




توضیح:

1- نام قالب مورد استفاده قالب در قالب‌ها در مسیر نقش قرار دارد

2- مسیر مقصد نام فایل که باید با الگو جایگزین شود،در سمت سرویس گیرنده.

3- مجوزهای فایل مقصد

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

Ansible Case Study

 

در این بخش، مطالعه موردی یک playbook ضروری را که دارای سه نقش است، تحلیل خواهیم کرد. هدف از این کار ارائه یک مثال عملی از آنچه قبلاً در مورد آن صحبت کردیم است. برخی از نمونه‌هایی که قبلاً در این کتاب آموزشی Ansible استفاده شده بود، در این راهنما اقتباس شده و استفاده می‌شود. در زیر ساختار دایرکتوری playbook آمده است. فایل Yaml که استفاده خواهد شد p4.yml خواهد بود

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver






playbook دارای سه نقش است، یکی به نام Resoler که با کپی کردن یک فایل از سرور در مقصد /etc/resolv.conf، یک سرور نام خاص را روی سرورها تنظیم می کند. یکی دیگر httpd نام دارد و بسته httpd را با ماژول yum نصب می کند و سومی SELinux را فعال می کند و به کاربر ثبت نام شده اطلاع می دهد که سیستم را راه اندازی مجدد کند. هر نقش با استفاده از دستور ansible-galaxy ایجاد شد.

نقش حل‌کننده، وظیفه main.yml:

نقش Httpd، وظیفه main.yml:

نقش Selinux، وظیفه main.yml:

در زیر راهنمای p4.yml تعریف شده است. اگر غیر از این در خط فرمان مشخص نشده باشد روی همه هاست ها اجرا می شود، به عنوان کاربر ریشه در پورت 22 (SSH) اجرا می شود، قبل از اجرای نقش ها اطلاعات را جمع آوری می کند و هر سه نقشی که قبلا ذکر شد را اجرا می کند. هر نقش را می توان به طور مستقل با تعیین تگ در خط فرمان ansible-playbook با پارامتر –t اجرا کرد.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

اجرای playbook p4.yml روی دو هاست و تفسیر خروجی. همین دستور را می توان با پارامتر –check برای اجرای dry-run اجرا کرد. در صورتی که می خواهید از احراز هویت رمز عبور استفاده کنید، از پارامتر -k استفاده کنید.

توضیح:

1- دستور Ansible-playbook که p4.yml را اجرا می کند

2- Playbook نقش SELinux را رد می کند زیرا قبلاً فعال شده است.

3- Ansible دریافت که بسته httpd قبلاً نصب شده است، بنابراین ok برمی‌گرداند.

4- Resolver تنظیم شد و وضعیت Resolver تغییر کرد.

Ansible Commands Cheat Sheet

 

 

[root@ansible-server ~]# sudo yum install epel-release
[root@ansible-server ~]# sudo  yum install -y ansible
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt update
$ sudo apt install ansible

[root@ansible-server test_ansible]# ansible -i hosts all -m ping

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
[root@ansible-server test2]# ansible-galaxy init role1
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k




خلاصه

 

در دنیایی با فناوری که به طور مداوم با سرعتی سریع در حال تغییر است و در عین حال با سرعت باورنکردنی در حال رشد است، مدیران سیستم و مهندسان توسعه دهنده باید به رویکردهای متفاوتی در مورد چگونگی خودکارسازی وظایف روتین و سازماندهی مجموعه های بزرگی از سرورها فکر کنند. در حالی که جایگزین‌های زیادی برای Ansible (Chef, Puppet) وجود دارد که با تفاوت‌هایی یکسان را انجام می‌دهند، Ansible با سادگی، امنیت بهبود یافته و مهم‌تر از همه منحنی یادگیری روان خود توانست از همه آنها بالاتر برود. با توجه به این ویژگی ها و پذیرش سریع Ansible، ما یک آموزش پر از مثال ایجاد کردیم تا بتوانید اولین تجربه یکپارچه تر را در کار با Ansible داشته باشید. در این آموزش اصول اولیه Ansible به توضیح ansible پرداختیم و کمی در مورد تاریخچه آن صحبت کردیم. ما به نقاط قوت Ansible و مزایایی که ansible می تواند برای اتوماسیون و هماهنگ سازی زیرساخت ها در اندازه های مختلف به ارمغان بیاورد اشاره کردیم. ما اصطلاحات مورد استفاده ضروری ansible را تعریف کردیم و ساختار کتاب های بازی Ansible را تعریف کردیم. نمونه های کامل تمام اطلاعات را با توضیحات مفصل همراه کردند.

منبع: https://www.guru99.com/ansible-tutorial.html#7

.

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