Tự động cấu hình IP-in-IP Tunnel và NTP bằng Ansible – Khi Network Automation không còn là "chạy từng lệnh CLI"
Trong môi trường hạ tầng hiện đại, việc cấu hình thủ công từng máy chủ hoặc từng tunnel mạng không còn phù hợp khi số lượng server có thể lên đến hàng trăm hoặc hàng nghìn node. Đây chính là lúc Ansible phát huy sức mạnh của một nền tảng Configuration Management theo mô hình Push, cho phép tự động hóa toàn bộ quy trình triển khai hạ tầng và dịch vụ.
Bài lab này mô phỏng một tình huống rất thực tế: sử dụng Ansible để triển khai IP-in-IP Tunnel (IPIP) giữa hai máy chủ Linux và tự động cấu hình dịch vụ NTP thông qua Ansible Roles.
Bước đầu tiên: Agentless Automation
Khác với Puppet hay Salt, Ansible không yêu cầu cài đặt Agent trên máy đích. Chỉ cần:
Sau khi tạo cặp khóa RSA và copy Public Key tới server01 và server02, Ansible có thể kết nối và thực hiện automation mà không cần bất kỳ daemon nào chạy trên server đích.
Đây là lý do Ansible được sử dụng rất nhiều trong:
Ansible quản lý hạ tầng thông qua Inventory.
Ví dụ:
[servers]
server01
server02
Mỗi host có thể khai báo thêm:
Ví dụ:
server01 ansible_host=192.168.0.20 ansible_port=20001 ansible_user=root
server02 ansible_host=192.168.0.20 ansible_port=20002 ansible_user=root
Cách tiếp cận này giúp việc mở rộng từ 2 server lên 200 hoặc 2.000 server chỉ đơn giản là cập nhật Inventory mà không phải sửa Playbook.
Tự động triển khai IP-in-IP Tunnel
Bài lab sử dụng Ansible để cấu hình tunnel IPIP bằng các lệnh Linux:
ip link add name NAME type ipip local LOCAL_IP remote REMOTE_IP
ip link set NAME up
ip addr add IP_ADDRESS dev NAME
Điểm hay là toàn bộ tham số:
được parameter hóa bằng Jinja2 Variables.
Ví dụ: server01
if_name: ipip1
ip_address: 192.168.1.1/24
local_ip: 172.20.0.21
remote_ip: 172.20.0.22
server02
if_name: ipip1
ip_address: 192.168.2.1/24
local_ip: 172.20.0.22
remote_ip: 172.20.0.21
Các biến này được lưu trong thư mục:
host_vars/
├── server01
└── server02
Khi Playbook chạy, Ansible sẽ render Template bằng Jinja2 và sinh ra script thực tế trên từng server.
Tạo Playbook
Playbook đầu tiên sử dụng Module:
template:
để tạo file:
/root/network-script.sh
và cấp quyền:
744
Sau đó Playbook sử dụng Task thứ hai để thực thi script và ghi log vào:
network-script.log
Cuối cùng Playbook bổ sung thêm Static Route để định tuyến qua Tunnel Interface.
Ví dụ: server01
remote_subnet: 192.168.2.0/24 server02
remote_subnet: 192.168.1.0/24
Sau khi Playbook hoàn tất, hai máy chủ có thể ping lẫn nhau thông qua Tunnel IPIP.
Đây là ví dụ rất điển hình của Network Automation:
Infrastructure được mô tả bằng code, Template và Variables thay vì nhập từng lệnh CLI trên từng máy chủ.
Tự động cấu hình NTP bằng Ansible Role
Phần thứ hai của bài lab minh họa một khái niệm rất quan trọng trong Ansible: Role.
Role là cách đóng gói:
thành một đơn vị tái sử dụng.
Role NTP được tạo bằng:
ansible-galaxy init ntp
Lệnh này tự động tạo cấu trúc thư mục:
roles/
└── ntp
├── tasks
├── templates
├── defaults
├── handlers
└── vars
Tiếp theo tạo Template:
roles/ntp/templates/ntp.conf.tmpl
Template sử dụng Jinja2 Loop để thêm nhiều NTP Server từ biến:
ntp_servers
được lưu trong:
group_vars/all
Ví dụ:
ntp_servers:
- 0.north-america.pool.ntp.org
- 1.north-america.pool.ntp.org
- 2.north-america.pool.ntp.org
- 3.north-america.pool.ntp.org
Role thực hiện toàn bộ quy trình:
Toàn bộ chỉ cần một dòng trong Playbook:
roles:
- ntp
Điều thú vị nhất của Ansible: Idempotency
Khi chạy Playbook lần thứ hai, Ansible sẽ kiểm tra trạng thái hiện tại.
Nếu:
Ansible sẽ không thực hiện lại các hành động không cần thiết.
Đây là đặc điểm cực kỳ quan trọng trong các hệ thống Enterprise vì nó cho phép:
Bài lab này cho thấy Ansible không chỉ là công cụ cài package hoặc restart service. Với sự kết hợp giữa:
Ansible có thể tự động hóa từ việc cấu hình IPIP Tunnel, định tuyến, DNS, NTP cho đến quản lý hàng nghìn máy chủ Linux và thiết bị mạng.
Đây cũng chính là lý do Ansible trở thành một trong những công cụ quan trọng nhất trong hệ sinh thái DevOps, NetDevOps và Infrastructure Automation hiện nay.
devops ansible #NetworkAutomation #InfrastructureAsCode linux #NetDevOps automation #IPIP ntp #PlatformEngineering #CloudAutomation
Trong môi trường hạ tầng hiện đại, việc cấu hình thủ công từng máy chủ hoặc từng tunnel mạng không còn phù hợp khi số lượng server có thể lên đến hàng trăm hoặc hàng nghìn node. Đây chính là lúc Ansible phát huy sức mạnh của một nền tảng Configuration Management theo mô hình Push, cho phép tự động hóa toàn bộ quy trình triển khai hạ tầng và dịch vụ.
Bài lab này mô phỏng một tình huống rất thực tế: sử dụng Ansible để triển khai IP-in-IP Tunnel (IPIP) giữa hai máy chủ Linux và tự động cấu hình dịch vụ NTP thông qua Ansible Roles.
Bước đầu tiên: Agentless Automation
Khác với Puppet hay Salt, Ansible không yêu cầu cài đặt Agent trên máy đích. Chỉ cần:
- Một máy quản trị cài Ansible
- SSH Key Authentication
- Quyền truy cập tới các máy chủ cần quản lý
Sau khi tạo cặp khóa RSA và copy Public Key tới server01 và server02, Ansible có thể kết nối và thực hiện automation mà không cần bất kỳ daemon nào chạy trên server đích.
Đây là lý do Ansible được sử dụng rất nhiều trong:
- Linux Administration
- Cloud Provisioning
- Network Automation
- DevOps Platform Engineering
- Infrastructure as Code (IaC)
Ansible quản lý hạ tầng thông qua Inventory.
Ví dụ:
[servers]
server01
server02
Mỗi host có thể khai báo thêm:
- ansible_host
- ansible_port
- ansible_user
Ví dụ:
server01 ansible_host=192.168.0.20 ansible_port=20001 ansible_user=root
server02 ansible_host=192.168.0.20 ansible_port=20002 ansible_user=root
Cách tiếp cận này giúp việc mở rộng từ 2 server lên 200 hoặc 2.000 server chỉ đơn giản là cập nhật Inventory mà không phải sửa Playbook.
Tự động triển khai IP-in-IP Tunnel
Bài lab sử dụng Ansible để cấu hình tunnel IPIP bằng các lệnh Linux:
ip link add name NAME type ipip local LOCAL_IP remote REMOTE_IP
ip link set NAME up
ip addr add IP_ADDRESS dev NAME
Điểm hay là toàn bộ tham số:
- Interface Name
- Tunnel IP
- Local IP
- Remote IP
được parameter hóa bằng Jinja2 Variables.
Ví dụ: server01
if_name: ipip1
ip_address: 192.168.1.1/24
local_ip: 172.20.0.21
remote_ip: 172.20.0.22
server02
if_name: ipip1
ip_address: 192.168.2.1/24
local_ip: 172.20.0.22
remote_ip: 172.20.0.21
Các biến này được lưu trong thư mục:
host_vars/
├── server01
└── server02
Khi Playbook chạy, Ansible sẽ render Template bằng Jinja2 và sinh ra script thực tế trên từng server.
Tạo Playbook
Playbook đầu tiên sử dụng Module:
template:
để tạo file:
/root/network-script.sh
và cấp quyền:
744
Sau đó Playbook sử dụng Task thứ hai để thực thi script và ghi log vào:
network-script.log
Cuối cùng Playbook bổ sung thêm Static Route để định tuyến qua Tunnel Interface.
Ví dụ: server01
remote_subnet: 192.168.2.0/24 server02
remote_subnet: 192.168.1.0/24
Sau khi Playbook hoàn tất, hai máy chủ có thể ping lẫn nhau thông qua Tunnel IPIP.
Đây là ví dụ rất điển hình của Network Automation:
Infrastructure được mô tả bằng code, Template và Variables thay vì nhập từng lệnh CLI trên từng máy chủ.
Tự động cấu hình NTP bằng Ansible Role
Phần thứ hai của bài lab minh họa một khái niệm rất quan trọng trong Ansible: Role.
Role là cách đóng gói:
- Tasks
- Variables
- Templates
- Handlers
- Files
thành một đơn vị tái sử dụng.
Role NTP được tạo bằng:
ansible-galaxy init ntp
Lệnh này tự động tạo cấu trúc thư mục:
roles/
└── ntp
├── tasks
├── templates
├── defaults
├── handlers
└── vars
Tiếp theo tạo Template:
roles/ntp/templates/ntp.conf.tmpl
Template sử dụng Jinja2 Loop để thêm nhiều NTP Server từ biến:
ntp_servers
được lưu trong:
group_vars/all
Ví dụ:
ntp_servers:
- 0.north-america.pool.ntp.org
- 1.north-america.pool.ntp.org
- 2.north-america.pool.ntp.org
- 3.north-america.pool.ntp.org
Role thực hiện toàn bộ quy trình:
- Cài package NTP
- Khởi động service
- Sinh file /etc/ntp.conf
- Restart service
Toàn bộ chỉ cần một dòng trong Playbook:
roles:
- ntp
Điều thú vị nhất của Ansible: Idempotency
Khi chạy Playbook lần thứ hai, Ansible sẽ kiểm tra trạng thái hiện tại.
Nếu:
- Tunnel đã tồn tại
- Package đã cài
- Service đã chạy
- File cấu hình không thay đổi
Ansible sẽ không thực hiện lại các hành động không cần thiết.
Đây là đặc điểm cực kỳ quan trọng trong các hệ thống Enterprise vì nó cho phép:
- Triển khai lặp lại nhiều lần
- Giảm rủi ro thay đổi ngoài ý muốn
- Dễ dàng kiểm soát trạng thái hạ tầng
- Hỗ trợ Continuous Delivery và GitOps
Bài lab này cho thấy Ansible không chỉ là công cụ cài package hoặc restart service. Với sự kết hợp giữa:
- Inventory
- Jinja2 Templates
- host_vars
- group_vars
- Playbooks
- Roles
Ansible có thể tự động hóa từ việc cấu hình IPIP Tunnel, định tuyến, DNS, NTP cho đến quản lý hàng nghìn máy chủ Linux và thiết bị mạng.
Đây cũng chính là lý do Ansible trở thành một trong những công cụ quan trọng nhất trong hệ sinh thái DevOps, NetDevOps và Infrastructure Automation hiện nay.
devops ansible #NetworkAutomation #InfrastructureAsCode linux #NetDevOps automation #IPIP ntp #PlatformEngineering #CloudAutomation