کمی خودکارسازی با 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 ساخته شده. دستش درد نکنه بابت این کاور خوب.