Một phần rất quan trọng trong DevOps mà mọi người đều biết là làm sao tiết kiệm thời gian và tự động hoá các tác vụ lặp đi lặp lại. Để làm việc này thì đối với tôi Python là một công cụ hỗ trợ rất đắc lực (chắc cũng có nhiều bạn thích sử dụng bashscript và thật sự thì cái gì cũng có ưu điểm riêng và tôi dùng cả hai như nhau).

Trong bài này tôi có tổng hợp một vài các script python (nhỏ thôi) cũng khá thường dùng và thấy hữu ích trong các tác vụ lặp lại hàng ngày. Thì khi viết script tôi đều đặt các tiêu chí:
- Dễ tiếp cận: Phù hợp cho cả mọi người newbie và intermediate (đỉnh cao của phức tạp là sự tối giản).
- Miễn phí: Không yêu cầu API hay dịch vụ trả phí.
- Tiện lợi: Chạy trực tiếp trên terminal hoặc Git Bash.
- Đơn giản: Chỉ cần lưu trữ là chạy, không cần setup phức tạp.
Mọi người có thể xem thử mong rằng sẽ hữu ích cho mọi người trong công việc.
1. Đọc log real-time và highlight theo từ khoá
Thay vì phải kết hợp nhiều lệnh như tail
, grep
, less
, Python có thể gộp các bước này lại và highlight màu để dễ theo dõi hơn.
import re
import time
log_file = "your.log"
pattern = re.compile("ERROR|WARN")
with open(log_file, "r") as f:
f.seek(0, 2) # go to end
while True:
line = f.readline()
if not line:
time.sleep(0.5)
continue
if pattern.search(line):
print(f"\033[91m{line.strip()}\033[0m") # red highlight
Note: Thay your.log
bằng đường dẫn file log của mọi người. Script này hoạt động tương tự lệnh tail -f | grep
.
2. Phân tích dung lượng ổ đĩa
Khi server gần đầy dung lượng, script này sẽ giúp mọi người tìm ra ngay thư mục nào đang chiếm nhiều dung lượng nhất mà không cần kiểm tra thủ công.
import os
path = "."
for root, dirs, files in os.walk(path):
total = sum(os.path.getsize(os.path.join(root, f)) for f in files)
if total > 10 * 1024**2: # >10MB
print(f"{root}: {total // 1024**2} MB")
Note: Dùng script này để xác định đúng thư mục chiếm dung lượng lớn nhất trước khi dọn dẹp, xem xét kỹ trước nhé không là lại dọn ngay thư mục ‘mất tiền’ :)).
3. Quét port nhanh trên localhost
Công cụ đơn giản để kiểm tra xem các port cần thiết đã được mở sau khi deploy hay chưa.
import socket
ports = [22, 80, 443, 8000, 8080]
for port in ports:
s = socket.socket()
s.settimeout(1)
try:
s.connect(("127.0.0.1", port))
print(f" Port {port} is OPEN")
except:
print(f" Port {port} is CLOSED")
s.close()
Note: Tôi thấy nó rất hữu ích để kiểm tra nhanh trạng thái các service trước và sau khi deploy, thật ra thì anh em hay sử dụng lệnh netstat cũng rất hợp lý nhưng khi nó lên vài chục/vài trăm port rồi thì dùng script sẽ rõ ràng hơn (tùy bài toán nhé).
4. Kiểm tra trạng thái của service (HTTP)
Tự động kiểm tra xem một URL có bị down không và thử lại vài lần để có kết quả chính xác.
import requests
import time
url = "https://example.com"
for i in range(3):
try:
r = requests.get(url, timeout=5)
print(f"{url} is UP: {r.status_code}")
break
except:
print(f"Attempt {i+1}: {url} is DOWN")
time.sleep(3)
Note: Có thể đặt lịch chạy định kỳ qua cron job để giám sát uptime của service, cái này thì rất hữu ích luôn rồi.
5. Kiểm tra các thay đổi chưa được commit trong repo
Giúp mọi người đảm bảo không push những thay đổi còn dang dở hoặc file tmp lên repo chung.
import subprocess
status = subprocess.getoutput("git status --porcelain")
if status:
print(" Repo is dirty! Uncommitted changes:")
print(status)
else:
print(" Repo is clean.")
Note: Kinh nghiệm của tôi là nên chạy script này trong quy trình pre-push để tránh push nhầm code.
6. Gửi mail thông báo từ Cron Job
Nếu cần nhận kết quả hoặc log từ một script chạy định kỳ, đây là một giải pháp đơn giản cũng vẫn đáp ứng được tốt yêu cầu.
import smtplib
from email.message import EmailMessage
def send_email(body):
msg = EmailMessage()
msg.set_content(body)
msg["Subject"] = "Cron Job Output"
msg["From"] = "you@example.com"
msg["To"] = "you@example.com"
with smtplib.SMTP("localhost") as s:
s.send_message(msg)
send_email(" Backup complete at 3AM.")
Note: Bạn điều chỉnh lại cấu hình SMTP cho phù hợp. Hoặc một phương án khác là ghi log ra file hay gửi về mấy kênh như telegram, slack cũng đều ổn.
7. Dọn dẹp tài nguyên Docker không sử dụng
Dùng docker thì mọi người biết rồi cực kỳ ngốn disk, nên việc giải phóng dung lượng bằng cách xoá các container đã dừng và các image không được dùng đến là điều hợp lý.
import subprocess
print(" Removing stopped containers...")
subprocess.call("docker container prune -f", shell=True)
print(" Removing dangling images...")
subprocess.call("docker image prune -f", shell=True)
Note: Cần cẩn thận khi chạy lệnh này vì các tài nguyên bị xoá sẽ không thể khôi phục nhé.
8. Script tự động đăng nhập SSH
Tiện lợi hơn khi phải làm việc với nhiều server khác nhau.
import subprocess
hosts = {
"prod": "ubuntu@prod.example.com",
"dev": "ubuntu@dev.example.com",
}
target = input("Connect to [prod/dev]: ")
if target in hosts:
subprocess.call(f"ssh {hosts[target]}", shell=True)
Note: Thêm tham số -i
nếu cần dùng SSH key để đăng nhập.
9. Chuyển đổi file config YAML sang biến môi trường
Điều này sẽ hữu ích khi cần đưa cấu hình từ file YAML vào các môi trường CI/CD hoặc Docker.
import yaml
with open("config.yml") as f:
config = yaml.safe_load(f)
for k, v in config.items():
print(f"{k.upper()}={v}")
Note: Có thể dùng pipe >
để ghi trực tiếp kết quả ra file .env
.
10. Quét các thông tin nhạy cảm trong file .env
Một bước kiểm tra đơn giản để đảm bảo không vô tình commit các thông tin như API key, secret token lên Git (mọi người thêm vào các thông tin cần thiết khác nhé).
import re
with open(".env") as f:
for line in f:
if re.search("api|key|secret", line, re.I):
print(f" Possible secret: {line.strip()}")
Note: Để tự động hóa, tôi thường tích hợp script này vào pre-commit hook.
Theo kinh nghiệm của tôi, Python là một công cụ rất linh hoạt cho mọi người làm DevOps, cái này thì trong DevOps roadmap được đề xuất rất cụ thể rồi. Trên đây là một vài script đã giúp tôi tiết kiệm được không ít thời gian trong công việc hàng ngày.
Đơn giản được các vấn đề vẫn luôn là giải pháp tốt nhất (với tôi). Gõ 1 ký tự mà ra được hết thì ngon :)))