Giới thiệu
Quản lý cấu hình là một kỹ thuật quan trọng trong DevOps, giúp tự động hóa việc cấu hình và quản lý hệ thống. Ansible là một trong những công cụ phổ biến nhất hiện nay cho quản lý cấu hình. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Ansible để quản lý cấu hình trên AWS EC2 thông qua một hướng dẫn chi tiết.
Danh sách yêu cầu cần thiết
Trước khi bắt đầu, hãy đảm bảo bạn đã chuẩn bị đầy đủ các yêu cầu sau:
- Cài đặt AWS CLI trên máy tính của bạn (nếu sử dụng CLI).
- Một VPC/subnet để khởi động các instance (hoặc sử dụng mặc định).
- Tên keypair — bạn phải tải xuống khóa riêng chỉ một lần.
- Quyền truy cập để tạo EC2/Security Groups/IAM nếu cần.
1) Tạo (hoặc tái sử dụng) một cặp khóa SSH cho các instance
Qua Console:
- Truy cập EC2 → Key Pairs → Tạo cặp khóa → Đặt tên (ví dụ: day55-key) → Tải xuống .pem (giữ an toàn).
Qua CLI (ví dụ):
bash
aws ec2 create-key-pair --key-name day55-key --query 'KeyMaterial' --output text > day55-key.pem
chmod 400 day55-key.pem
Chú ý: Giữ file day55-key.pem an toàn. Bạn sẽ sử dụng nó để SSH vào master và để cho master SSH vào các node.
2) Khởi động các instance EC2 (1 master + 2 nodes)
Bạn có thể sử dụng wizard “Launch Instance” trên Console (đơn giản nhất) hoặc CLI. Quan trọng: khi khởi động cả ba instance, hãy chọn cùng một tên Key pair (day55-key) để một khóa riêng có thể hoạt động cho tất cả.
Các bước qua Console (được khuyến nghị):
- Khởi động Ubuntu AMI cho master (ví dụ: Ubuntu 22.04 LTS). Chọn loại instance t3.micro (hoặc theo nhu cầu). Dưới Key pair, chọn day55-key.
- Khởi động hai instance bổ sung (nodes) — chọn cùng một key pair day55-key.
- Mạng / Nhóm Bảo mật: tạo một nhóm bảo mật (gọi là ansible-sg) cho phép:
- SSH (cổng 22) từ IP của bạn (để bạn SSH vào master).
- SSH (cổng 22) từ master (chúng ta sẽ thắt chặt điều này ở bước tiếp theo).
- HTTP (cổng 80) tùy chọn để thử nghiệm máy chủ web.
- Chờ đến khi các instance đang chạy. Lưu ý IP công cộng của master và các IP riêng của hai node (nếu master & nodes cùng VPC bạn sẽ sử dụng IP riêng trong inventory).
Ví dụ CLI (nhanh chóng — bạn phải thiết lập subnet & ami):
bash
# tạo SG (ví dụ: cho phép SSH từ bất kỳ đâu trong quá trình thử nghiệm; tốt hơn là hạn chế)
aws ec2 create-security-group --group-name ansible-sg --description "ansible sg" --vpc-id <vpc-id>
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 22 --cidr <your-ip>/32
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 22 --cidr 0.0.0.0/0 # tạm thời - không khuyến nghị
# khởi động các instance (thay thế subnet-id, ami-id)
aws ec2 run-instances --image-id <ami-id> --count 3 --instance-type t3.micro --key-name day55-key --security-group-ids <sg-id> --subnet-id <subnet-id>
Chú ý: Sử dụng console nếu bạn không thoải mái khi điền subnet/AMI IDs. Cũng không để SSH mở cho 0.0.0.0/0 trong sản xuất.
3) Bảo mật mạng: cho phép SSH từ master đến nodes
Thực hành tốt nhất: tạo một nhóm bảo mật cho master và cho phép SSH vào nodes từ nhóm bảo mật của master.
Qua Console:
- Tạo ansible-master-sg cho master và ansible-nodes-sg cho nodes.
- Chỉnh sửa quy tắc inbound của ansible-nodes-sg: cho phép SSH (22) Nguồn = ansible-master-sg.
Ví dụ CLI (cho phép theo nhóm nguồn):
bash
aws ec2 authorize-security-group-ingress --group-id <nodes-sg-id> --protocol tcp --port 22 --source-group <master-sg-id>
4) Cài đặt Ansible trên master (ví dụ Ubuntu)
SSH vào master từ máy tính của bạn:
bash
ssh -i ./day55-key.pem ubuntu@<MASTER_PUBLIC_IP>
Trên master, chạy:
bash
# cập nhật & chuẩn bị
sudo apt update
sudo apt install -y software-properties-common
# thêm PPA Ansible và cài đặt
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt update
sudo apt install -y ansible
# kiểm tra nhanh
ansible --version
Chú ý: Nếu bạn muốn sử dụng Amazon Linux master, hãy sử dụng sudo amazon-linux-extras install ansible2 -y (hoặc cài đặt qua pip).
5) Sao chép khóa riêng sang master (một cách an toàn)
Bạn cần khóa riêng trên master để Ansible (chạy trên master) có thể SSH vào hai nodes.
Từ máy tính của bạn (an toàn, tạm thời):
bash
# sao chép khóa riêng vào master (bạn đang xác thực bằng cùng một khóa)
scp -i ./day55-key.pem ./day55-key.pem ubuntu@<MASTER_PUBLIC_IP>:/home/ubuntu/.ssh/node_key.pem
# trên master: bảo mật khóa
ssh -i ./day55-key.pem ubuntu@<MASTER_PUBLIC_IP> # đăng nhập nếu cần
sudo mv /home/ubuntu/.ssh/node_key.pem /home/ubuntu/.ssh/node_key.pem
sudo chown ubuntu:ubuntu /home/ubuntu/.ssh/node_key.pem
chmod 600 /home/ubuntu/.ssh/node_key.pem
Chú ý bảo mật: Việc sao chép các khóa riêng là nhạy cảm. Xóa tệp .pem khỏi master khi không còn cần thiết, hoặc tốt hơn là sử dụng AWS Systems Manager (SSM) hoặc một vault trong sản xuất thay vì sao chép các khóa.
6) Tạo inventory Ansible (hosts) trên master
Bạn có thể chỉnh sửa file toàn cục /etc/ansible/hosts hoặc duy trì một inventory dự án (được khuyến nghị). Ví dụ tạo /home/ubuntu/ansible/hosts:
bash
cat > /home/ubuntu/ansible/hosts <<EOF
[web]
10.0.1.12 ansible_user=ubuntu ansible_ssh_private_key_file=/home/ubuntu/.ssh/node_key.pem
10.0.1.13 ansible_user=ubuntu ansible_ssh_private_key_file=/home/ubuntu/.ssh/node_key.pem
[all:vars]
ansible_python_interpreter=/usr/bin/python3
EOF
Thay thế 10.0.1.12 / 10.0.1.13 bằng các IP riêng của nodes (được ưa chuộng khi master & nodes cùng chia sẻ VPC). Sử dụng IP công cộng chỉ khi cần thiết.
Xác thực inventory:
bash
ansible-inventory -i /home/ubuntu/ansible/hosts --list -y
7) Đảm bảo các nodes mục tiêu có Python (yêu cầu Ansible)
Hầu hết các AMIs hiện đại đều đã cài đặt Python. Nếu bạn thấy lỗi “failed to find interpreter for /bin/python”, hãy cài đặt Python trên nodes (thông qua user_data khi khởi động hoặc SSH):
bash
# từ máy tính của bạn hoặc master (nếu bạn có thể SSH)
ssh -i ./day55-key.pem ubuntu@<NODE_IP> 'sudo apt update && sudo apt install -y python3'
# hoặc cho Amazon Linux:
ssh -i ./day55-key.pem ec2-user@<NODE_IP> 'sudo yum install -y python3'
8) Chạy bài kiểm tra ping Ansible
Từ master:
bash
# tùy chọn A: sử dụng file inventory với khóa riêng đã cấu hình cho từng host
ansible -i /home/ubuntu/ansible/hosts web -m ping
# tùy chọn B: truyền user & key trên CLI (nếu bạn thích)
ansible all -i /home/ubuntu/ansible/hosts -u ubuntu --private-key=/home/ubuntu/.ssh/node_key.pem -m ping
Kết quả mong đợi:
bash
10.0.1.12 | SUCCESS => {"changed": false, "ping": "pong"}
10.0.1.13 | SUCCESS => {"changed": false, "ping": "pong"}
Khắc phục sự cố (các lỗi thường gặp)
- SSH permission denied:
- Đảm bảo khóa chính xác &
chmod 600. Kiểm tra instance sử dụng cùng một cặp khóa.
- Đảm bảo khóa chính xác &
- Connection timed out:
- Kiểm tra quy tắc inbound của nhóm bảo mật node (cho phép SSH từ IP riêng của master hoặc nhóm SG master). Kiểm tra bảng định tuyến/ACLs.
- python not found / failed to find interpreter:
- Cài đặt Python 3 trên nodes (xem Bước 7) hoặc thiết lập
ansible_python_interpreter=/usr/bin/python3trong inventory.
- Cài đặt Python 3 trên nodes (xem Bước 7) hoặc thiết lập
- Lỗi xác thực khóa máy chủ:
- Trên master:
ssh-keyscan -H >> ~/.ssh/known_hostshoặc xuấtANSIBLE_HOST_KEY_CHECKING=Falseđể thử nghiệm nhanh (không khuyến nghị cho sản xuất).
- Trên master:
Dọn dẹp & khuyến nghị bảo mật
- Đừng để các file .pem của bạn nằm quanh. Xóa hoặc xoay chúng sau khi thử nghiệm.
- Đối với sản xuất, ưu tiên AWS Systems Manager (SSM) hoặc một bastion + IAM roles thay vì sao chép các khóa riêng.
- Sử dụng Ansible Vault hoặc trình quản lý bí mật cho các thông tin xác thực nhạy cảm.
Kết luận
Quản lý cấu hình với Ansible trên AWS có thể giúp tự động hóa nhiều quy trình và tiết kiệm thời gian. Bài viết này đã hướng dẫn bạn qua các bước cơ bản để thiết lập Ansible. Hãy thử nghiệm và áp dụng vào dự án của bạn!
Câu hỏi thường gặp (FAQ)
1. Ansible có thể sử dụng với hệ điều hành nào?
Ansible hỗ trợ nhiều hệ điều hành, bao gồm Linux và Windows.
2. Có cần cài đặt Ansible trên tất cả các nodes không?
Không, Ansible chỉ cần được cài đặt trên master node.
3. Ansible có miễn phí không?
Có, Ansible là một phần mềm mã nguồn mở và miễn phí sử dụng.