Danh sách bài viết trong series Sử dụng Ansible tự động hệ thống
- Bài 1: Ansible Là Gì Mà Dân DevOps Mê Thế?
- Bài 2: Ansible Inventory – Danh Bạ Server Của Bạn
- Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
- Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML
- Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
- Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
- Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
- Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
- Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
- Bài 10: Ansible Error Handling – Không Panic Khi Fail
- Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS
- Bài 12: Ansible Dynamic Inventory – Danh Sách Server Tự Động
- Bài 13: Ansible Vault – Khóa Két Sắt Cho Bí Mật
- Bài 14: Ansible Tower/AWX – Trung Tâm Điều Khiển DevOps
- Bài 15: Ansible Best Practices – Viết Ansible Sạch, Chạy Đỉnh Cao
Sau khi dùng Ansible Dynamic Inventory DevOps ở bài trước, mình đã thấy inventory tự động “thần thánh” thế nào – không cần thêm server tay nữa. Nhưng hồi đó, mình lại gặp vấn đề: Làm sao để bảo mật thông tin nhạy cảm, như API key hay password, trong playbook? Mình từng để API key AWS ngay trong file YAML, lỡ commit lên GitHub công khai – suýt bị hack! Rồi mình phát hiện Ansible Vault DevOps, và đúng là “két sắt” bảo vệ bí mật! Hôm nay, mình sẽ kể bạn nghe Ansible Vault DevOps là gì, cách dùng nó để mã hóa thông tin nhạy cảm, và cùng thực hành bảo mật API key trong playbook. Cùng bắt đầu nhé!
Ansible Vault Là Gì? – “Két Sắt” Cho Thông Tin Nhạy Cảm
Nói đơn giản, Ansible Vault DevOps là công cụ của Ansible để mã hóa và bảo vệ thông tin nhạy cảm trong playbook, biến, hoặc file cấu hình. Thay vì để plaintext (VD: password, API key) trong file YAML, bạn mã hóa nó với Ansible Vault – chỉ ai có mật khẩu mới mở được. Bạn có thể tưởng tượng Vault như “két sắt” – khóa chặt bí mật, không để lộ cho người ngoài.
Hồi mới làm DevOps, mình thường để password SSH hay API key AWS trong file vars/main.yml
, nghĩ “ai mà đọc được”. Nhưng có lần mình đẩy code lên GitHub công khai, quên xóa key, thế là AWS báo có truy cập lạ – may mà khóa kịp! Sau đó, mình học Ansible Vault DevOps, dùng nó để mã hóa mọi thông tin nhạy cảm – an toàn hơn hẳn. Vault hỗ trợ mã hóa cả file (VD: group_vars
), hoặc chỉ một biến – đúng là “vũ khí” bảo mật cho dân DevOps!
Chuẩn Bị Trước Khi Dùng Ansible Vault
Để dùng Ansible Vault DevOps, bạn cần chuẩn bị:
-
Ansible Đã Cài: Vault là tính năng tích hợp sẵn trong Ansible, nên nếu bạn đã cài Ansible (bài 1), không cần cài thêm gì.
-
Thông Tin Nhạy Cảm Để Mã Hóa: Mình sẽ lấy API key AWS từ bài 11 để làm ví dụ. Giả sử bạn có file
group_vars/webservers.yml
:aws_access_key: YOUR_ACCESS_KEY aws_secret_key: YOUR_SECRET_KEY
Mã Hóa File Với Ansible Vault – Thực Hành Ngay
Giờ mình sẽ dùng Ansible Vault DevOps để mã hóa file group_vars/webservers.yml
.
-
Mã Hóa File: Chạy lệnh để mã hóa:
ansible-vault encrypt group_vars/webservers.yml
Ansible sẽ hỏi mật khẩu:
New Vault password: Confirm New Vault password:
Nhập mật khẩu (VD:
mypassword
), file sẽ được mã hóa. Nội dung file giờ nhìn như:$ANSIBLE_VAULT;1.1;AES256 66386331343063323636343738336266376237623565643366323866353266303338346666663234 ...
Mình từng quên mật khẩu, không mở được file – phải làm lại từ đầu. Nên nhớ: Lưu mật khẩu an toàn, đừng quên nhé!
-
Xem File Đã Mã Hóa: Dùng lệnh:
ansible-vault view group_vars/webservers.yml
Nhập mật khẩu, bạn sẽ thấy nội dung gốc:
aws_access_key: YOUR_ACCESS_KEY aws_secret_key: YOUR_SECRET_KEY
-
Chạy Playbook Với File Mã Hóa: Tạo file
use_vault.yml
:- name: Use encrypted variables hosts: localhost connection: local vars_files: - group_vars/webservers.yml tasks: - name: Debug AWS keys debug: msg: "Access Key: {{ aws_access_key }}, Secret Key: {{ aws_secret_key }}"
Chạy playbook:
ansible-playbook use_vault.yml --ask-vault-pass
Nhập mật khẩu (
mypassword
), kết quả:ok: [localhost] => { "msg": "Access Key: YOUR_ACCESS_KEY, Secret Key: YOUR_SECRET_KEY" }
Mình từng quên
--ask-vault-pass
, làm playbook báo lỗi “Decryption failed” – debug cả tiếng mới ra.
Mã Hóa Chỉ Một Biến – “Nhẹ Nhàng Hơn”
Nếu bạn không muốn mã hóa cả file, có thể mã hóa chỉ một biến. Ví dụ, mã hóa API key:
ansible-vault encrypt_string 'YOUR_ACCESS_KEY' --name 'aws_access_key'
Nhập mật khẩu, kết quả:
aws_access_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386331343063323636343738336266376237623565643366323866353266303338346666663234
...
Thêm vào file group_vars/webservers.yml
:
aws_access_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386331343063323636343738336266376237623565643366323866353266303338346666663234
...
aws_secret_key: YOUR_SECRET_KEY
Chạy lại playbook, nó vẫn hoạt động bình thường. Mình thích cách này khi chỉ cần mã hóa vài biến, không cần mã hóa cả file – gọn hơn!
Tích Hợp Với Playbook Thật – Thực Hành Với AWS
Giờ bạn thử dùng file mã hóa trong playbook tạo EC2 (bài 11). Sửa create_ec2.yml
:
- name: Create EC2 instance on AWS
hosts: localhost
connection: local
vars_files:
- group_vars/webservers.yml
vars:
instance_type: t2.micro
region: us-east-1
ami_id: ami-0c55b159cbfafe1f0
key_name: my-key-pair
tasks:
- name: Create EC2 instance
amazon.aws.ec2_instance:
name: "ansible-test-instance"
key_name: "{{ key_name }}"
instance_type: "{{ instance_type }}"
image_id: "{{ ami_id }}"
wait: yes
region: "{{ region }}"
security_group: default
network:
assign_public_ip: yes
tags:
Environment: Testing
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
register: ec2
- name: Debug instance info
debug:
msg: "Instance created with ID {{ ec2.instances[0].instance_id }} and IP {{ ec2.instances[0].public_ip_address }}"
Chạy:
ansible-playbook create_ec2.yml --ask-vault-pass
Nhập mật khẩu, kết quả giống bài 11 – nhưng API key đã được bảo mật! Mình từng để key trong playbook, lỡ commit lên GitHub – suýt “toang” cả tài khoản AWS.
Mẹo Nhỏ Từ Kinh Nghiệm Thật
- Lưu Mật Khẩu An Toàn: Dùng password manager, đừng ghi lung tung – mình từng quên, phải làm lại file.
- Dùng File Mật Khẩu: Thay vì
--ask-vault-pass
, lưu mật khẩu vào file (VD:vault_pass.txt
):ansible-playbook create_ec2.yml --vault-password-file vault_pass.txt
Mình hay dùng cách này khi chạy tự động qua CI/CD.
- Kiểm Tra Trước: Dùng
ansible-vault view
để đảm bảo file mở được trước khi chạy.
Cảm Nhận Sau Khi Dùng Ansible Vault
Lần đầu dùng Ansible Vault DevOps, mình thấy nó như “két sắt” thật – thông tin nhạy cảm được bảo vệ, không còn lo lộ key nữa. So với để plaintext, Vault giúp mình an tâm hơn khi làm việc với cloud. Cảm giác như vừa “khóa chặt” bí mật – an toàn mà chuyên nghiệp!
Tiếp Theo Là Gì?
Bài này tụi mình đã làm quen với Ansible Vault DevOps, từ mã hóa file đến tích hợp playbook. Lần sau, mình sẽ kể bạn nghe về Ansible Tower/AWX – cách quản lý Ansible quy mô lớn, kiểu như “trung tâm điều khiển” cho DevOps. Chịu không?
Thử Nghiệm Nhẹ: Thử mã hóa biến aws_secret_key
bằng encrypt_string
, thêm vào file group_vars
, rồi chạy lại playbook. Có gì thắc mắc cứ nhắn mình nhé – Vault là “két sắt”, làm quen tốt là bạn đã bảo vệ được bí mật!