Tự động hóa VMware vSphere với Ansible: Từ ‘Click tay’ sang Quản trị bằng Code

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

Nghỉ tay click chuột trên vCenter

Mình đang vận hành cluster 8 host ESXi với khoảng hơn 150 VM. Trước đây, mỗi lần team Dev yêu cầu tạo 10-20 VM để test dự án là mình lại thấy “ngán”. Việc lặp lại các bước: chọn Template, đặt tên, chỉnh RAM/CPU, rồi cấu hình IP thủ công cực kỳ tốn thời gian và rất dễ nhầm lẫn.

Sau khi chuyển sang dùng Infrastructure as Code (IaC) với Ansible, mọi thứ thay đổi hẳn. Mình không cần cài Agent lên máy ảo, chỉ cần viết file YAML đơn giản. Điểm ăn tiền nhất là tính Idempotency. Nghĩa là bạn chạy script bao nhiêu lần cũng được, Ansible sẽ chỉ thực hiện thay đổi nếu trạng thái thực tế chưa đúng với mô tả.

Bài viết này mình sẽ hướng dẫn anh em cách thiết lập để “bấm nút là có VM”, giúp rút ngắn thời gian provision từ 1 tiếng xuống còn chưa đầy 2 phút.

Tại sao Ansible là lựa chọn số 1 cho VMware?

Nhu cầu thực tế không chỉ là tạo máy ảo. Chúng ta còn phải quản lý vòng đời của nó: tăng RAM khi hệ thống quá tải, thêm ổ cứng, hoặc xóa bỏ khi dự án kết thúc. Ansible giải quyết bài toán này qua các module API chuyên biệt.

Bạn chỉ cần định nghĩa “Trạng thái mong muốn” (Desired State). Ví dụ: “Tôi cần 5 VM Ubuntu, 2 CPU, 4GB RAM”. Ansible sẽ tự so sánh với vCenter. Nếu thiếu nó sẽ tạo thêm, nếu cấu hình sai nó sẽ tự sửa lại cho đúng. Cách tiếp cận này giúp hạ tầng luôn đồng nhất, không còn tình trạng mỗi con VM một kiểu cấu hình.

Cài đặt môi trường chuẩn bị

Để Ansible “nói chuyện” được với vCenter, bạn cần một máy Control Node (thường là Ubuntu hoặc CentOS). Hãy đảm bảo máy này có thể gọi tới IP của vCenter qua cổng 443.

1. Cài đặt thư viện bổ trợ

Ansible sử dụng thư viện Python để tương tác với API của VMware. Hãy cài đặt bộ đôi này:

pip install pyvmomi pyVim

2. Cài đặt VMware Collection

Hiện nay các module VMware đã được đưa vào một collection riêng. Bạn cài đặt bằng lệnh:

ansible-galaxy collection install community.vmware

Lưu ý bảo mật: Đừng dùng tài khoản [email protected]. Hãy tạo một Service Account riêng (ví dụ: ansible-svc) và phân quyền Role-based vừa đủ để tạo/xóa VM.

Viết Playbook tạo máy ảo tự động

Dưới đây là kịch bản phổ biến nhất: Clone một máy ảo từ Template có sẵn và cấu hình IP tĩnh ngay lập tức.

File Playbook mẫu (deploy_vm.yml)

---
- name: Triển khai VM tự động trên vSphere
  hosts: localhost
  gather_facts: false
  vars:
    vcenter_host: "vcenter.company.com"
    vcenter_user: "[email protected]"
    vcenter_pass: "Mật-Khẩu-Nên-Dùng-Ansible-Vault"

  tasks:
    - name: Clone VM từ Template và cấu hình phần cứng
      community.vmware.vmware_guest:
        hostname: "{{ vcenter_host }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        validate_certs: false
        datacenter: "Hanoi-Datacenter"
        cluster: "Prod-Cluster"
        datastore: "PureStorage-LUN01"
        name: "web-app-prod-01"
        template: "ubuntu-22.04-gold-image"
        state: poweredon
        networks:
          - name: "VLAN-10-Web"
            ip: "10.10.10.50"
            netmask: "255.255.255.0"
            gateway: "10.10.10.1"
        hardware:
          memory_mb: 4096
          num_cpus: 2
        wait_for_ip_address: true
      delegate_to: localhost

Những điểm mấu chốt cần nhớ:

  • delegate_to: localhost: Rất quan trọng. Nó bắt Ansible chạy module ngay tại máy điều khiển để gọi API, thay vì cố gắng SSH vào vCenter.
  • wait_for_ip_address: Playbook sẽ tạm dừng cho đến khi VMware Tools báo về IP thành công. Điều này giúp các task cài đặt phần mềm phía sau không bị lỗi kết nối.
  • state: poweredon: Đảm bảo VM sẵn sàng hoạt động ngay sau khi clone.

Tối ưu cho quy mô lớn với Loop

Nếu sếp yêu cầu tạo 5 con VM cùng lúc, đừng copy-paste code 5 lần. Hãy sử dụng tính năng with_items để biến Playbook thành một dây chuyền sản xuất:

    - name: Tạo hàng loạt VM cho dự án
      community.vmware.vmware_guest:
        name: "{{ item.name }}"
        networks:
          - name: "VM Network"
            ip: "{{ item.ip }}"
      with_items:
        - { name: 'worker-01', ip: '10.10.10.61' }
        - { name: 'worker-02', ip: '10.10.10.62' }
        - { name: 'worker-03', ip: '10.10.10.63' }

Kiểm tra và xử lý lỗi (Troubleshooting)

Khi chạy lệnh ansible-playbook deploy_vm.yml, hãy chú ý màu sắc của output. Màu vàng (Changed) nghĩa là hệ thống vừa có biến đổi. Màu xanh lá (OK) nghĩa là mọi thứ đã đúng chuẩn, không cần làm gì thêm.

Nếu gặp lỗi (màu đỏ), hãy thêm flag -vvv. Ansible sẽ log chi tiết từng request JSON gửi tới vCenter. Thông thường, lỗi hay nằm ở việc gõ sai tên Datastore hoặc Resource Pool trên giao diện vCenter so với trong code.

Ngoài ra, mình hay dùng module vmware_guest_info để quét toàn bộ hạ tầng. Chỉ mất 30 giây để xuất ra file báo cáo danh sách 150 VM kèm cấu hình RAM/CPU, thay vì phải ngồi đếm tay trên vSphere Client.

Lời kết

Tự động hóa VMware không chỉ là để tiết kiệm sức lực. Nó giúp loại bỏ hoàn toàn các lỗi ngớ ngẩn do thao tác tay. Khi đã có bộ Playbook chuẩn, việc quản lý 8 host hay 80 host cũng nhàn nhã như nhau.

Lời khuyên của mình: Hãy bắt đầu từ những việc nhỏ như bật/tắt máy ảo theo lịch. Khi đã quen tay, bạn hãy xây dựng các flow phức tạp hơn như tự động mở rộng ổ cứng khi disk đầy. Chúc anh em sớm làm chủ được hạ tầng bằng code!

Share: