Vấn đề
Bạn đã sẵn sàng triển khai, nhưng ansible-galaxy lại khiến bạn dừng bước. Lỗi này thường xảy ra khi môi trường Python chạy Ansible không thể xác thực chứng chỉ SSL của máy chủ Galaxy. Bảo mật là ưu tiên hàng đầu, nhưng việc thiếu liên kết chứng chỉ trong chuỗi cục bộ (local chain) thường làm hỏng quá trình bắt tay (handshake).
Lỗi này thường hiển thị trong terminal của bạn như sau:
ERROR! Unknown error when attempting to call Galaxy: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)>
TL;DR: Cách xử lý nhanh "Cần sửa ngay lập tức"
Nếu bạn đang làm việc trong một sandbox cục bộ an toàn và cần bỏ qua bước kiểm tra ngay lập tức, hãy sử dụng cờ --ignore-certs. Đây là một giải pháp nhanh chóng, mặc dù không phải là giải pháp lâu dài cho các môi trường production.
ansible-galaxy collection install community.general --ignore-certs
Để áp dụng điều này cho toàn bộ phiên làm việc mà không cần nhập cờ mỗi lần, hãy export biến môi trường sau:
export ANSIBLE_GALAXY_IGNORE_CERTS=True
Tại sao điều này lại xảy ra?
Ansible dựa vào các thư viện urllib hoặc requests của Python để tải nội dung. Kể từ Python 3.6, các thư viện này đã trở nên khắt khe hơn nhiều trong việc xác thực chuỗi chứng chỉ. Bạn có thể đang gặp phải một trong ba trở ngại sau:
- Chứng chỉ hệ điều hành cũ kỹ: Gói
ca-certificatescục bộ của bạn đã không được cập nhật trong nhiều tháng và nó không nhận diện được CA mới hơn màgalaxy.ansible.comsử dụng. - Sự can thiệp của doanh nghiệp: Nhiều công ty sử dụng "Deep Packet Inspection" thông qua các proxy như Zscaler hoặc Blue Coat. Các dịch vụ này thay thế chứng chỉ Galaxy thật bằng chứng chỉ tự ký của doanh nghiệp mà máy tính của bạn chưa tin tưởng.
- Sự cô lập của macOS: Các phiên bản Python được cài đặt thông qua trình cài đặt
.pkgchính thức của macOS thường bỏ qua hoàn toàn Keychain của hệ thống.
Các bước khắc phục chi tiết
1. Làm mới kho chứng chỉ Linux
Các bản phân phối Linux cần được làm mới thường xuyên các tổ chức phát hành chứng chỉ gốc (root authorities) đáng tin cậy. Đây thường là điều đầu tiên bạn nên thử trên máy chủ hoặc instance WSL.
Ubuntu/Debian:
sudo apt-get update
sudo apt-get install --reinstall ca-certificates
sudo update-ca-certificates
CentOS/RHEL 8 & 9:
sudo dnf upgrade ca-certificates
sudo update-ca-trust
2. Script chứng chỉ Python trên macOS
Người dùng macOS thường xuyên gặp phải lỗi này vì Python không tự động liên kết với các chứng chỉ gốc của hệ thống. Hãy kiểm tra trong thư mục Applications của bạn. Python đi kèm với một script lệnh cụ thể để giải quyết chính xác vấn đề đau đầu này.
# Check your version first; this example uses 3.12
/Applications/Python\ 3.12/Install\ Certificates.command
Ngoài ra, bạn có thể buộc Python sử dụng gói certifi, vốn được cập nhật thường xuyên hơn hệ điều hành:
pip install --upgrade certifi
3. Thêm các gói CA của doanh nghiệp
Khi bạn đứng sau tường lửa của doanh nghiệp, bạn phải chỉ định chính xác cho Ansible nơi lưu trữ chứng chỉ gốc của công ty. Hãy yêu cầu đội IT cung cấp tệp company-root-ca.pem. Sau khi có tệp đó, hãy trỏ các biến môi trường của bạn đến đường dẫn đó.
export REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/corporate-proxy-ca.pem
export SSL_CERT_FILE=/etc/pki/tls/certs/corporate-proxy-ca.pem
ansible-galaxy collection install community.aws
4. Thiết lập khắc phục vĩnh viễn trong ansible.cfg
Bạn mệt mỏi với việc export các biến? Bạn có thể nhúng cấu hình trực tiếp vào dự án của mình. Mở tệp ansible.cfg và thêm phần sau:
[galaxy]
ignore_certs = True
Cảnh báo: Chỉ sử dụng ignore_certs = True nếu bạn đang ở trong một mạng nội bộ an toàn đã biết. Việc tắt xác thực trên Wi-Fi công cộng sẽ khiến bạn trở thành mục tiêu dễ dàng cho các cuộc tấn công Man-in-the-Middle (MITM).
Kiểm tra kết nối
Kiểm tra xem việc khắc phục có hiệu quả hay không bằng cách chạy lệnh cài đặt ở chế độ chi tiết (verbose). Cờ -vvv sẽ cho bạn thấy chính xác URL nào đang được gọi và kết nối có thể bị treo ở đâu.
ansible-galaxy collection install community.general -vvv
Bạn cũng có thể chạy lệnh Python một dòng này để kiểm tra kết nối thô. Nếu nó trả về 200, đường dẫn SSL của bạn đã chính thức thông suốt:
python3 -c "import urllib.request; print(urllib.request.urlopen('https://galaxy.ansible.com').getcode())"
Tóm tắt
Lỗi CERTIFICATE_VERIFY_FAILED là một tính năng bảo mật, không phải là lỗi phần mềm. Mặc dù --ignore-certs có tác dụng khắc phục nhanh trong 10 giây, nhưng cách tiếp cận chuyên nghiệp là cập nhật ca-certificates hoặc ánh xạ CA của doanh nghiệp bạn. Việc giữ cho kho chứng chỉ luôn mới đảm bảo quá trình tự động hóa của bạn vừa hoạt động tốt vừa an toàn.

