یک توسعه‌دهنده

یک توسعه دهنده که بیشتر از توسعه،‌ فیلم می‌بینه و کتاب می‌خونه :)

کمی خودکارسازی با Ansible

چهارشنبه, ۹ فروردين ۱۴۰۲، ۰۲:۳۱ ب.ظ

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

با استفاده از Ansible ما می‌تونیم مجموعه کارهایی که می‌خوایم روی سرورهامون انجام بدیم رو یک‌بار بنویسیم و انسیبل خواسته‌های ما رو انجام بده.

مثلا من نیاز دارم روی سرورهایی که دارم node exporter نصب کنم (حالا این‌که node exporter چی هست رو گوگل کنید تا داخل یه پست دیگه در موردش بنویسم). خب چند مرحله رو باید تکرار کنم: فایل فشرده node exporter رو دانلود کنم، از حالت فشرده خارج کنم، یک سرویس برای node exporter بسازم، سرویس node exporer رو اجرا کنم و در نهایت پورت ۹۱۰۰ رو برای node exporter باز کنم.

حالا فکر کنید که این چند مرحله رو پنج‌بار برای هر کدوم از سرورها باید هی تکرار کنیم که خب تکراری و حوصله سر بره. پس! یه فایل yaml به اسم install_node_exporter.yaml میسازم و کدهای yml زیر رو اضافه می‌کنم:

---
- name: Install Node Exporter on Ubuntu
  hosts: all
  become: true

  tasks:
    - name: Download Node Exporter
      get_url:
        url: "https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz"
        dest: /tmp/node_exporter.tar.gz

    - name: Extract Node Exporter
      unarchive:
        src: /tmp/node_exporter.tar.gz
        dest: /opt
        remote_src: yes
        extra_opts: ["--strip-components=1"]

    - name: Create Node Exporter service file
      copy:
        dest: /etc/systemd/system/node_exporter.service
        content: |
          [Unit]
          Description=Node Exporter
          After=network.target

          [Service]
          User=node_exporter
          Group=node_exporter
          ExecStart=/opt/node_exporter

          [Install]
          WantedBy=multi-user.target

    - name: Reload systemd daemon
      systemd:
        daemon_reload: yes

    - name: Enable and start Node Exporter service
      systemd:
        name: node_exporter
        state: started
        enabled: yes

    - name: Open firewall for Node Exporter
      ufw:
        rule: allow
        port: 9100
        proto: tcp
        comment: "Allow Node Exporter"

به یه فایل inventory هم نیاز داریم که IP سرورها و پورت‌هاشون رو اضافه کنیم:

IP:PORT
IP:PORT
....

نکته، انسیبل در واقع یک اتصال ssh به سرورهامون ایجاد می‌کنه. و نکته دیگه اینه‌که که ssh key خودمون رو به سرورها اضافه کنیم.

یک فایل ansible.cfg هم نیاز داریم:

[defaults]
inventory = inventory
private_key_file = ~/.ssh/PRIVATE_KEY

و در نهایت playbook خودم رو اجرا می‌کنم:

ansible-playbook --ask-become-pass install_node_exporter.yaml

و البته رمز یوزر root سرور رو وارد می‌کنیم.

البته این چیزی که اینجا نوشتم در حال حاضر best practice نیست و کار راه بندازه. هر موقع بیشتر در مورد ansible یاد گرفتم، خب قاعدتا این پست رو آپدیت می‌کنم. این هم دوره‌ای که دارم از روش یاد می‌گیرم:

https://youtu.be/3RiVKs8GHYQ?list=PLT98CRl2KxKEUHie1m24-wkyHpEsa4Y70

نکته جالب! کاور این پست با هوش مصنوعی midjourney ساخته شده. دستش درد نکنه بابت این کاور خوب.

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

تمام حقوق مادی و معنوی این وبلاگ متعلق به وبلاگ سرزمین برنامه نویسی بوده و هر گونه کپی بردای بدون ذکر منبع غیرمجاز و از نظر ما حرام است