Thao tác trên remote server, những phương pháp cơ bản
ssh
11
ansible
2
Fabric
4
White

Quăng viết ngày 25/03/2016

Mình có đọc bài viết này http://kipalog.com/posts/Cai-dat-va-lam-quen-voi-Ansible và muốn chia sẻ thêm một số cách cũng như cách tiếp cận một vấn đề từ những thứ cơ bản.

Xin lưu ý bài viết này không nhằm mục đích phản bác bài viết kia mà chỉ BỔ SUNG một số cách KHÁC nhưng CƠ BẢN hơn để khi đứng trước một vấn đề có nhiều sự lựa chọn và biết đâu là sự lựa chọn tốt cho từng bài toán cụ thể. Mình sẽ giải thích thêm về vấn đề này ở cuối bài viết.

Đầu tiên xin nói về bài toán mà ta muốn thực hiện. Mình nói đơn giản nhất là thực thi một câu lệnh trên remote server mà không cần login vào server. Cụ thể ở đây là chạy lệnh service mysql status. Vậy chúng ta có những cách nào để giải quyết vấn đề này

  • Dùng bash shell, chạy cmd thông qua ssh
  • Dùng fabric?
  • Dùng Ansible (như bài viết trên)

1. Chạy một lệnh thông qua ssh

Ở đây ta không cần bất cứ công cụ gì, dùng đơn giản những gì đã có:

ssh -i .ssh/id_rsa root@10.20.30.40 'service mysql status' 
SUCCESS! MySQL running (1010)

Vậy nếu cần chạy lệnh đó trên nhiều host thì làm như thế nào. Cách đơn giản là bỏ danh sách các IP của host vào một mảng và dùng vòng lặp để chạy lệnh như trên

Cách này có ưu điểm là bạn KHÔNG cần thêm công cụ gì mà vẫn đạt được mục đích, nhưng điểm dở là nếu có nhiều host thì việc thực hiện câu lệnh là tuần tự.

2. Dùng Fabric

Fabric là một bộ thư viện và một command-line tool giúp giao tiếp và thực hiện các tác vụ trên remote server một cách dễ dàng.

Ví dụ với yêu cầu trên thì để thực hiện ta cần định nghĩa một hàm trong fabfile như sau

~$ cat > fabfile.py <<EOF
#!/usr/bin/python2.7

from fabric.api import *
from fabric.colors import *

env.colors = True
env.debug = True

"""
Base configuration
"""

env.user = 'root'
env.password = ''

@task
def dbnode():
  env.hosts = ['10.20.30.40']

"""
Task configuration
"""

@task
@parallel
def check_stt():
  run('service mysql status')
EOF

Và thực hiện hàm check status của cụm node db

~$ fab dbnode check_stt
[10.20.30.40] Executing task 'check_stt'
[10.20.30.40] run: service mysql status
[10.20.30.40] out:  SUCCESS! MySQL running (1001)
[10.20.30.40] out:

Done.
Disconnecting from 10.20.30.40... done.

Kết quả là như nhau so với cách 1, vì bản chất cũng là thực hiện một lệnh thông qua SSH. Nhưng nó có vài điểm lợi

  • Có thể khai báo nhiều môi trường, role của server, ví dụ ở trên mình khai báo một IP thuộc dbnode, bạn có thể khai báo thêm nếu muốn
  • Các tác vụ cần thực hiện được viết như một hàm trong python, "trông" có vẻ sáng sủa dễ nhìn :D
  • Bạn thấy trước check_stt mình có @parallel hỗ trợ việc thực hiện song song các câu lệnh trên nhiều host

Về nhược điểm thì cá nhân mình thấy khi fabfile lớn dần với nhiều tác vụ thì nhìn kinh khủng lắm :D

Và cuối cùng là cách 3, dùng Ansible

3. Kết luận

Hi vọng mọi người đọc được đến đây. Vậy mục đích của bài viết này là gì? Thực chất như ở đầu bài

  • Tiếp cận một vấn đề từ những các cơ bản nhất, kiểu như cố gắng hiểu bản chất của cái mình đang dùng
  • Đưa ra nhiều sự lựa chọn, cuối cùng bản thân bạn sẽ biết cách nào tốt cho trường hợp nào và cách nào dở cho trường hợp nào

Chỉ vậy thôi, Happy weekend :D

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Quăng

22 bài viết.
173 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
120 13
Gần đây mình có present về chủ đề __Một số thao tác và lệnh đơn giản nhưng hữu ích khi sử dụng Linux__ cho một vài bạn bè. Mặc dù nó khá là đơn giả...
Quăng viết hơn 1 năm trước
120 13
White
74 12
1. Giới thiệu Right tool for right job. Trước tiên phải hiểu là MySQL Replication không phải là giải pháp giải quyết mọi bài toán về quá tải hệ th...
Quăng viết hơn 2 năm trước
74 12
White
51 7
Với những ai làm Linux System Admin hoặc DevOps thì việc quản lí vài chục, vài trăm server là chuyện bình thường. Việc nhớ các địa chỉ IP, port để ...
Quăng viết gần 3 năm trước
51 7
Bài viết liên quan
White
7 0
Trước đây mình có giới thiệu một cách tiện lợi để nhớ khi SSH vào server tại (Link), hôm nay ngồi mò thấy một mẹo nhỏ nữa cũng khá hay nên chia sẻ ...
Quăng viết gần 2 năm trước
7 0
White
0 0
Copy file from local to another server via SSH bash scp i ssl_file.pem file_copy username@ip.address:path_to_paste_file VietNguyen 07102016
Vie viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
22 bài viết.
173 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!