TL;DR: Cách khắc phục nhanh
Nếu bạn cần tiếp tục công việc ngay lập tức và hiểu rõ các rủi ro bảo mật (thường gặp trong các môi trường lab hoặc dev nội bộ), hãy chạy lệnh này để xóa host key cũ:
ssh-keygen -R <ip_hoặc_hostname_máy_chủ_của_bạn>
Ngoài ra, bạn có thể yêu cầu Ansible dừng kiểm tra key trên toàn hệ thống bằng cách thêm nội dung này vào file ansible.cfg:
[defaults]
host_key_checking = False
Hiểu về cảnh báo này
Bạn chạy một playbook và mọi thứ dừng lại. Một đoạn văn bản màu đỏ cảnh báo rằng nhận dạng host từ xa đã thay đổi. Đây không phải là lỗi của Ansible; đó là một cơ chế bảo mật cơ bản của SSH.
SSH sử dụng một "fingerprint" (dấu vân tay) để xác minh danh tính máy chủ. Trong lần kết nối đầu tiên, fingerprint này sẽ được lưu vào ~/.ssh/known_hosts. Nếu sau đó bạn cài lại hệ điều hành, hoặc nếu nhà cung cấp đám mây cấp một IP cũ cho một instance mới, fingerprint sẽ thay đổi. SSH phát hiện sự sai lệch này và ngắt kết nối để ngăn chặn tấn công Man-In-The-Middle (MITM).
Giải pháp 1: Xóa Key cũ (An toàn nhất)
Đây là phương pháp can thiệp chính xác. Thay vì hạ thấp lá chắn bảo mật, bạn chỉ cần yêu cầu máy tính của mình quên đi fingerprint đã cũ của một IP hoặc hostname cụ thể.
# Thay thế 192.168.1.100 bằng IP máy chủ mục tiêu của bạn
ssh-keygen -R 192.168.1.100
Lần tới khi bạn chạy Ansible, nó sẽ coi máy chủ đó là một kết nối mới. Bạn có thể cần truy cập SSH thủ công một lần để nhập "yes" và chấp nhận key mới, hoặc sử dụng các phương pháp tự động hóa bên dưới.
Giải pháp 2: Bỏ qua kiểm tra để mở rộng linh hoạt
Việc xóa key thủ công là ổn đối với một hoặc hai máy chủ. Tuy nhiên, nếu bạn đang khởi tạo 50 instance AWS EC2 tạm thời mỗi ngày, nó sẽ trở thành một nút thắt cổ chai không thể vượt qua. Bạn có thể tự động hóa việc bỏ qua này.
Tùy chọn A: Cấu hình cấp dự án (Khuyến nghị)
Tạo một file ansible.cfg trong thư mục gốc của dự án. Điều này đảm bảo cài đặt chỉ áp dụng cho dự án của bạn và không ảnh hưởng đến toàn bộ hệ thống.
[defaults]
host_key_checking = False
Tùy chọn B: Sử dụng biến môi trường
Bạn cần sửa lỗi tạm thời mà không muốn chỉnh sửa file? Hãy thiết lập biến trực tiếp trong phiên làm việc của terminal:
export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook deploy.yml
Tùy chọn C: Tùy chỉnh sâu SSH
Để kiểm soát tốt hơn, hãy truyền các tham số trực tiếp cho tiến trình SSH bên dưới. Cấu hình này ngăn Ansible ghi bất kỳ thứ gì vào file known_hosts của bạn:
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
Giải pháp 3: Playbook tự khắc phục
Bạn có thể xử lý các key một cách linh hoạt ngay trong logic tự động hóa của mình. Sử dụng module known_hosts để lấy và ủy quyền cho key mới trước khi thực hiện các tác vụ còn lại.
- name: Tự động chấp nhận SSH fingerprint mới
hosts: localhost
tasks:
- name: Quét và cập nhật known_hosts
known_hosts:
name: "{{ target_ip }}"
key: "{{ lookup('pipe', 'ssh-keyscan -t rsa ' + target_ip) }}"
state: present
Xác minh kết quả
Kiểm tra kết nối của bạn bằng module ping. Nếu thành công, bạn sẽ nhận được thông báo "pong" màu xanh sáng mà không yêu cầu xác nhận thủ công.
ansible all -m ping -i inventory.ini
Nếu vẫn thất bại, hãy kiểm tra các mục bị trùng lặp. Đôi khi, known_hosts chứa các mục cho cả hostname và địa chỉ IP riêng biệt; bạn sẽ cần chạy ssh-keygen -R cho cả hai.
Các lưu ý bảo mật cuối cùng
- Ngữ cảnh rất quan trọng: Việc tắt kiểm tra host key là quy trình tiêu chuẩn cho các pipeline CI/CD và VPC nội bộ. Nó giúp tiết kiệm hàng giờ xử lý sự cố.
- Rủi ro công cộng: Tránh tắt tính năng này đối với các máy chủ production được truy cập qua internet công cộng. Nếu không có xác minh key, bạn không có cách nào đảm bảo dữ liệu của mình không bị chặn bởi một gateway độc hại.
- Tham khảo Tài liệu chính thức của Ansible để biết thêm về các tùy chỉnh bảo mật nâng cao.

