نحوه استفاده از Ansible برای تنظیم خودکار سرور اولیه در Ubuntu 18.04

خودکارسازی سرور اکنون به دلیل ماهیت یکبار مصرف محیط‌های کاربردی مدرن، نقش اساسی در مدیریت سیستم‌ها ایفا می‌کند. از ابزارهای مدیریت راه‌اندازی مانند Ansible معمولاً برای ساده‌سازی فرایند خودکار‌سازی تنظیم سرور با ایجاد مراحل استاندارد برای سرورهای جدید استفاده می‌شود و در عین حال خطای انسانی مرتبط با تنظیمات دستی را نیز کاهش می‌دهد.

Ansible یک معماری ساده را ارائه می‌دهد که نیازی به نصب نرم‌افزار ویژه روی Node ها ندارد. همچنین مجموعه‌ای از ویژگی‌ها و ماژول‌های داخلی را فراهم می‌کند که نوشتن اسکریپت‌های اتوماسیون را تسهیل و آسان می‌کند.

در این راهنما نحوه استفاده از Ansible برای خودکارسازی مراحل موجود در راهنمای تنظیم اولیه سرور برای سرورهای Ubuntu 18.04 توضیح داده شده است.

پیش نیازها:

برای اجرای تنظیم خودکار ارائه شده توسط playbook که در این راهنما در مورد آن صحبت می‌کنیم ، موارد زیر لازم است:

  • یک node کنترل Ansible : یک دستگاه Ubuntu 18.04 با Ansible نصب شده و تنظیم شده‌ای است تا با استفاده از کلیدهای SSH به Ansible host های شما متصل شود. اطمینان حاصل کنید که node control دارای یک کاربر معمولی با مجوزهای sudo است و فایروال را نیز فعال کرده‌است، همانطور که در راهنمای راه اندازی سرور اولیه توضیح داده شده‌است. برای تنظیم Ansible، لطفا راهنمای ما را در مورد نحوه نصب و راه‌اندازی Ansible در Ubuntu 18.04 دنبال کنید.
  • یک یا چند Ansible host  : یک یا چند سرور از راه‌دور Ubuntu 18.04

قبل از ادامه کار، ابتدا باید اطمینان حاصل کنید که node کنترل Ansible شما قادر به اتصال و اجرای دستورات در host است برای آزمایش اتصال ، لطفاً مرحله 3 نحوه نصب و راه‌اندازی Ansible  را در Ubuntu 18.04 بررسی کنید.

Playbook چه کاری انجام می‌دهد؟

Ansible playbook جایگزینی برای اجرای دستی از طریق روش ذکر شده در راهنمای تنظیم اولیه سرور Ubuntu 18.04 و راهنمای تنظیم کلیدهای SSH در Ubuntu 18.04 فراهم می‌کند.

اجرای این playbook اقدامات زیر را در Ansible host شما انجام خواهد داد:

  1. aptitude را نصب کنید که توسط Ansible  به عنوان جایگزینی برای مدیر بسته apt ترجیح داده شده‌است.
  2. administrative group wheels را ایجاد و آن را برای sudo بدون رمز تنظیم کنید.
  3. یک کاربر sudo  جدید ایجاد کنید.
  4. یک کلیدpublic  SSH local را کپی کرده و آن را در  authorizes_keys برای کاربر جدید اجرایی روی remote host درج کنید.
  5. احراز هویت مبتنی بر گذرواژه را برای کاربر اصلی غیرفعال کنید.
  6. system packages را نصب کنید.
  7. فایروال UFW را پیکربندی کنید تا فقط اتصالات SSH مجاز باشد و هرگونه درخواست دیگری را رد کنید.

پس از پایان کار playbook ، کاربر جدیدی خواهید داشت که می‌توانید برای ورود به سرور از آن استفاده کنید.

نحوه استفاده از Playbook:

اولین کاری که باید انجام دهید این است که دستیابی به راه‌اندازی اولیه‌ی سرور playbook و وابستگی‌های آن از مخزن  do-community/ansible-playbooks  را فراهم کنید. این مخزن را در یک فولدر محلی درون node control Ansible کلون می‌کنیم.

اگر اولین بار است که از مخازن do-community/ansible-playbooks استفاده می‌کنید، باید شروع کنید به کلون کردن مخزن با node های کنترل:


           $ cd ~

          $ git clone https://github.com/do-community/ansible-playbooks.git

        $   cd ansible-playbooks

اگر قبلا و با دنبال کردن راهنمای دیگری، این مخزن را کلون زده‌اید ، به نسخه‌های موجود در ansible-playbooks خود دسترسی پیدا کنید و یک دستور git pull را اجرا کنید تا مطمئن شوید که محتوا را به روز کرده‌اید


           $ cd ~/ansible-playbooks


              $git pull

فایل‌های مورد نظر ما در فایل setup_ubuntu1804  قرار دارند که دارای ساختار زیر است:

           
setup_ubuntu1804
├── playbook.yml
└── vars
    └── default.yml

در زیر به توضیحات هر یک از این فایل‌ها پرداخته شده‌است:

  • vars/default.yml: فایل متغیر برای شخصی‌سازی تنظیمات playbook.
  • playbook.yml فایل playbook ، شامل وظایفی است که برروی سرور (های) از راه‌دور اجرا می‌شود.

فایل متغیر playbook را برای تغییر مقادیر آن ویرایش خواهیم‌کرد. به دایرکتوری setup_ubuntu1804 دسترسی پیدا کرده و با استفاده از ویرایشگر command line فایل vars/default.yml  را باز کنید.


           $ cd setup_ubuntu1804


               $nano vars/default.ym

این فایل شامل چند متغیر است که توجه شما را جلب می‌کند:

vars/default.yml


      
---
create_user: sammy
copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
sys_packages: [ 'curl', 'vim', 'git', 'ufw']

لیست زیر شامل توضیح مختصری در مورد هر یک از این متغیرها و نحوه تغییر آنها می‌باشد:

  • Create_user : نام کاربر sudo که ایجاد خواهد شد. در این مثال از Sammy استفاده خواهیم کرد.
  •  Copy_local_key: مسیر یک فایل کلیدی عمومی SSH local که باید در سرور ریموت کپی شده‌باشد و

به عنوان authorized_key  برای کاربر جدیدsudo  اضافه شود. مقدار پیش فرض برای به دست آوردن مسیر کامل به کلید عمومی پیش فرض برای کاربر سیستم فعلی در node control Anisble، از افزونه lookup استفاده می‌کند.

  • sys_packages: آرایه‌ای شامل لیستی از بسته‌هایی است که می‌خواهید رویhost   های خود به عنوان بخشی از تنظیم اولیه سرور خود نصب کنید. در این مثال ، می‌خواهیم اطمینان حاصل کنیم که بسته‌های curl  ،  vim ،  git و  ufw  وجود دارند.

پس از اتمام به روزرسانی متغیرهای درون vars/default.yml، این فایل را ذخیره کرده و ببندید. اگر از nano  استفاده کرده‌اید ، با فشار دادن CTRL+X ،  Y و سپس ENTER  این کار را انجام دهید.

اکنون آماده اجرای playbook در یک یا چند سرور هستید. بیشتر playbook ها به گونه‌ای پیش فرض تنظیم شده‌اند که در هر سرور موجودی شما اجرا ‌شوند. می‌توانید از flag -1 استفاده کنید تا مطمئن شوید که فقط یک زیر مجموعه از سرورها یا یک سرور منفرد تحت تأثیر Playbook قرار گرفته‌است. همچنین می‌توانید از flag -u استفاده کنید تا مشخص کنید از کدام کاربر روی سرور از راه‌دور استفاده می‌کنید تا دستورات playbook را روی host  از راه‌دور متصل و اجرا کنید.

برای اجرای playbook فقط در  server1  ، متصل شده با عنوان root ، می‌توانید از دستور زیر استفاده کنید:

$      ansible-playbook playbook.yml -l server1 -u root

در این صورت خروجی‌ مشابه زیر دریافت خواهید کرد:


Output

PLAY [all] *****************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************
ok: [server1]

TASK [Install Prerequisites] ***********************************************************************************************************
changed: [server1]

TASK [Make sure we have a 'wheel' group] ***********************************************************************************************
changed: [server1]

TASK [Allow 'wheel' group to have passwordless sudo] ***********************************************************************************
changed: [server1]

TASK [Create a new regular user with sudo privileges] **********************************************************************************
changed: [server1]

TASK [Set authorized key for remote user] **********************************************************************************************
changed: [server1]

TASK [Disable password authentication for root] ****************************************************************************************
changed: [server1]

TASK [Update apt] **********************************************************************************************************************
changed: [server1]

TASK [Install required system packages] ************************************************************************************************
ok: [server1]

TASK [UFW - Allow SSH connections] *****************************************************************************************************
changed: [server1]

TASK [UFW - Deny all other incoming traffic by default] ********************************************************************************
changed: [server1]

PLAY RECAP *****************************************************************************************************************************
server1                 : ok=11   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  


نکته: برای کسب اطلاعات بیشتر در مورد نحوه اجرای Ansible playbooks، راهنمای پاسخگوی Ansible در صفحه ما را بررسی کنید.

پس از اتمام اجرای playbook ، می‌توانید با مثال زیر وارد سرور شوید:

$     ssh sammy@server_host_or_IP   

به یاد داشته باشید که sammy را با کاربر تعریف شده با متغیر create_user و server_host_or_IP با نام host یا آدرس IP سرور خود جایگزین کنید.

در صورتی که متغیر copy_local_key  را برای اشاره به کلید SSH سفارشی (نه کاربر سیستم فعلی شما) تغییر دادید، هنگام اتصال با SSH به عنوان یک کاربر جدید، لازم است یک پارامتر اضافی که موقعیت همتای کلید خصوصی خود را مشخص می‌کند، فراهم کنید.

$     ssh sammy@server_host_or_IP -i ~/.ssh/ansible_controller_key

پس از ورود به سرور ، می‌توانید قوانین فعال فایروال UFW را بررسی کنید تا صحت پیکربندی آن را تائید کنید:

$     sudo ufw status

شما خروجی‌ مشابه زیر دریافت می‌کنید:

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)  

این بدان معنی است که فایروال UFW با موفقیت فعال شده‌است. از آنجایی که این آخرین وظیفه در playbook بوده‌است، پیام مبنی بر اینکه playbook در این سرور به طور کامل اجرا شده است را تأیید می‌کند.

محتوای playbook

شما می‌توانید راه‌اندازی اولیه سرور تنظیم شدهplaybook  در این آموزش را در مخازن مربوط به ansible-playbooks، درDigitalOcean Community Plaubooks   مشاهده کنید. برای کپی یا بارگیری مستقیم محتوای اسکریپت ، روی دکمه Raw به سمت بالای هر اسکریپت کلیک کنید.

شما می‌توانید راه‌اندازی اولیه سرور تنظیم شدهplaybook  در این آموزش را در مخازن مربوط به ansible-playbooks، درDigitalOcean Community Plaubooks   مشاهده کنید. برای کپی یا بارگیری مستقیم محتوای اسکریپت ، روی دکمه Raw به سمت بالای هر اسکریپت کلیک کنید.

محتویات کامل playbook و همچنین فایل‌های مرتبط با آن نیز برای راحتی شما در اینجا گنجانده شده‌است.

vars/default.yml

فایل متغیر default.yml  حاوی مقادیری است که در وظایف playbook بکار گرفته خواهد‌ شد، مانند نام کاربری ایجاد شده و بسته‌هایی که باید به عنوان بخشی از تنظیم اولیه سرور نصب شوند.

vars/default.yml
---
create_user: sammy
copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
sys_packages: [ 'curl', 'vim', 'git', 'ufw']

playbook.yml

فایل playbook.yml محلی است که کلیه وظایف این مجموعه در آن تعریف شده‌‎است. این فایل با تعریف گروه سرورهایی که باید هدف این مجموعه باشند (all) شروع می‌شود، سپس از become: true برای تعریف وظایفی که باید به صورت پیش فرض با افزایش دسترسی اجرا شوند، استفاده می‌کند. سپس شامل فایل متغیر vars/default.yml  برای بارگذاری گزینه‌های پیکربندی می‌شود.

playbook.yml


---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install Prerequisites
      apt: name=aptitude update_cache=yes state=latest force_apt_get=yes

  # Sudo Group Setup
    - name: Make sure we have a 'wheel' group
      group:
        name: wheel
        state: present

    - name: Allow 'wheel' group to have passwordless sudo
     lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s'

  # User + Key Setup
    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ create_user }}"
        state: present
        groups: wheel
        append: true
        create_home: true
        shell: /bin/bash

    - name: Set authorized key for remote user
      authorized_key:
        user: "{{ create_user }}"
        state: present
        key: "{{ copy_local_key }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

  # Install Packages
    - name: Update apt
      apt: update_cache=yes

    - name: Install required system packages
      apt: name={{ sys_packages }} state=latest

 # UFW Setup
    - name: UFW - Allow SSH connections
      ufw:
        rule: allow
        name: OpenSSH

    - name: UFW - Deny all other incoming traffic by default
      ufw:
        state: enabled
        policy: deny
        direction: incoming

شما می‌توانید این دفترچه راهنما را به راحتی متناسب با نیازهای شخصی در گردش کار خود، تغییر دهید.

نتیجه‌گیری:

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

در این راهنما، نحوه استفاده از Ansible برای اتوماسیون اقدامات اولیه‌ای که باید بر روی یک سرور تازه انجام گیرد، مانند: ایجاد یک کاربر غیر Root با دسترسی sudo ، فعال کردن UFW و غیرفعال کردن ورود به سیستم از راه‌دور مبتنی بر رمز عبور Root ، شرح داده شده‌است.

اگر می‌خواهید اقدامات جدیدی را در playbook برای شخصی‌سازی بیشتر تنظیمات اولیه سرور خود فرا گیرید، لطفاً به راهنمای مقدماتی پاسخگو پیکربندی مدیریت 101: نگارش کتابهای Playable Ansible مراجعه کنید. همچنین می‌توانید راهنمای ما را در مورد چگونگی استفاده از نقش های Ansible در در نظر گرفتن محیط زیرساختی خود، مطالعه کنید

منبع :

Digital Ocean