Tôi có mối quan hệ yêu-ghét với bash. Tôi dành nhiều thời gian trong terminal, và bash là "ngôn ngữ lập trình" mặc định. Đôi khi tôi nói với người ta rằng find, grep và xargs chạy infrastructure của họ, họ cười cho đến khi nhận ra tôi nói thật.
Học Python là lựa chọn hoàn hảo cho system administrator. Cũng tuyệt vời cho bất kỳ ai phải làm việc terminal nhưng không muốn dùng bash, hoặc có nhu cầu quá phức tạp cho bash. Khi tác vụ vượt quá
find $(pwd) -name "*.txt" | xargs -I {} echo "do stuff with {}"
thì đã đến lúc dùng Python!
Có nhiều lợi ích dùng Python làm ngôn ngữ dòng lệnh chính:
- Python có nhiều thư viện hay giúp hầu như mọi thứ. Bao gồm thao tác hệ thống, đọc file, liệt kê thư mục, viết vòng lặp, kiểm tra exit code, v.v.
- Autocomplete với IDE. Thật sự. Ai muốn nhớ thuộc lòng?
- Bộ test mạnh mẽ nếu bạn thích (và nếu không, nên cân nhắc làm nó thành sở thích).
- Console iPython. Tuyệt vời. Kỳ diệu. TÔI YÊU NÓ.
- Python có sẵn trên hầu hết hệ thống, nếu không có cài qua Miniconda.
- Kiểm tra lỗi mạnh mẽ với try/except blocks.
- Nếu làm việc cross-platform, dùng thư viện Python lo việc đó dưới капô.
- Ngay cả khi không có kỹ năng lập trình, Python là ngôn ngữ dễ bắt đầu.
Hãy bắt đầu
Để bắt đầu, trước hết cần cài Python hoặc cài qua Miniconda.
Kiểm tra xem có iPython không
which python
which ipython
Nếu cả hai thành công, bạn sẵn sàng! Nếu có Python mà không có iPython, phải cài nó. Có thể cài như system package, nhưng tôi khuyên cài qua Miniconda.
Cài Miniconda
Tải installer cho OS tại đây. Đề xuất cài Python3.
Sau đó chỉ cài đặt đơn giản.
bash Miniconda3-latest-Linux-x86_64.sh
Làm theo prompt và bạn có Miniconda3. Sau khi cài xong chạy update, vì đây là tech và chắc chắn muốn update. ;-)
conda update conda
conda config --add channels conda-forge
conda update -y --all
conda install -y ipython
Xử lý sự cố
Nếu gặp sự cố cài package, đây là vài mẹo.
- Chạy
conda clean --allvà thử lại. - Đảm bảo dùng đúng channel.
- Chạy
conda update -y --all - Cố gắng cài ít nhất có thể vào global conda space. Thay vào đó tạo environment cho task và project khác nhau, chúng ta sẽ nói sau.
Tạo Environments với Conda
Nếu bạn từng dùng virtualenv, pipenv (có tồn tại không?), Rbenv, plenv, anyenv hay các env khác nổi lên qua các năm, điều này sẽ rất quen thuộc. Ý tưởng là project khác nhau nên có môi trường phần mềm riêng biệt.
conda create -n my-project ipython package1 package2 package2
Nếu bạn như tôi và muốn iPython sẵn sàng, hãy cài nó vào mọi environment mới!
Python Libraries cho System Administration
Trước khi vào ví dụ, liệt kê vài package hay kèm docs.
Package tôi dùng nhiều nhất là os. Dùng để liệt kê thư mục, kiểm tra file tồn tại, kiểm tra symlink tồn tại, tạo thư mục, chạy lệnh hệ thống, get/set biến môi trường, và hơn thế. Rất hay!
Package thứ hai chạy lệnh hệ thống không có sẵn như thư viện Python tiện lợi là module subprocess.
Thư viện shutil có thao tác file không có trong os.
Thư viện pprint in cấu trúc dữ liệu phức tạp với indentation đẹp.
Thư viện pytest cho test code Python, vì không gì chạy đúng lần đầu (vài lần đầu).
Làm sao Execute Code?
Cuối cùng! Code!
Khi dùng Python cho system administration, bạn có thể nhảy thẳng vào iPython console, hoặc viết script và chạy với python name-of-script.py.
Nếu thích viết script, bạn có nhiều lựa chọn, và thực sự tùy sở thích. Tôi dùng PyCharm (trả phí), nhưng Visual Studio Code và Atom cũng tuyệt vời miễn phí.
Tôi thấy tùy vào việc đang làm gì. Đôi khi chỉ mở iPython console bắt đầu gõ, đôi khi cần thứ robust hơn với test và những thứ khác.
Nếu dùng iPython console hoặc các editor liệt kê trên, bạn sẽ có autocomplete. Autocomplete tuyệt vời! Với iPython chỉ việc gõ tên function và nhấn tab để lấy danh sách function tiềm năng.
Nhận giúp đỡ
Bạn có thể vào trang doc của bất kỳ thư viện nào, nhưng nếu biết tên thư viện hoặc function, có thể gọi trong iPython.
Bạn cũng có thể mở menu help trong hầu hết IDE và text editor, nhưng sẽ cụ thể cho editor của bạn.
Ví dụ
Trước hết import package
import os
import subprocess
import shutil
from pprint import pprint
Dưới đây là ví dụ thao tác file và thư mục phổ biến.
# Lấy current working directory
# Trả về string
my_cwd = os.getcwd()
print(my_cwd)
# Liệt kê nội dung thư mục
# Trả về list
dir_list = os.listdir()
for item in dir_list:
print(item)
# Lấy Absolute Path của file (file + current working dir)
os.path.abspath('some-file')
# Lấy basename - trả về file
os.path.basename('/path/to/file')
# Tách đường dẫn thư mục - platform independent
os.path.split(os.getcwd())
# Out[17]: ('/Users', 'jillian')
# Kiểm tra path có tồn tại
os.path.exists('/path/on/filesystem')
# Kiểm tra path có phải symlink
os.path.islink()
Di chuyển file và thư mục
# Copy thư mục
# cp -rf
shutil.copytree('src', 'dest')
# Copy file
# cp -rf
shutil.copyfile('file1', 'file2')
# Di chuyển thư mục
# mv
shutil.move('src', 'dest')
Không mọi thứ đều có sẵn qua thư viện Python, như cài system library, nên chạy vài lệnh hệ thống!
# Chạy system command tùy ý
command = "echo 'hello'"
result = subprocess.run(command.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# In stdout và stderr
print(result.stdout)
print(result.stderr)
Ghi file!
# Ghi file (và tạo nếu chưa tồn tại)
# echo "hello" > hello.txt
f = open("hello.txt", "w+")
f.write("hello!")
f.close()
# Append vào file
# echo "hello" >> hello.txt
f = open("hello.txt", "a+")
f.write("hello again!")
f.close()
Viết một vài test!
Test chủ yếu dùng function assert, về cơ bản nói "đảm bảo điều này true, nếu không thì die loudly".
def test_system_command():
"""Test the exit code of a system command"""
command = "echo 'hello'"
result = subprocess.run(command.split(' '), stdout=subprocess.PIPE)
assert result.returncode == 0
Đặt function này trong file test_my_code.py và chạy pytest test_my_code.py.
Tổng kết
Đó là các mẹo chính của tôi dùng Python thay bash. Lần sau cần viết vòng lặp trong bash, hãy cân nhắc mở iPython console xem có gì thay thế!