Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng

Ở bài trước, tụi mình đã thấy Ansible Variables DevOps “thần thánh” thế nào khi làm playbook linh hoạt hơn – không còn hardcode lung tung nữa. Nhưng mà hồi đó, mình mới chỉ dùng vài module cơ bản như copy, apt, hay service. Rồi một ngày, mình cần tạo user trên server, chạy Bash script cũ, và làm mấy việc “khó nhằn” khác – lúc đó mới nhận ra Ansible Module DevOps là cả một kho báu! Hôm nay, mình sẽ kể bạn nghe Ansible Module DevOps nâng cao là gì, cách dùng các module mạnh mẽ như user, shell, và một vài module khác mà mình hay xài trong DevOps. Cùng làm thử vài ví dụ để bạn thấy Ansible “biến hóa” ra sao nhé!

Ansible Module DevOps Là Gì? – “Hộp Đồ Nghề” Của DevOps

Nói đơn giản, Ansible Module DevOps là các công cụ nhỏ mà Ansible dùng để thực thi task trên server. Bạn có thể tưởng tượng module như “hộp đồ nghề” – mỗi module làm một việc cụ thể: copy để copy file, apt để cài package, service để quản lý service. Từ bài 1 đến bài 5, tụi mình đã dùng vài module cơ bản, nhưng Ansible có hàng trăm module, từ quản lý user, file, đến chạy script hay thậm chí điều khiển cloud.

Hồi mới làm DevOps, mình nghĩ: “Ủa, chắc cũng giống Bash script thôi, cần gì module?”. Nhưng rồi có lần mình cần tạo 10 user trên 5 server, nếu dùng Bash thì phải SSH từng máy, viết script dài dòng – mệt muốn xỉu. Rồi mình mò ra module user của Ansible, chỉ vài dòng YAML là xong, nhanh hơn cả Flash chạy đua! Từ đó, mình mê Ansible Module DevOps luôn – nó giúp mình làm được những việc mà Bash phải viết cả trang script mới xong.

Khám Phá Một Vài Module Nâng Cao

Ansible có hàng trăm module, nhưng mình sẽ giới thiệu vài module nâng cao mà mình hay dùng trong DevOps. Cùng xem từng cái nhé!

  1. Module user – Tạo Và Quản Lý User: Mình hay dùng module này để tạo user trên server, thêm SSH key cho user, hoặc xóa user khi cần. Ví dụ, tạo user deploy trên webservers. Tạo file create_user.yml:

    - name: Create deploy user on webservers
     hosts: webservers
     become: yes
     tasks:
       - name: Create user deploy
         user:
           name: deploy
           state: present
           shell: /bin/bash
           create_home: yes
           groups: sudo
           append: yes
    • state: present: Đảm bảo user tồn tại (nếu không có thì tạo).
    • create_home: yes: Tạo thư mục home cho user.
    • groups: sudo: Thêm user vào nhóm sudo.

    Chạy playbook:

    ansible-playbook -i hosts create_user.yml

    Kết quả:

    changed: [web1]
    changed: [web2]

    SSH vào server kiểm tra:

    ssh ubuntu@192.168.1.10 "id deploy"

    Nếu thấy user deploy với nhóm sudo, là thành công! Mình từng quên become: yes, làm playbook lỗi “permission denied” – suýt khóc vì tưởng khó.

  2. Module shell – Tích Hợp Bash Script: Có lần mình cần chạy một Bash script cũ trên server, mà script đó phức tạp, không muốn viết lại bằng Ansible. Module shell cứu mình! Ví dụ, chạy script kiểm tra CPU. Tạo file run_script.yml:

    - name: Run Bash script on webservers
     hosts: webservers
     tasks:
       - name: Copy CPU check script
         copy:
           src: cpu_check.sh
           dest: /tmp/cpu_check.sh
           mode: '0755'
       - name: Run CPU check script
         shell: /tmp/cpu_check.sh
         register: cpu_output
       - name: Debug CPU output
         debug:
           msg: "{{ cpu_output.stdout }}"

    Tạo file cpu_check.sh trên máy local:

    echo '#!/bin/bash' > cpu_check.sh
    echo 'top -bn1 | head -n3' >> cpu_check.sh
    chmod +x cpu_check.sh

    Chạy playbook:

    ansible-playbook -i hosts run_script.yml

    Kết quả sẽ in thông tin CPU, kiểu:

    ok: [web1] => {
       "msg": "%CPU(s):  1.2 us,  0.5 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st"
    }

    Module shell mạnh ở chỗ nó chạy được mọi lệnh Bash, nhưng cẩn thận – dùng nhiều quá sẽ làm playbook “bừa bộn”. Mình từng lạm dụng shell, đến lúc debug mới thấy khó tìm lỗi.

  3. Module file – Quản Lý File/Thư Mục: Module này giúp tạo/xóa file, thư mục, hoặc đổi quyền. Ví dụ, tạo thư mục /var/app:

    - name: Create app directory
     hosts: webservers
     become: yes
     tasks:
       - name: Create /var/app directory
         file:
           path: /var/app
           state: directory
           mode: '0755'
           owner: deploy
           group: deploy
    • state: directory: Đảm bảo /var/app là thư mục.
    • mode: '0755': Quyền thư mục.

    Chạy:

    ansible-playbook -i hosts create_dir.yml

    Kết quả:

    changed: [web1]
    changed: [web2]

    Module file rất tiện để chuẩn bị môi trường trước khi deploy app. Mình từng quên set quyền, làm app không chạy – từ đó luôn nhớ thêm mode.

Thực Hành Nhẹ: Tạo User Và Chạy Script

Giờ bạn thử kết hợp các module: tạo user deploy, tạo thư mục, và chạy script kiểm tra CPU. Tạo file combined.yml:

- name: Create user and run script
  hosts: webservers
  become: yes
  tasks:
    - name: Create user deploy
      user:
        name: deploy
        state: present
        shell: /bin/bash
        create_home: yes
    - name: Create app directory
      file:
        path: /var/app
        state: directory
        mode: '0755'
        owner: deploy
        group: deploy
    - name: Copy CPU check script
      copy:
        src: cpu_check.sh
        dest: /var/app/cpu_check.sh
        mode: '0755'
        owner: deploy
    - name: Run CPU check script as deploy user
      shell: /var/app/cpu_check.sh
      become_user: deploy
      register: cpu_output
    - name: Debug CPU output
      debug:
        msg: "{{ cpu_output.stdout }}"

Chạy:

ansible-playbook -i hosts combined.yml

Kết quả sẽ tạo user, thư mục, chạy script, và in CPU usage. Mình từng quên become_user, làm script chạy với user sai – lỗi “permission denied” ngay lập tức.

Mẹo Nhỏ Từ Kinh Nghiệm Thật

  • Dùng command thay shell nếu đơn giản: Module shell mạnh nhưng chậm, nếu chỉ chạy lệnh đơn giản (VD: echo), dùng command nhanh hơn.
  • Kiểm tra module trước: Dùng ansible-doc để đọc tài liệu module:
    ansible-doc user

    Mình hay dùng cái này để tìm option mới.

  • Cẩn thận với shell: Nó chạy được mọi lệnh, nhưng dễ gây lỗi nếu lệnh phức tạp. Mình từng chạy nhầm rm -rf qua shell, may mà có backup.

Có lần mình dùng shell để chạy lệnh reboot trên 10 server, quên kiểm tra, làm cả cụm production reboot cùng lúc – khách hàng gọi tới tấp, sếp hỏi “Mày làm gì vậy?”. Từ đó, mình luôn chạy --check trước khi dùng shell cho lệnh “nguy hiểm”.

Tiếp Theo Là Gì?

Bài này tụi mình đã làm quen với Ansible Module DevOps nâng cao, từ tạo user đến chạy script. Lần sau, mình sẽ kể bạn nghe về role – cách tổ chức playbook gọn gàng hơn, không còn “dài như truyện Conan” nữa. Chịu không?

Thử Nghiệm Nhẹ: Thử thêm module yum (nếu server dùng CentOS) để cài package, hoặc dùng shell chạy lệnh uptime. Có gì thắc mắc cứ nhắn mình nhé – module là “đồ chơi” mạnh, làm quen tốt là bạn đã sẵn sàng cho những task lớn!

Điều hướng chuỗi bài viết<< Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
>> Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
Article Thumbnail
Datadog Webinar: Modernize AWS Logs at Scale

Sự kiện đang hiện hành

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận