Ansible là một công cụ tự động hóa mã nguồn mở mạnh mẽ, giúp bạn quản lý và cấu hình nhiều máy chủ một cách dễ dàng. Để Ansible thực hiện nhiệm vụ của mình, nó cần giao tiếp với các máy chủ đích thông qua SSH (Secure Shell). Bài viết này sẽ hướng dẫn chi tiết cách Chạy Lệnh Ansible Qua Ssh, từ thiết lập ban đầu đến các phương pháp tối ưu, giúp bạn làm chủ quy trình tự động hóa này.
SSH và Ansible: Mối Quan Hệ “Cơm Gạo”
SSH là một giao thức mạng mã hóa, cho phép bạn truy cập và điều khiển một máy chủ từ xa một cách an toàn. Ansible sử dụng SSH để kết nối đến các máy chủ đích và thực thi các module (tập hợp các tác vụ) để thực hiện cấu hình, triển khai ứng dụng, hoặc bất kỳ tác vụ quản lý hệ thống nào. Hiểu rõ cách thức hoạt động của SSH và cách Ansible tận dụng nó là chìa khóa để làm chủ tự động hóa.
Tại Sao Cần SSH Để Chạy Ansible?
Không có SSH, Ansible không thể “nói chuyện” với các máy chủ mà nó cần quản lý. SSH cung cấp một kênh an toàn để truyền lệnh và dữ liệu, đảm bảo rằng các thông tin nhạy cảm như mật khẩu và cấu hình không bị lộ ra ngoài.
SSH Keys: Chìa Khóa Vạn Năng
Thay vì sử dụng mật khẩu, SSH Keys cho phép xác thực dựa trên khóa công khai và khóa riêng tư. Đây là một phương pháp an toàn hơn nhiều, vì nó loại bỏ sự cần thiết phải lưu trữ và truyền mật khẩu.
Thiết Lập SSH Để Chạy Lệnh Ansible
Trước khi bạn có thể chạy lệnh Ansible qua SSH, bạn cần đảm bảo rằng SSH đã được thiết lập đúng cách. Dưới đây là các bước bạn cần thực hiện:
Bước 1: Tạo SSH Key Pair
Trên máy chủ điều khiển Ansible (máy tính của bạn), hãy mở terminal và chạy lệnh sau:
ssh-keygen -t rsa
Lệnh này sẽ tạo ra một cặp khóa RSA: một khóa riêng tư (thường được lưu trữ trong ~/.ssh/id_rsa
) và một khóa công khai (thường được lưu trữ trong ~/.ssh/id_rsa.pub
). Bạn có thể nhấn Enter để chấp nhận các giá trị mặc định cho tên tệp và passphrase (mật khẩu bảo vệ khóa riêng tư – tùy chọn). Nếu bạn chọn đặt passphrase, bạn sẽ cần nhập nó mỗi khi sử dụng khóa riêng tư.
“Việc sử dụng SSH Keys thay vì mật khẩu giúp giảm thiểu rủi ro bị tấn công brute-force và tăng cường bảo mật cho hệ thống của bạn,” chuyên gia bảo mật Nguyễn Hoàng Nam chia sẻ.
Bước 2: Sao Chép Khóa Công Khai Lên Máy Chủ Đích
Có nhiều cách để sao chép khóa công khai lên máy chủ đích. Một cách đơn giản là sử dụng lệnh ssh-copy-id
:
ssh-copy-id user@remote_host
Trong đó:
user
là tên người dùng trên máy chủ đích.remote_host
là địa chỉ IP hoặc tên miền của máy chủ đích.
Lệnh này sẽ yêu cầu bạn nhập mật khẩu của người dùng trên máy chủ đích một lần. Sau khi nhập mật khẩu, khóa công khai của bạn sẽ được thêm vào tệp ~/.ssh/authorized_keys
trên máy chủ đích.
Một cách khác là sao chép nội dung của tệp ~/.ssh/id_rsa.pub
và thêm nó vào tệp ~/.ssh/authorized_keys
trên máy chủ đích một cách thủ công.
Bước 3: Kiểm Tra Kết Nối SSH
Sau khi đã sao chép khóa công khai, hãy thử kết nối đến máy chủ đích bằng SSH mà không cần mật khẩu:
ssh user@remote_host
Nếu bạn có thể kết nối thành công mà không cần nhập mật khẩu, điều đó có nghĩa là bạn đã thiết lập SSH Keys thành công.
Bước 4: Cấu Hình Ansible Inventory
Ansible sử dụng một tệp gọi là “inventory” để xác định danh sách các máy chủ mà nó sẽ quản lý. Tệp inventory thường nằm ở /etc/ansible/hosts
hoặc bạn có thể chỉ định một tệp inventory khác bằng cách sử dụng tùy chọn -i
khi chạy lệnh Ansible.
Mở tệp inventory và thêm thông tin về máy chủ đích của bạn:
[webservers]
server1 ansible_host=192.168.1.10 user=deploy
server2 ansible_host=192.168.1.11 user=admin
[databases]
db1 ansible_host=192.168.1.20 user=root
Trong đó:
[webservers]
và[databases]
là các nhóm máy chủ.server1
,server2
, vàdb1
là tên của các máy chủ.ansible_host
chỉ định địa chỉ IP hoặc tên miền của máy chủ.user
chỉ định tên người dùng để kết nối SSH.
Nếu bạn sử dụng một tên người dùng khác với tên người dùng hiện tại của bạn trên máy chủ điều khiển Ansible, bạn cần chỉ định tên người dùng bằng cách sử dụng tham số user
như trên.
Chạy Lệnh Ad-Hoc Qua SSH Với Ansible
Ansible cho phép bạn chạy các lệnh ad-hoc (lệnh tạm thời) trên các máy chủ đích thông qua SSH. Đây là một cách nhanh chóng và dễ dàng để thực hiện các tác vụ đơn giản mà không cần phải viết một playbook.
Sử Dụng Module command
Module command
là module phổ biến nhất để chạy các lệnh ad-hoc. Để chạy một lệnh trên tất cả các máy chủ trong inventory, bạn có thể sử dụng lệnh sau:
ansible all -m command -a "uptime"
Trong đó:
all
chỉ định rằng lệnh sẽ được chạy trên tất cả các máy chủ trong inventory. Bạn có thể thay thếall
bằng tên của một nhóm máy chủ cụ thể (ví dụ:webservers
) hoặc tên của một máy chủ đơn lẻ (ví dụ:server1
).-m command
chỉ định rằng modulecommand
sẽ được sử dụng.-a "uptime"
chỉ định lệnhuptime
sẽ được chạy.
Sử Dụng Module shell
Module shell
tương tự như module command
, nhưng nó cho phép bạn chạy các lệnh shell phức tạp hơn, bao gồm cả các lệnh sử dụng pipes và redirections.
ansible all -m shell -a "df -h | grep '/$'"
Lệnh này sẽ hiển thị dung lượng ổ đĩa đã sử dụng trên tất cả các máy chủ.
Sử Dụng Tham Số -k
(Không Khuyến Khích)
Nếu bạn chưa thiết lập SSH Keys, bạn có thể sử dụng tham số -k
để yêu cầu Ansible nhập mật khẩu SSH:
ansible all -m command -a "uptime" -k
Tuy nhiên, việc sử dụng mật khẩu SSH không được khuyến khích vì nó kém an toàn hơn so với việc sử dụng SSH Keys. Hơn nữa, việc nhập mật khẩu mỗi khi chạy lệnh Ansible có thể gây phiền toái.
“Việc sử dụng tham số
-k
chỉ nên được sử dụng trong các tình huống khẩn cấp hoặc khi không thể thiết lập SSH Keys,” kỹ sư DevOps Lê Thị Thảo nhấn mạnh.
Chạy Playbook Ansible Qua SSH
Playbook là một tệp YAML chứa danh sách các tác vụ mà Ansible sẽ thực hiện trên các máy chủ đích. Playbook cho phép bạn tự động hóa các quy trình phức tạp và đảm bảo tính nhất quán trong cấu hình hệ thống của bạn.
Tạo Playbook
Ví dụ, hãy tạo một playbook có tên webserver.yml
để cài đặt Apache trên các máy chủ web:
---
- hosts: webservers
become: true
tasks:
- name: Cài đặt Apache
apt:
name: apache2
state: present
- name: Bật Apache
service:
name: apache2
state: started
enabled: true
Trong đó:
hosts: webservers
chỉ định rằng playbook sẽ được chạy trên các máy chủ trong nhómwebservers
.become: true
cho phép Ansible thực hiện các tác vụ với quyền root (sử dụngsudo
).tasks
là danh sách các tác vụ mà Ansible sẽ thực hiện.apt
là module để quản lý các gói phần mềm trên hệ thống Debian/Ubuntu.service
là module để quản lý các dịch vụ hệ thống.
Chạy Playbook
Để chạy playbook, sử dụng lệnh sau:
ansible-playbook webserver.yml
Ansible sẽ kết nối đến các máy chủ đích thông qua SSH và thực hiện các tác vụ được chỉ định trong playbook.
Giải Thích Các Thông Số Quan Trọng
hosts
: Xác định các máy chủ hoặc nhóm máy chủ mà playbook sẽ tác động.become: true
: Cho phép thực thi các tác vụ với quyền quản trị (tương đương sudo).tasks
: Danh sách các công việc cần thực hiện.- Các module như
apt
,service
,copy
,template
,…: Các công cụ để thực hiện các tác vụ cụ thể như cài đặt phần mềm, quản lý dịch vụ, sao chép tệp tin, tạo cấu hình,…
Tối Ưu Hóa Hiệu Năng Khi Chạy Lệnh Ansible Qua SSH
Để đảm bảo rằng Ansible chạy nhanh và hiệu quả, bạn có thể thực hiện một số tối ưu hóa sau:
Sử Dụng SSH Pipelining
SSH pipelining cho phép Ansible gửi nhiều lệnh qua SSH cùng một lúc, thay vì phải thiết lập một kết nối SSH mới cho mỗi lệnh. Điều này có thể cải thiện đáng kể hiệu năng, đặc biệt là khi chạy các playbook lớn.
Để bật SSH pipelining, hãy thêm dòng sau vào tệp cấu hình Ansible (ansible.cfg
):
[ssh_connection]
pipelining = True
Sử Dụng ControlPersist
ControlPersist
là một tính năng của SSH cho phép duy trì một kết nối SSH mở trong một khoảng thời gian nhất định. Điều này có thể giảm thiểu thời gian thiết lập kết nối SSH cho mỗi tác vụ.
Để bật ControlPersist
, hãy thêm các dòng sau vào tệp cấu hình SSH của bạn (~/.ssh/config
):
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h:%p
ControlPersist 600
Điều này sẽ giữ kết nối SSH mở trong 10 phút (600 giây).
Sử Dụng Module async
Nếu một tác vụ mất nhiều thời gian để hoàn thành, bạn có thể sử dụng module async
để chạy tác vụ đó một cách không đồng bộ. Điều này cho phép Ansible tiếp tục thực hiện các tác vụ khác trong khi tác vụ không đồng bộ đang chạy.
- name: Chạy một tác vụ không đồng bộ
command: sleep 60
async: 300
poll: 10
Trong đó:
async: 300
chỉ định rằng tác vụ sẽ được chạy không đồng bộ trong tối đa 300 giây.poll: 10
chỉ định rằng Ansible sẽ kiểm tra trạng thái của tác vụ mỗi 10 giây.
Hạn Chế Số Lượng Máy Chủ Đồng Thời
Theo mặc định, Ansible sẽ chạy các tác vụ trên tất cả các máy chủ trong inventory đồng thời. Nếu bạn có một số lượng lớn máy chủ, điều này có thể gây ra tình trạng quá tải trên máy chủ điều khiển Ansible hoặc trên các máy chủ đích.
Bạn có thể giới hạn số lượng máy chủ đồng thời bằng cách sử dụng tham số -f
khi chạy lệnh ansible-playbook
:
ansible-playbook -f 10 webserver.yml
Lệnh này sẽ chạy playbook trên tối đa 10 máy chủ đồng thời.
Các Lỗi Thường Gặp Khi Chạy Lệnh Ansible Qua SSH và Cách Khắc Phục
Ngay cả khi bạn đã làm theo tất cả các bước trên một cách cẩn thận, bạn vẫn có thể gặp phải một số lỗi khi chạy lệnh Ansible qua SSH. Dưới đây là một số lỗi thường gặp và cách khắc phục:
Lỗi “Permission denied (publickey)”
Lỗi này thường xảy ra khi bạn chưa thiết lập SSH Keys đúng cách hoặc khi khóa công khai của bạn chưa được thêm vào tệp ~/.ssh/authorized_keys
trên máy chủ đích.
Để khắc phục lỗi này, hãy kiểm tra lại các bước thiết lập SSH Keys và đảm bảo rằng khóa công khai của bạn đã được sao chép lên máy chủ đích.
Lỗi “Host key verification failed”
Lỗi này xảy ra khi Ansible không thể xác minh khóa SSH của máy chủ đích. Điều này có thể xảy ra nếu máy chủ đích đã thay đổi khóa SSH của nó hoặc nếu bạn đang cố gắng kết nối đến một máy chủ mới mà bạn chưa từng kết nối trước đây.
Để khắc phục lỗi này, bạn có thể xóa khóa SSH cũ của máy chủ đích khỏi tệp ~/.ssh/known_hosts
trên máy chủ điều khiển Ansible hoặc thêm tùy chọn -o StrictHostKeyChecking=no
vào lệnh Ansible của bạn. Tuy nhiên, việc tắt kiểm tra khóa SSH có thể làm giảm tính bảo mật, vì vậy bạn chỉ nên sử dụng tùy chọn này khi bạn chắc chắn rằng bạn đang kết nối đến đúng máy chủ.
Lỗi “Connection refused”
Lỗi này xảy ra khi Ansible không thể kết nối đến máy chủ đích. Điều này có thể xảy ra nếu máy chủ đích không hoạt động, nếu tường lửa đang chặn kết nối SSH, hoặc nếu dịch vụ SSH không chạy trên cổng mặc định (22).
Để khắc phục lỗi này, hãy kiểm tra xem máy chủ đích có hoạt động không, kiểm tra cấu hình tường lửa và đảm bảo rằng dịch vụ SSH đang chạy trên cổng mặc định.
Lỗi “Timeout”
Lỗi này xảy ra khi Ansible không nhận được phản hồi từ máy chủ đích trong một khoảng thời gian nhất định. Điều này có thể xảy ra nếu kết nối mạng chậm hoặc nếu máy chủ đích đang bị quá tải.
Để khắc phục lỗi này, bạn có thể tăng thời gian chờ (timeout) bằng cách thêm dòng sau vào tệp cấu hình Ansible (ansible.cfg
):
[defaults]
timeout = 60
Điều này sẽ tăng thời gian chờ lên 60 giây.
Bảo Mật Khi Chạy Lệnh Ansible Qua SSH
Mặc dù SSH cung cấp một kênh an toàn để truyền lệnh và dữ liệu, bạn vẫn cần thực hiện một số biện pháp bảo mật bổ sung để bảo vệ hệ thống của bạn:
Sử Dụng SSH Keys Thay Vì Mật Khẩu
Như đã đề cập trước đó, việc sử dụng SSH Keys thay vì mật khẩu là một phương pháp an toàn hơn nhiều.
Vô Hiệu Hóa Đăng Nhập Bằng Mật Khẩu
Để tăng cường bảo mật, bạn nên vô hiệu hóa hoàn toàn đăng nhập bằng mật khẩu trên các máy chủ đích. Để làm điều này, hãy mở tệp cấu hình SSH (/etc/ssh/sshd_config
) và thay đổi dòng sau:
PasswordAuthentication no
Sau đó, khởi động lại dịch vụ SSH.
Sử Dụng Tường Lửa
Tường lửa giúp bảo vệ hệ thống của bạn khỏi các cuộc tấn công từ bên ngoài. Đảm bảo rằng tường lửa của bạn chỉ cho phép kết nối SSH từ các địa chỉ IP đáng tin cậy.
Sử Dụng Tài Khoản Người Dùng Hạn Chế
Không nên sử dụng tài khoản root để chạy các lệnh Ansible. Thay vào đó, hãy tạo một tài khoản người dùng hạn chế và cấp quyền sudo cho tài khoản đó.
Cập Nhật Phần Mềm Thường Xuyên
Đảm bảo rằng tất cả phần mềm trên hệ thống của bạn (bao gồm cả Ansible, SSH, và hệ điều hành) được cập nhật thường xuyên để vá các lỗ hổng bảo mật.
FAQ (Câu Hỏi Thường Gặp)
-
Ansible có thể chạy mà không cần SSH không?
Không, Ansible cần SSH hoặc một giao thức tương tự (như WinRM cho Windows) để giao tiếp và thực thi các tác vụ trên các máy chủ đích. cách hoạt động của ansible giải thích chi tiết hơn về cách Ansible tương tác với các máy chủ.
-
Làm thế nào để chạy lệnh Ansible qua SSH trên nhiều máy chủ cùng lúc?
Bạn có thể sử dụng file inventory của Ansible để liệt kê các máy chủ và sau đó chạy lệnh hoặc playbook trên toàn bộ hoặc một nhóm các máy chủ. ansible cấu hình nhiều server cùng lúc hướng dẫn chi tiết cách cấu hình và quản lý nhiều server bằng Ansible.
-
Làm thế nào để khắc phục lỗi “Host key verification failed”?
Bạn có thể xóa entry liên quan đến máy chủ đó trong file
~/.ssh/known_hosts
hoặc tạm thời tắt kiểm tra host key bằng tùy chọn-o StrictHostKeyChecking=no
, nhưng không khuyến khích vì lý do bảo mật. -
Tôi có thể sử dụng Ansible để backup database qua SSH không?
Có, bạn hoàn toàn có thể sử dụng Ansible để tự động hóa quá trình backup database qua SSH. backup database bằng ansible cung cấp một ví dụ cụ thể về cách thực hiện việc này.
-
Làm thế nào để cài đặt Ansible trên CentOS?
Bạn có thể cài đặt Ansible trên CentOS bằng cách sử dụng trình quản lý gói
yum
. cài ansible trên centos hướng dẫn từng bước quy trình cài đặt. -
Ansible playbook là gì và làm thế nào để chạy nó?
Ansible playbook là một file YAML chứa các hướng dẫn để Ansible thực hiện một loạt các tác vụ. Bạn có thể chạy playbook bằng lệnh
ansible-playbook <tên_file.yml>
. ansible playbook là gì giải thích chi tiết về cấu trúc và cách sử dụng playbook. -
Tôi nên làm gì nếu gặp lỗi “Permission denied (publickey)”?
Lỗi này thường do cấu hình SSH Key chưa đúng. Hãy kiểm tra lại các bước tạo và sao chép SSH Key, đảm bảo key công khai đã được thêm vào file
~/.ssh/authorized_keys
trên server đích và quyền truy cập file đúng.
Kết Luận
Chạy lệnh Ansible qua SSH là một kỹ năng quan trọng đối với bất kỳ ai muốn tự động hóa việc quản lý và cấu hình hệ thống. Bằng cách làm theo các hướng dẫn trong bài viết này, bạn có thể thiết lập SSH Keys, chạy các lệnh ad-hoc và playbook, tối ưu hóa hiệu năng và bảo mật hệ thống của bạn. Hy vọng bài viết này sẽ giúp bạn làm chủ Ansible và tận dụng tối đa sức mạnh của nó. Tiếp tục khám phá và thử nghiệm với Ansible để trở thành một chuyên gia tự động hóa thực thụ!