Syllabus chi tiết học Ansible trong 1 tuần

Part 1: Ansible overview

Mục tiêu:

  • Hiểu biết sâu sắc về IaC và vai trò then chốt của Ansible trong tự động hóa cơ sở hạ tầng.

  • Khả năng phân tích và so sánh Ansible với các giải pháp IaC khác, lựa chọn công cụ phù hợp cho từng dự án.

  • Nắm vững kiến trúc Ansible, từ Control Node đến Modules, và cách chúng tương tác để tạo nên sức mạnh tự động hóa.

  • Thành thạo cài đặt, cấu hình Ansible trên nhiều nền tảng, xử lý lỗi và tối ưu hóa môi trường làm việc.

  • Tự tin sử dụng Ansible CLI, thực thi Ad-hoc commands với nhiều options nâng cao, và bắt đầu làm quen với Playbooks.

Nội dung chi tiết:

1. IaC:

  • Từ thủ công đến tự động:

    • Điểm lại lịch sử quản trị hệ thống: Từ thao tác thủ công đến script, những hạn chế và bài toán cần giải quyết.

    • Sự ra đời của IaC như một giải pháp tất yếu: Tự động hóa, kiểm soát phiên bản, cơ sở hạ tầng như code.

    • Lợi ích vượt trội của IaC:

      • Tăng tốc độ triển khai: Từ ngày/tuần xuống còn phút/giờ.

      • Giảm thiểu lỗi do con người: Loại bỏ "human error", đảm bảo tính nhất quán.

      • Tái sử dụng và quản lý phiên bản: Cơ sở hạ tầng như code, dễ dàng quản lý, tái sử dụng, rollback.

      • Tăng cường khả năng cộng tác: Team cùng làm việc trên cùng một "codebase" cơ sở hạ tầng.

  • Bức tranh toàn cảnh IaC:

    • Phân loại các công cụ IaC theo nhiều tiêu chí:

      • Mutable vs. Immutable Infrastructure: Thay đổi trực tiếp hay tạo mới hoàn toàn?

      • Agent-based vs. Agentless: Cần cài agent trên target hay không?

      • Ngôn ngữ: Sử dụng DSL riêng hay ngôn ngữ lập trình phổ biến?

    • Phân tích ưu nhược điểm của từng loại, ví dụ:

      • Mutable dễ tiếp cận nhưng khó quản lý trạng thái, Immutable phức tạp hơn nhưng nhất quán.

      • Agent-based mạnh mẽ nhưng tốn tài nguyên, Agentless nhẹ nhàng nhưng phụ thuộc kết nối.

  • Ansible:

    • Đơn giản và dễ sử dụng: Ngôn ngữ YAML dễ đọc, dễ viết, dễ hiểu.

    • Mạnh mẽ và linh hoạt: Hàng trăm modules, plugins đáp ứng mọi nhu cầu.

    • Kiến trúc Agentless: Dễ triển khai, quản lý, ít overhead.

    • Cộng đồng lớn mạnh: Hỗ trợ phong phú, nhiều tài liệu, dễ dàng tìm kiếm giải pháp.

  • So sánh Ansible với các đối thủ:

    • Chef: Mạnh mẽ, cấu hình phức tạp, phù hợp với tổ chức lớn.

    • Puppet: Kiến trúc client-server, mạnh về quản lý cấu hình, phù hợp với môi trường lớn.

    • Terraform: Chuyên về quản lý cloud, khai báo thay vì imperative, mạnh khi kết hợp với Ansible.

    • SaltStack: Tốc độ cao, kiến trúc scalable, phù hợp với môi trường lớn, phức tạp.

  • Lựa chọn công cụ phù hợp: Không có "best tool", chỉ có "right tool" cho từng bài toán cụ thể. Ansible ghi điểm với sự đơn giản, dễ sử dụng, phù hợp với nhiều quy mô.

2. Ansible overview:

  • Kiến trúc Agentless - Đơn giản và Hiệu quả:

    • Control Node kết nối đến Managed Nodes thông qua SSH.

    • Không cần cài đặt agent trên Managed Nodes, giảm thiểu overhead.

    • Ansible sử dụng push-based model: Control Node đẩy configurations đến Managed Nodes.

    • Cơ chế hoạt động:

      • Ansible kết nối đến Managed Node qua SSH.

      • Sao chép modules cần thiết đến Managed Node.

      • Thực thi modules trên Managed Node.

      • Xóa modules sau khi hoàn thành.

    • Ưu điểm: Dễ triển khai, quản lý đơn giản, ít overhead, phù hợp với cả môi trường lớn và nhỏ.

    • Nhược điểm: Phụ thuộc vào SSH, bảo mật có thể là vấn đề nếu cấu hình không đúng, khả năng mở rộng có thể bị giới hạn.

  • Hệ sinh thái Ansible:

    • Control Node:

      • Yêu cầu hệ điều hành: Linux/macOS (khuyến nghị), có thể sử dụng WSL trên Windows.

      • Cài đặt Python và các package cần thiết.

      • Lưu trữ Playbooks, Inventories, configurations.

    • Managed Nodes:

      • Hỗ trợ đa dạng hệ điều hành: Linux, Windows, macOS, network devices.

      • Cần có Python để chạy Ansible modules.

      • Cho phép kết nối SSH từ Control Node.

    • Inventory:

      • Định nghĩa các Managed Nodes theo nhóm, hostnames, IP addresses.

      • Hỗ trợ biến để cấu hình linh hoạt.

      • Có thể sử dụng dynamic inventory để tự động cập nhật danh sách hosts.

      • Định dạng file: INI (.ini), YAML (.yml).

    • Modules:

      • Mỗi module thực hiện một tác vụ cụ thể (ví dụ: quản lý user, cài đặt package, cấu hình service).

      • Ansible cung cấp hàng trăm modules "sẵn sàng sử dụng", phân loại theo chức năng: system, cloud, network, web...

      • Có thể viết modules tùy chỉnh bằng Python để mở rộng khả năng của Ansible.

      • Modules đảm bảo tính idempotency: Chỉ thực hiện thay đổi khi cần thiết, giúp Playbook có thể chạy lại nhiều lần mà không gây ra side effects.

    • Plugins:

      • Tăng cường chức năng cho Ansible core.

      • Phân loại theo chức năng: connection, lookup, callback, filter, strategy, vars.

      • Ví dụ:

        • Connection plugins: Thay đổi cách thức Ansible kết nối đến Managed Node (ví dụ: SSH, WinRM).

        • Lookup plugins: Lấy dữ liệu từ các nguồn khác nhau (ví dụ: file, database, environment variables).

        • Callback plugins: Thực thi các hành động trước, trong, sau khi Playbook chạy.

    • Playbooks:

      • File YAML chứa chuỗi các tasks (công việc) cần thực hiện trên Managed Nodes.

      • Cấu trúc rõ ràng, dễ đọc, dễ hiểu.

      • Hỗ trợ biến, điều kiện, lặp để tạo Playbook linh hoạt.

      • Có thể sử dụng Roles để tổ chức Playbook lớn thành các thành phần nhỏ hơn, dễ quản lý và tái sử dụng.

3. Cài đặt Ansible

  • Lựa chọn phương pháp cài đặt:

    • Package manager (khuyến nghị): Đơn giản, nhanh chóng, đảm bảo dependencies.

      • Ubuntu/Debian: apt install ansible.

      • CentOS/RHEL: yum install ansible.

    • Pip (Python package manager): Cài đặt phiên bản cụ thể, có thể sử dụng virtual environments.

      • pip install ansible.
    • Source code: Linh hoạt, kiểm soát phiên bản, phù hợp với người dùng nâng cao.

      • Tải source code từ Github, build và cài đặt.
  • Xử lý lỗi thường gặp:

    • Thiếu package dependencies: Cài đặt các package còn thiếu.

    • Phiên bản Python không tương thích: Cài đặt phiên bản Python phù hợp hoặc sử dụng virtual environment.

    • Lỗi liên quan đến quyền truy cập: Sử dụng sudo hoặc đăng nhập bằng user có quyền root.

  • Cấu hình môi trường làm việc Ansible:

    • File cấu hình Ansible (ansible.cfg):

      • Vị trí: /etc/ansible/ansible.cfg (hệ thống), ~/.ansible.cfg (user).

      • Cấu hình đường dẫn Inventory, user kết nối, SSH key, ...

      • Ví dụ cấu hình:

          [defaults]
          inventory = /etc/ansible/hosts
          remote_user = user
          private_key_file = /home/user/.ssh/id_rsa
          forks = 5
        
    • Môi trường ảo Python (khuyến nghị):

      • Tạo môi trường ảo: python3 -m venv .venv.

      • Kích hoạt môi trường ảo: source .venv/bin/activate.

      • Cài đặt Ansible trong môi trường ảo: pip install ansible.

      • Lợi ích:

        • Cô lập dependencies của Ansible với hệ thống.

        • Dễ dàng quản lý phiên bản Ansible.

        • Tránh xung đột với các ứng dụng Python khác.

4. Ansible CLI:

  • Khám phá các lệnh cơ bản:

    • ansible: Thực thi Ad-hoc commands.

      • Cú pháp: ansible <host_pattern> -m <module_name> -a "<module_arguments>".

      • Ví dụ: ansible webservers -m service -a "name=nginx state=restarted".

    • ansible-playbook: Chạy Playbook.

      • Cú pháp: ansible-playbook <playbook_name>.yml.

      • Ví dụ: ansible-playbook install_nginx.yml.

    • ansible-vault: Mã hóa và giải mã dữ liệu.

      • Mã hóa file: ansible-vault encrypt my_secrets.yml.

      • Giải mã file: ansible-vault decrypt my_secrets.yml.

    • ansible-galaxy: Quản lý Roles.

      • Tải Role: ansible-galaxy install username.role_name.

      • Tìm kiếm Role: ansible-galaxy search <keyword>.

  • Ad-hoc Commands:

    • Khái niệm: Lệnh đơn lẻ, thực thi ngay trên CLI, không cần viết Playbook.

    • Lợi ích:

      • Thực thi các tác vụ đơn giản, nhanh chóng.

      • Kiểm tra kết nối, gather information từ Managed Nodes.

      • Khắc phục sự cố, debug.

    • Cấu trúc lệnh:

      • ansible <host_pattern> -m <module_name> -a "<module_arguments>".

        • <host_pattern>: Xác định Managed Node hoặc nhóm Managed Nodes (ví dụ: webservers, dbservers, 192.168.1.1).

        • m <module_name>: Tên module cần sử dụng (ví dụ: apt, yum, service, user).

        • a "<module_arguments>": Các tham số truyền cho module (ví dụ: name=nginx state=started).

    • Ví dụ thực tế:

      • Ping tất cả các Managed Nodes: ansible all -m ping.

      • Khởi động dịch vụ nginx trên nhóm webservers: ansible webservers -m service -a "name=nginx state=started".

      • Tạo user mới trên Managed Node 192.168.1.100: ansible 192.168.1.100 -m user -a "name=john group=wheel state=present".

  • Ad-hoc Commands nâng cao:

    • i <inventory_file>: Sử dụng file Inventory cụ thể.

    • u <remote_user>: Kết nối đến Managed Node với user cụ thể.

    • k: Yêu cầu nhập mật khẩu SSH.

    • b: Chạy với quyền root trên Managed Node.

    • v, vvv: Tăng mức độ chi tiết output (verbose mode).

    • f <forks>: Thay đổi số lượng kết nối đồng thời.

    • Kết hợp các options để tạo lệnh phức tạp hơn, ví dụ: ansible webservers -i production_inventory.yml -u deploy_user -b -m apt -a "name=nginx state=latest".

  • Bài tập:

    1. Cài đặt Ansible và cấu hình môi trường:

      • Cài đặt Ansible trên máy trạm (Linux/macOS).

      • Tạo hai máy ảo (Ubuntu & CentOS) và cấu hình SSH key-based authentication từ máy trạm.

    2. Tạo Ansible Inventory:

      • Tạo file Inventory (ví dụ: hosts.ini hoặc hosts.yml).

      • Thêm hai máy ảo vào Inventory, phân nhóm theo hệ điều hành: webservers (Ubuntu), dbservers (CentOS).

    3. Thực hành Ad-hoc commands:

      • Sử dụng ping module để kiểm tra kết nối đến tất cả Managed Nodes.

      • Cài đặt package nginx trên nhóm webservers và package httpd trên nhóm dbservers, sử dụng module phù hợp với từng hệ điều hành (apt hoặc yum).

      • Khởi động dịch vụ nginx trên nhóm webservers và dịch vụ httpd trên nhóm dbservers.

      • Tạo user ansible_admin với quyền sudo trên tất cả Managed Nodes.

Part 2: Modules

Mục tiêu:

  • Hiểu rõ vai trò quan trọng của Modules trong hệ sinh thái Ansible.

  • Phân biệt các loại Modules, cách chúng hoạt động, và cách tìm kiếm module phù hợp.

  • Nắm vững các Modules quan trọng trong quản lý hệ thống: quản lý packages, services, users, files, ...

  • Sử dụng thành thạo các Modules nâng cao để thực hiện các tác vụ phức tạp.

  • Bắt đầu làm quen với việc debug và xử lý lỗi khi làm việc với Modules.

Nội dung chi tiết:

1. Modules:

  • Vai trò trung tâm:

    • Modules là "trái tim" của Ansible, thực thi các tác vụ cụ thể trên Managed Nodes.

    • Mỗi Module được thiết kế để thực hiện một công việc duy nhất (ví dụ: cài đặt package, khởi động service, tạo user, ...).

    • Ansible có sẵn hàng trăm Modules, đáp ứng gần như mọi nhu cầu tự động hóa cơ sở hạ tầng.

  • Nguyên tắc hoạt động "Idempotency":

    • Modules được thiết kế để đảm bảo tính idempotent: chỉ thực hiện thay đổi khi cần thiết.

    • Nếu chạy Module nhiều lần trên cùng một trạng thái hệ thống, kết quả sẽ luôn như nhau.

    • Lợi ích:

      • Tránh side effects, đảm bảo tính nhất quán cho cơ sở hạ tầng.

      • An toàn khi chạy Playbook nhiều lần, ví dụ: khi rollback hoặc deploy lại.

  • Phân loại Modules:

    • Core Modules: Được tích hợp sẵn trong Ansible Core, được hỗ trợ và maintain bởi cộng đồng Ansible.

    • Extras Modules: Các Modules bổ sung, không được tích hợp trong Ansible Core, thường được sử dụng cho các tác vụ đặc biệt.

    • Community Modules: Được phát triển và chia sẻ bởi cộng đồng Ansible, có thể tìm thấy trên Ansible Galaxy.

  • Tìm kiếm và khám phá Modules:

    • Tài liệu Ansible: https://docs.ansible.com/ là nguồn tài liệu chính thức và đầy đủ nhất.

    • Lệnh ansible-doc: Hiển thị thông tin chi tiết về Module, bao gồm các tham số, giá trị trả về, ví dụ: ansible-doc apt.

    • Ansible Galaxy: Tìm kiếm Modules được chia sẻ bởi cộng đồng.

2. Modules quản lý hệ thống

  • Quản lý Packages:

    • apt (Debian/Ubuntu):

      • Cài đặt, gỡ bỏ, cập nhật packages.

      • Ví dụ:

        • Cài đặt package nginx: apt: name=nginx state=latest

        • Gỡ bỏ package mysql-server: apt: name=mysql-server state=absent

    • yum (CentOS/RHEL):

      • Tương tự như apt nhưng dành cho hệ điều hành dựa trên RPM.

      • Ví dụ:

        • Cài đặt package httpd: yum: name=httpd state=present

        • Cập nhật tất cả packages: yum: name=* state=latest

    • dnf (Fedora/CentOS Stream):

      • Trình quản lý package mặc định trên các hệ điều hành mới của Fedora và CentOS.

      • Sử dụng tương tự như yum.

  • Quản lý Services:

    • service:

      • Khởi động, dừng, restart, enable/disable services.

      • Ví dụ:

        • Khởi động service nginx: service: name=nginx state=started

        • Dừng service mysqld: service: name=mysqld state=stopped

    • systemd:

      • Quản lý services sử dụng systemd (trình quản lý service mặc định trên hầu hết các bản phân phối Linux hiện đại).

      • Ví dụ:

        • Khởi động service docker: systemd: name=docker state=started

        • Enable service firewalld khi khởi động: systemd: name=firewalld enabled=yes

  • Quản lý Users & Groups:

    • user:

      • Tạo, xóa, sửa đổi users.

      • Ví dụ:

        • Tạo user john: user: name=john state=present shell=/bin/bash

        • Thêm user jane vào group sudo: user: name=jane groups=sudo append=yes state=present

    • group:

      • Tạo, xóa, sửa đổi groups.

      • Ví dụ:

        • Tạo group developers: group: name=developers state=present

        • Thêm user john vào group developers: group: name=developers state=present gid=1001 members=john

  • Quản lý Files & Directories:

    • file:

      • Tạo, xóa, sửa đổi files & directories.

      • Ví dụ:

        • Tạo file /etc/motd: file: path=/etc/motd state=touch mode=0644 owner=root group=root

        • Xóa directory /tmp/test: file: path=/tmp/test state=absent

    • copy:

      • Sao chép file từ Control Node đến Managed Nodes.

      • Ví dụ:

        • Sao chép file config.php từ Control Node đến /var/www/html: copy: src=config.php dest=/var/www/html/config.php
    • lineinfile:

      • Chèn hoặc sửa đổi dòng trong file.

      • Ví dụ:

        • Thêm dòng PermitRootLogin yes vào file /etc/ssh/sshd_config: lineinfile: path=/etc/ssh/sshd_config line="PermitRootLogin yes" state=present
  • Modules khác:

    • command: Thực thi command trên Managed Node, không sử dụng shell.

    • shell: Thực thi command trên Managed Node, sử dụng shell.

    • cron: Quản lý cron jobs.

    • get_url: Tải file từ URL.

    • unarchive: Giải nén file.

3. Modules nâng cao:

  • template:

    • Tạo file cấu hình động với Jinja2 templating engine.

    • Truyền biến từ Playbook vào template.

    • Ví dụ:

        - name: Configure Nginx virtual host
          template:
            src: templates/vhost.conf.j2
            dest: /etc/nginx/sites-available/mysite.conf
            owner: root
            group: root
            mode: 0644
          vars:
            domain_name: example.com
            server_name: www.example.com
      
  • blockinfile:

    • Chèn hoặc thay thế khối nội dung trong file.

    • Hỗ trợ nhiều options để định vị khối nội dung, kiểm soát indentation.

    • Ví dụ:

        - name: Add configuration block to sshd_config
          blockinfile:
            path: /etc/ssh/sshd_config
            block: |
              # Custom SSH settings
              Port 2222
              PermitRootLogin no
            create: yes
      
  • Sử dụng register để lưu trữ output:

    • register cho phép bạn lưu trữ kết quả trả về của một task (bao gồm cả output của Module) vào một biến.

    • Sử dụng biến này trong các tasks tiếp theo.

    • Ví dụ:

        - name: Get current date
          command: date +%Y-%m-%d
          register: current_date
      
        - name: Create directory with current date
          file:
            path: /tmp/backup/{{ current_date.stdout }}
            state: directory
            mode: 0755
      

4. Debug & xử lý lỗi:

  • Tăng Verbosity:

    • Sử dụng option v (hoặc vv, vvv) khi chạy Playbook để hiển thị output chi tiết hơn.
  • debug Module:

    • In giá trị của biến, debug logic trong Playbook.

    • Ví dụ:

        - name: Print debug message
          debug:
            msg: "The value of variable 'x' is {{ x }}"
      
  • Xử lý Lỗi:

    • ignore_errors: Bỏ qua lỗi của task và tiếp tục Playbook.

    • failed_when: Đánh dấu task là failed khi một điều kiện nào đó được thỏa mãn.

    • changed_when: Kiểm soát khi nào một task được đánh dấu là changed.

Bài tập:

  1. Thực hành Modules cơ bản:

    • Viết Playbook sử dụng apt để cài đặt nginx trên Ubuntu và yum để cài đặt httpd trên CentOS.

    • Sử dụng service hoặc systemd để đảm bảo nginxhttpd luôn chạy.

    • Tạo user webadmin và thêm vào group www-data trên Ubuntu, thêm vào group apache trên CentOS.

  2. Làm việc với Files & Templates:

  • Sao chép file cấu hình nginx.conf từ Control Node đến /etc/nginx/ trên Ubuntu.

  • Sử dụng template để tạo file cấu hình httpd.conf trên CentOS, truyền biến ServerName từ Playbook.

  • Sử dụng lineinfile để thêm dòng index index.php index.html vào file cấu hình nginx trên Ubuntu.

  1. Debug & Xử lý Lỗi:
  • Chạy Playbook với các options v, vv, vvv để xem output chi tiết.

  • Sử dụng debug module để in giá trị của các biến trong Playbook.

  • Thêm ignore_errors vào task có thể gặp lỗi để Playbook tiếp tục chạy.

Part 3: Playbooks & Roles

Mục tiêu:

  • Nắm vững cấu trúc và cách thức hoạt động của Playbook, từ hosts đến tasks, variables, handlers.

  • Viết Playbook với cấu trúc rõ ràng, dễ đọc, dễ hiểu, tuân thủ best practices.

  • Sử dụng thành thạo các tính năng nâng cao của Playbook: biến, điều kiện, lặp, tags, ...

  • Hiểu rõ khái niệm và lợi ích của Roles trong việc tổ chức và tái sử dụng Playbook.

  • Tự tin viết Roles với cấu trúc chuẩn, truyền tham số linh hoạt, và sử dụng Roles trong Playbook.

Nội dung chi tiết:

1. Playbooks:

  • Ad-hoc commands & Playbooks:

    • Ad-hoc commands phù hợp với các tác vụ đơn giản, nhanh chóng.

    • Khi cần thực hiện nhiều tasks phức tạp, Playbooks là giải pháp tối ưu.

    • Playbook cho phép bạn định nghĩa chuỗi các tasks, logic thực thi, và cấu hình cho Ansible.

  • Cấu trúc Playbook:

    • Playbooks được viết bằng YAML, một định dạng dữ liệu dễ đọc, dễ viết, dễ hiểu.

    • Cấu trúc cơ bản của Playbook:

      • hosts: Xác định Managed Nodes hoặc nhóm Managed Nodes sẽ thực thi Playbook.

      • tasks: Danh sách các tasks cần thực hiện trên Managed Nodes.

      • variables: Khai báo biến sử dụng trong Playbook.

      • handlers: Định nghĩa các tasks sẽ được thực thi khi có thay đổi từ các tasks khác.

    • Ví dụ Playbook đơn giản:

        ---
        - hosts: webservers
          tasks:
            - name: Install Nginx
              apt:
                name: nginx
                state: latest
            - name: Start Nginx
              service:
                name: nginx
                state: started
      
  • Phân tích chi tiết các thành phần:

    • hosts:

      • Có thể là một hostname, IP address, hoặc nhóm hosts được định nghĩa trong Inventory.

      • Hỗ trợ patterns để lựa chọn hosts linh hoạt (ví dụ: webservers, dbservers[0:2], all).

    • tasks:

      • Mỗi task là một công việc cần thực hiện trên Managed Node.

      • Mỗi task sử dụng một Module cụ thể để thực hiện công việc (ví dụ: apt, yum, service, user, ...).

      • Thực thi tuần tự từ trên xuống dưới.

    • variables:

      • Cho phép lưu trữ giá trị để sử dụng lại trong Playbook.

      • Khai báo biến sử dụng cú pháp {{ variable_name }}.

      • Ví dụ: {{ webserver_port }}, {{ db_password }}.

    • handlers:

      • Là các tasks đặc biệt, chỉ được thực thi khi có thay đổi từ các tasks khác.

      • Thường được sử dụng để restart service sau khi cấu hình.

      • Được trigger bởi notify directive trong tasks.

  • Thực thi Playbook:

    • Lệnh: ansible-playbook <playbook_name>.yml.

    • Kết nối đến Managed Nodes, sao chép modules, thực thi tasks, và hiển thị kết quả.

2. Biến, điều kiện, lặp:

  • Variable:

    • Các loại biến:

      • Facts: Thông tin thu thập từ Managed Nodes (ví dụ: hệ điều hành, IP address, CPU, RAM).

      • Variables: Khai báo trực tiếp trong Playbook hoặc file variables.

      • Registered variables: Lưu trữ output của tasks.

      • Extra vars: Truyền biến từ command line.

    • Phạm vi và thứ tự ưu tiên:

      • Global: Áp dụng cho tất cả Playbooks.

      • Playbook: Áp dụng cho Playbook hiện tại.

      • Inventory: Áp dụng cho host hoặc nhóm hosts trong Inventory.

      • Role: Áp dụng cho Role cụ thể.

    • Sử dụng biến:

      • Truy cập giá trị biến: {{ variable_name }}.

      • Truyền biến từ command line: ansible-playbook my_playbook.yml -e "variable1=value1 variable2=value2".

  • Điều kiện (when):

    • Thực thi task chỉ khi một điều kiện nào đó được thỏa mãn.

    • Sử dụng toán tử so sánh, toán tử logic, kiểm tra giá trị biến, ...

    • Ví dụ:

        - name: Install Apache only on CentOS
          yum:
            name: httpd
            state: latest
          when: ansible_distribution == 'CentOS'
      
  • Lặp (loop):

    • Thực hiện một task nhiều lần với dữ liệu khác nhau.

    • Sử dụng với danh sách, dictionaries.

    • Ví dụ: Tạo nhiều users từ danh sách:

        - name: Create multiple users
          user:
            name: "{{ item.username }}"
            state: present
            groups: "{{ item.groups }}"
          loop:
            - { username: 'john', groups: 'wheel' }
            - { username: 'jane', groups: 'users' }
      

3. Roles:

  • Từ Playbook dài dòng đến Roles gọn gàng:

    • Khi Playbook trở nên phức tạp, việc quản lý và tái sử dụng code trở nên khó khăn.

    • Roles ra đời để giải quyết vấn đề này, giúp chia nhỏ Playbook thành các module nhỏ hơn, có thể tái sử dụng.

  • Lợi ích của Roles:

    • Modularity: Chia nhỏ Playbook thành các thành phần độc lập.

    • Reusability: Sử dụng lại Roles trong nhiều Playbooks khác nhau.

    • Maintainability: Dễ dàng quản lý, bảo trì và cập nhật code.

  • Cấu trúc thư mục của Role:

    • tasks/: Chứa các tasks của Role.

    • handlers/: Chứa các handlers của Role.

    • defaults/: Chứa các giá trị mặc định cho biến.

    • vars/: Chứa các biến của Role.

    • files/: Chứa các files sẽ được sao chép đến Managed Nodes.

    • templates/: Chứa các templates.

    • meta/: Chứa metadata của Role (ví dụ: dependencies).

  • Sử dụng Roles trong Playbook:

    • Sử dụng roles directive trong Playbook để gọi Role.

    • Ví dụ:

        - hosts: webservers
          roles:
            - role: nginx
      
  • Truyền tham số cho Roles:

    • Sử dụng vars trong roles directive.

    • Ví dụ:

        - hosts: webservers
          roles:
            - role: nginx
              vars:
                nginx_version: 1.20.1
      

Bài tập:

  1. Viết Playbook với biến, điều kiện, lặp:

    • Tạo Playbook cài đặt nginx trên Ubuntu và httpd trên CentOS, sử dụng biến webserver_package để lưu trữ tên package.

    • Sử dụng when để chỉ cài đặt package khi biến install_webserver có giá trị true.

    • Sử dụng loop để tạo nhiều virtual hosts cho nginxhttpd từ danh sách.

  2. Chuyển đổi Playbook thành Role:

    • Chuyển đổi Playbook ở bài tập 1 thành Role webserver.

    • Tạo các biến webserver_type (nginx hoặc httpd) và virtual_hosts (danh sách virtual hosts).

    • Viết Playbook sử dụng Role webserver để cài đặt và cấu hình web server trên Ubuntu và CentOS.

  3. Tìm hiểu và sử dụng Roles từ Ansible Galaxy:

    • Tìm kiếm Role geerlingguy.nginx trên Ansible Galaxy.

    • Viết Playbook sử dụng Role này để cài đặt và cấu hình nginx trên Ubuntu.

    • Tham khảo tài liệu của Role để tìm hiểu cách truyền tham số và cấu hình.

Part 4: Bảo mật và quản lý mật khẩu

Mục tiêu:

  • Nhận thức rõ tầm quan trọng của bảo mật khi làm việc với Ansible.

  • Hiểu rõ cách thức hoạt động và sử dụng thành thạo Ansible Vault để bảo mật thông tin nhạy cảm.

  • Áp dụng các kỹ thuật quản lý mật khẩu an toàn, bảo vệ Playbook và dữ liệu nhạy cảm.

  • Sử dụng kết nối SSH nâng cao để tăng cường bảo mật cho Ansible.

  • Làm quen với các modules quản lý mạng để thiết lập tường lửa và kiểm soát truy cập.

Nội dung chi tiết:

1. Bảo mật Ansible:

  • Rủi ro tiềm ẩn khi không chú trọng bảo mật:

    • Playbooks và roles có thể chứa thông tin nhạy cảm: mật khẩu, API keys, credentials.

    • Nếu không được bảo vệ, thông tin này có thể bị lộ, gây ra rủi ro bảo mật nghiêm trọng.

  • Các phương pháp bảo mật Ansible:

    • Ansible Vault: Mã hóa files và biến chứa thông tin nhạy cảm.

    • Quản lý mật khẩu an toàn: Không lưu trữ mật khẩu trực tiếp trong Playbook, sử dụng vault hoặc các công cụ quản lý mật khẩu chuyên dụng.

    • SSH key-based authentication: Sử dụng SSH keys thay vì mật khẩu để kết nối đến Managed Nodes.

    • Firewall: Cấu hình firewall để giới hạn truy cập đến Control Node và Managed Nodes.

  • Best practices bảo mật Ansible:

    • Không bao giờ lưu trữ thông tin nhạy cảm trực tiếp trong Playbook.

    • Luôn sử dụng Ansible Vault để bảo vệ thông tin nhạy cảm.

    • Sử dụng SSH keys thay vì mật khẩu.

    • Giới hạn truy cập đến Control Node và Managed Nodes.

    • Thường xuyên cập nhật Ansible và các modules lên phiên bản mới nhất.

2. Ansible Vault:

  • Cơ chế hoạt động:

    • Ansible Vault sử dụng thuật toán mã hóa mạnh mẽ (AES256) để mã hóa files và biến.

    • Cần cung cấp mật khẩu để mã hóa và giải mã dữ liệu.

    • Dữ liệu được mã hóa không thể đọc được nếu không có mật khẩu.

  • Mã hóa và giải mã files:

    • Mã hóa file: ansible-vault encrypt <file_path>.

    • Giải mã file: ansible-vault decrypt <file_path>.

    • Xem nội dung file đã mã hóa: ansible-vault view <file_path>.

  • Sử dụng biến được mã hóa trong Playbook:

    • Khai báo biến trong file YAML và mã hóa bằng Ansible Vault.

    • Sử dụng !vault tag để đánh dấu biến được mã hóa.

    • Ansible sẽ tự động giải mã biến khi chạy Playbook.

    • Ví dụ:

        ---
        secret_key: !vault |
          -----BEGIN VAULT ENCRYPTED STRING-----
          version: 1.1
          # ... (nội dung đã mã hóa) ...
          -----END VAULT ENCRYPTED STRING-----
      
  • Quản lý mật khẩu Vault:

    • Nhập mật khẩu từ command line: Ansible sẽ nhắc nhập mật khẩu khi chạy Playbook.

    • Sử dụng Vault password file: Lưu trữ mật khẩu trong file và truyền cho Ansible.

    • Environment variable: Lưu trữ mật khẩu trong biến môi trường ANSIBLE_VAULT_PASSWORD_FILE.

  • Khuyến nghị bảo mật khi sử dụng Vault:

    • Sử dụng mật khẩu mạnh và không trùng lặp.

    • Không lưu trữ mật khẩu cùng với Playbook.

    • Phân quyền truy cập chặt chẽ cho Vault password file.

    • Thay đổi mật khẩu định kỳ.

3. Quản lý mật khẩu an toàn:

  • Không bao giờ lưu trữ mật khẩu trực tiếp trong Playbook!

  • Các giải pháp thay thế:

    • Ansible Vault: Giải pháp đơn giản, tích hợp sẵn trong Ansible.

    • Hệ thống quản lý mật khẩu chuyên dụng (Vault): HashiCorp Vault, AWS Secrets Manager, Azure Key Vault.

      • Lợi ích: Quản lý tập trung, kiểm soát truy cập chi tiết, lưu trữ audit logs.
  • Sử dụng lookup plugins để truy cập secrets từ Vault:

    • lookup plugins cho phép truy xuất dữ liệu từ các nguồn khác nhau, bao gồm cả Vault.

    • Ví dụ: Sử dụng hashi_vault plugin để lấy secret từ HashiCorp Vault:

        - name: Get database password from Vault
          debug:
            msg: "Database password: {{ lookup('hashi_vault', 'secret/data/database password') }}"
      

4. Kết nối SSH:

  • SSH key-based authentication:

    • Tạo cặp SSH key trên Control Node.

    • Sao chép public key đến Managed Nodes.

    • Cấu hình Ansible sử dụng SSH key để kết nối (trong ansible.cfg hoặc command line).

    • Lợi ích: Bảo mật hơn mật khẩu, không cần nhập mật khẩu khi chạy Playbook.

  • SSH config file:

    • Tạo file ~/.ssh/config để lưu trữ cấu hình SSH cho từng host.

    • Ví dụ:

        Host webserver1
          HostName 192.168.1.100
          User ubuntu
          IdentityFile ~/.ssh/id_rsa_webserver1
      
        Host dbserver1
          HostName 192.168.1.200
          User centos
          IdentityFile ~/.ssh/id_rsa_dbserver1
      
  • Jump host:

    • Sử dụng một máy chủ trung gian (jump host) để kết nối đến Managed Nodes trong mạng riêng.

    • Cấu hình jump host trong ansible.cfg hoặc SSH config file.

    • Lợi ích: Tăng cường bảo mật, chỉ cần mở cổng SSH trên jump host.

5. Modules mạng & tường lửa:

  • net_firewall_rule: Quản lý firewall rules trên Linux (iptables, firewalld, ufw).

    • Ví dụ: Mở port 80 và 443 trên CentOS sử dụng firewalld:

        - name: Allow HTTP and HTTPS traffic
          net_firewall_rule:
            zone: public
            service: [http, https]
            permanent: yes
            state: enabled
      
  • net_hostname: Thay đổi hostname của Managed Node.

  • net_interface: Cấu hình network interface.

  • Các modules khác: Ansible cung cấp nhiều modules khác để quản lý mạng, tham khảo tài liệu để biết thêm chi tiết.

Bài tập:

  1. Bảo mật Playbook với Ansible Vault:

    • Tạo file vault_vars.yml chứa biến db_password và mã hóa bằng Ansible Vault.

    • Viết Playbook sử dụng biến db_password từ file vault_vars.yml để tạo user database.

  2. Sử dụng SSH key-based authentication:

  • Tạo cặp SSH key trên Control Node.

  • Sao chép public key đến Managed Nodes.

  • Cấu hình Ansible sử dụng SSH key để kết nối.

  • Chạy lại Playbook ở bài tập 1 và xác nhận không cần nhập mật khẩu.

  1. Cấu hình firewall:

    • Sử dụng module net_firewall_rule để mở các ports cần thiết (ví dụ: 22, 80, 443) trên Managed Nodes.

    • Kiểm tra kết quả bằng cách thử truy cập vào các ports này từ máy trạm.

Part 5: Tối ưu hóa và nâng cao hiệu suất

Mục tiêu:

  • Hiểu rõ các yếu tố ảnh hưởng đến tốc độ và hiệu suất của Ansible.

  • Sử dụng thành thạo các kỹ thuật tối ưu hóa: kiểm soát chiến lược thực thi, sử dụng handlers hiệu quả, ...

  • Nâng cao khả năng kiểm soát luồng thực thi của Playbook: điều khiển trạng thái task, xử lý lỗi linh hoạt.

  • Áp dụng các "tuyệt chiêu" để tối ưu Playbook cho môi trường lớn, đảm bảo tốc độ và sự ổn định.

Nội dung chi tiết:

1. Chiến lược Thực thi:

  • Thực thi song song:

    • Ansible mặc định thực thi tasks song song trên nhiều hosts, tăng tốc độ triển khai.

    • Số lượng forks (kết nối song song) được cấu hình bởi forks trong ansible.cfg (mặc định là 5).

  • Kiểm soát song song với serial:

    • serial cho phép bạn chia nhỏ số lượng hosts thực thi đồng thời, phù hợp với tác vụ cần cẩn trọng hoặc tài nguyên hạn chế.

    • Ví dụ: Cập nhật firmware cho 100 thiết bị, chỉ cho phép 10 thiết bị cập nhật đồng thời:

        - hosts: network_devices
          serial: 10
          tasks:
            - name: Update firmware
              # ...
      
  • strategy:

    • linear (mặc định): Thực thi tasks tuần tự trên từng batch hosts.

    • free: Thực thi tasks trên các hosts "rảnh rỗi" nhất, tối ưu hóa tốc độ cho môi trường không đồng nhất.

    • Ví dụ: Sử dụng free strategy:

        - hosts: all
          strategy: free
          tasks:
            - name: Install software
              # ...
      

2. Handlers & Notify:

  • Handlers:

    • Tasks đặc biệt, chỉ được thực thi khi có thay đổi từ các tasks khác.

    • Thường được sử dụng để restart services, reload configurations.

    • Đảm bảo idempotency: chỉ thực thi khi cần thiết.

  • notify :

    • Sử dụng notify trong task để trigger handler tương ứng.

    • Ví dụ: Restart nginx sau khi thay đổi cấu hình:

        - name: Update Nginx configuration
          # ...
          notify: restart nginx
      
        handlers:
          - name: restart nginx
            service:
              name: nginx
              state: restarted
      
  • Tối ưu hóa handlers:

    • Chỉ định handlers ở cấp Playbook để tránh lặp lại trong nhiều tasks.

    • Sử dụng listenflush_handlers để kiểm soát handlers linh hoạt hơn.

3. Flow Control:

  • failed_whenchanged_when:

    • failed_when: Đánh dấu task là failed khi một điều kiện nào đó được thỏa mãn.

    • changed_when: Kiểm soát khi nào một task được đánh dấu là changed.

    • Ví dụ:

        - name: Check if website is up
          uri:
            url: <https://example.com>
          register: website_status
          failed_when: website_status.status_code != 200
      
        - name: Send alert if website is down
          # ...
          when: website_status is failed
      
  • block, rescue, always :

    • block: Nhóm các tasks lại với nhau.

    • rescue: Thực thi tasks khi có lỗi xảy ra trong block.

    • always: Luôn thực thi tasks, dù block thành công hay thất bại.

    • Ví dụ:

        - name: Install and configure database
          block:
            - name: Install MySQL
              # ...
            - name: Configure MySQL
              # ...
          rescue:
            - name: Rollback database installation
              # ...
          always:
            - name: Send notification
              # ...
      

4. Xử lý lỗi

  • max_fail_percentage :

    • Dừng Playbook khi tỉ lệ hosts bị lỗi vượt quá ngưỡng cho phép.

    • Ví dụ: Dừng Playbook nếu có hơn 20% hosts bị lỗi:

        - hosts: all
          max_fail_percentage: 20
          tasks:
            - name: Install software
              # ...
      
  • any_errors_fatal :

    • Dừng Playbook ngay khi có bất kỳ lỗi nào xảy ra.

    • Phù hợp với tác vụ cần tính chính xác tuyệt đối.

  • delegate_to

    • Chạy task trên một host khác, không phải host được chỉ định trong hosts.

    • Ví dụ: Chạy task trên Control Node để generate config file:

        - name: Generate config file on control node
          template:
            # ...
          delegate_to: localhost
      

Bài tập:

  1. Thực hành serialstrategy:

    • Tạo 10 máy ảo (sử dụng Vagrant hoặc Docker) và thêm vào Ansible Inventory.

    • Viết Playbook cài đặt một phần mềm trên 10 máy ảo này, sử dụng serial để kiểm soát số lượng hosts thực thi đồng thời (ví dụ: serial: 2).

    • Thực hiện benchmark và so sánh tốc độ thực thi với các giá trị serial khác nhau (1, 2, 5, 10).

    • Thay đổi strategy thành free và so sánh tốc độ thực thi.

  2. Tối ưu hóa handlers:

    • Viết Playbook cấu hình nginx và sử dụng handler để restart nginx sau mỗi lần thay đổi cấu hình.

    • Chạy Playbook nhiều lần và quan sát số lần handler được thực thi.

    • Tối ưu hóa Playbook bằng cách chỉ định handler ở cấp Playbook và sử dụng notify trong các tasks.

  3. Kiểm soát luồng thực thi và xử lý lỗi:

    • Viết Playbook với các tasks có thể gặp lỗi (ví dụ: kết nối đến database, tải file từ URL không tồn tại).

    • Sử dụng failed_when hoặc changed_when để kiểm soát trạng thái task dựa trên kết quả của task trước đó.

    • Sử dụng block, rescue, always để xử lý lỗi và đảm bảo Playbook tiếp tục chạy cho đến khi hoàn thành.

Part 6: Mở rộng Ansible với Galaxy và Collections

Mục tiêu:

  • Ansible Galaxy: tìm kiếm, tải xuống và sử dụng hàng ngàn Roles và Collections từ cộng đồng.

  • Nắm vững cách thức đóng góp cho cộng đồng: tạo, đóng gói và xuất bản Roles và Collections của riêng bạn lên Ansible Galaxy.

  • Phát triển kỹ năng tái sử dụng code, tận dụng sức mạnh cộng đồng để tối ưu hóa và đẩy nhanh quá trình tự động hóa.

Nội dung chi tiết:

1. Ansible Galaxy:

  • Giới thiệu Ansible Galaxy:

    • Là kho lưu trữ trực tuyến (online repository) khổng lồ cho Ansible content.

    • Cung cấp hàng ngàn Roles và Collections được phát triển bởi cộng đồng và các nhà cung cấp (vendors) uy tín.

    • Miễn phí sử dụng, giúp bạn tiết kiệm thời gian và công sức khi tự động hóa.

  • Tìm kiếm resources trên Galaxy:

    • Truy cập website: https://galaxy.ansible.com/

    • Sử dụng thanh tìm kiếm để tìm Roles và Collections theo tên, từ khóa, tác giả, ...

    • Lọc kết quả theo nhiều tiêu chí: số lượt tải xuống, đánh giá, phiên bản Ansible tương thích.

  • Tải xuống và sử dụng Roles:

    • ansible-galaxy CLI: Công cụ dòng lệnh để tương tác với Ansible Galaxy.

      • Cài đặt Role: ansible-galaxy install username.role_name.

      • Cập nhật Role: ansible-galaxy update username.role_name.

      • Gỡ bỏ Role: ansible-galaxy remove username.role_name.

    • requirements.yml file: Quản lý dependencies (Roles cần thiết) cho Playbook.

      • Liệt kê các Roles cần thiết với phiên bản cụ thể.

      • Cài đặt Roles từ requirements.yml: ansible-galaxy collection install -r requirements.yml.

    • Ví dụ: Cài đặt Role geerlingguy.nginx:

        ansible-galaxy install geerlingguy.nginx
      
  • Khám phá Roles phổ biến:

    • geerlingguy.nginx: Cài đặt và cấu hình Nginx web server.

    • geerlingguy.mysql: Cài đặt và cấu hình MySQL database server.

    • geerlingguy.postgresql: Cài đặt và cấu hình PostgreSQL database server.

    • ansible.posix.ssh_config: Quản lý SSH config file.

    • ... và hàng ngàn Roles khác cho mọi nhu cầu!

2. Tạo và publish Roles:

  • Cấu trúc thư mục Role:

    • Giữ nguyên cấu trúc thư mục như phần Roles trước đó.

    • Thêm file README.md để mô tả Role chi tiết: chức năng, cách sử dụng, tham số, ví dụ.

    • Thêm file meta/main.yml để cung cấp metadata cho Role: tên, phiên bản, tác giả, dependencies.

  • Best practices khi viết Roles:

    • Idempotency: Đảm bảo Role có thể chạy nhiều lần mà không gây ra side effects.

    • Modularity: Chia nhỏ Role thành các tasks, handlers, templates rõ ràng.

    • Documentation: Viết tài liệu chi tiết, dễ hiểu, giúp người khác dễ dàng sử dụng Role.

    • Testing: Kiểm thử Role kỹ lưỡng trước khi chia sẻ.

  • Publish Role lên Ansible Galaxy:

    • Tạo tài khoản trên Ansible Galaxy.

    • Tạo new repository trên Galaxy và push code Role lên.

    • Ansible Galaxy sẽ tự động build và publish Role của bạn.

  • Share Roles:

    • Chia sẻ Role trên các diễn đàn, blog, mạng xã hội.

    • Yêu cầu cộng đồng đóng góp, báo cáo lỗi, đánh giá Role của bạn.

3. Ansible Collections:

  • Roles & Collections:

    • Roles giúp tổ chức code tốt hơn, nhưng vẫn còn limitations khi muốn đóng gói nhiều Roles, Modules, Plugins liên quan.

    • Collections ra đời như một giải pháp "cao cấp" hơn, đóng gói toàn bộ "hệ sinh thái" Ansible content.

  • Giới thiệu về Collections:

    • Là một bộ sưu tập (collection) các Roles, Modules, Plugins, Playbooks có liên quan đến nhau.

    • Giúp tổ chức code tốt hơn, dễ dàng chia sẻ và sử dụng lại.

    • Đang dần thay thế Roles như đơn vị đóng gói chính thức của Ansible.

  • Cấu trúc thư mục Collection:

    • roles/: Chứa các Roles.

    • modules/: Chứa các Modules.

    • plugins/: Chứa các Plugins.

    • playbooks/: Chứa các Playbooks ví dụ.

    • docs/: Chứa tài liệu.

  • Sử dụng Collections:

    • Cài đặt Collection từ Galaxy: ansible-galaxy collection install username.collection_name.

    • Sử dụng content từ Collection: username.collection_name.content_name (ví dụ: my_company.webserver.nginx_install).

  • Tạo và Chia sẻ Collections:

    • Tương tự như tạo Roles, nhưng cần chú ý đến cấu trúc thư mục và metadata.

    • Xuất bản Collection lên Ansible Galaxy để chia sẻ với cộng đồng.

Bài tập:

  1. Khám phá Ansible Galaxy:

    • Tìm kiếm 3 Roles liên quan đến công việc của bạn (ví dụ: cài đặt database, cấu hình web server, quản lý users).

    • Đọc tài liệu và thử nghiệm cài đặt, sử dụng các Roles này trong Playbook của bạn.

  2. Tạo và xuất bản Role:

  • Chọn một tác vụ bạn thường xuyên thực hiện (ví dụ: cài đặt và cấu hình một ứng dụng cụ thể).

  • Tạo Role để tự động hóa tác vụ này, viết tài liệu chi tiết, và xuất bản lên Ansible Galaxy.

  1. Tìm hiểu về Collections:
  • Tìm kiếm 2 Collections trên Ansible Galaxy và đọc tài liệu để hiểu rõ cách chúng được tổ chức và sử dụng.

  • Thử nghiệm cài đặt và sử dụng một số content từ Collections này trong Playbook của bạn.

Part 7: Ứng dụng thực tế và hướng phát triển

Nội dung chi tiết:

1. Dự án hoàn chỉnh:

  • Dự án: Triển khai ứng dụng web với Load Balancing và Database Server.

  • Mô tả: Bạn sẽ xây dựng Playbook để tự động hóa toàn bộ quá trình:

    • Cài đặt và cấu hình Web Server (Nginx/Apache) trên nhiều máy chủ.

    • Cài đặt và cấu hình Load Balancer (HAProxy/Nginx) để phân phối traffic.

    • Cài đặt và cấu hình Database Server (MySQL/PostgreSQL).

    • Triển khai ứng dụng web lên Web Servers.

    • Cấu hình Firewall và bảo mật cho hệ thống.

  • Hướng dẫn thực hiện:

    1. Chuẩn bị môi trường:

      • Tạo 3 máy ảo (hoặc cloud instances): 1 Load Balancer, 2 Web Servers, 1 Database Server.

      • Cấu hình SSH key-based authentication từ máy trạm đến các máy ảo.

      • Tạo Ansible Inventory và thêm các máy ảo vào.

    2. Viết Playbook:

      • Sử dụng Roles để tổ chức Playbook: loadbalancer, webserver, database.

      • Sử dụng variables để cấu hình linh hoạt: IP addresses, hostnames, ...

      • Áp dụng các kỹ thuật đã học: handlers, templates, loops, ...

    3. Thực thi và kiểm tra:

      • Chạy Playbook để triển khai ứng dụng.

      • Kiểm tra kết quả bằng cách truy cập ứng dụng web từ trình duyệt.

      • Thực hiện các bài kiểm tra bảo mật cơ bản.

2. Tích Hợp Ansible:

  • Ansible trong CI/CD Pipeline:

    • Tích hợp Ansible với các công cụ CI/CD phổ biến: Jenkins, GitLab CI/CD, ...

    • Tự động hóa quá trình build, test, và deploy ứng dụng.

    • Ví dụ:

      • Khi code được push lên Git repository, CI/CD pipeline sẽ:

        • Build ứng dụng.

        • Chạy các bài test tự động.

        • Sử dụng Ansible để deploy ứng dụng lên môi trường staging hoặc production.

  • Sử dụng Ansible trong môi trường Production:

    • Quản lý cấu hình: Đảm bảo tính nhất quán cho cơ sở hạ tầng production.

    • Triển khai ứng dụng: Tự động hóa quá trình deploy và rollback.

    • Khắc phục sự cố: Sử dụng Playbook để tự động hóa các tác vụ sửa lỗi.

3. Tự nghiên cứu:

4. Báo cáo dự án & trình bày:

  • Format báo cáo:

    • Giới thiệu: Mô tả dự án, mục tiêu, đối tượng hướng đến.

    • Phân tích yêu cầu: Liệt kê các yêu cầu kỹ thuật, công nghệ sử dụng.

    • Thiết kế: Mô tả kiến trúc hệ thống, sơ đồ mạng, ...

    • Thực hiện: Giải thích chi tiết Playbook, Roles, Modules, ...

    • Kết quả: Minh họa kết quả đạt được, ảnh chụp màn hình, ...

    • Bài học kinh nghiệm: Rút ra bài học từ quá trình thực hiện dự án.

  • Trình bày:

    • Chuẩn bị slide trình bày ngắn gọn, súc tích, dễ hiểu.

    • Demo dự án hoạt động.

    • Trả lời câu hỏi từ người nghe.

Một số nội dung bổ sung: Khám phá kiến thức chuyên sâu về cloud & network automation

Cloud automation:

  1. Nền tảng cloud:

    • Kiến trúc cloud: Nắm rõ khái niệm IaaS, PaaS, SaaS, các thành phần cơ bản của một nền tảng Cloud.

    • Các dịch vụ cloud: Tìm hiểu sâu về các dịch vụ phổ biến: tính năng, giá cả, trường hợp sử dụng.

      • Compute: EC2 (AWS), Virtual Machines (Azure), Compute Engine (GCP).

      • Storage: S3 (AWS), Blob Storage (Azure), Cloud Storage (GCP).

      • Network: VPC (AWS), Virtual Network (Azure), VPC Network (GCP).

      • Database: RDS (AWS), Azure SQL Database, Cloud SQL (GCP).

  2. Ansible cho cloud:

    • Modules chuyên dụng: Các modules cho AWS, Azure, GCP, và các Cloud providers khác.

    • Dynamic Inventory: Sử dụng dynamic inventory để tự động cập nhật danh sách cloud instances.

    • Cloud-init: Tự động hóa cấu hình cloud instances khi khởi tạo.

  3. Ứng dụng cho cloud:

    • Infrastructure as Code (IaC): Sử dụng Ansible (kết hợp với Terraform) để định nghĩa toàn bộ hạ tầng Cloud dưới dạng code.

    • Microservices: Tự động hóa triển khai và quản lý ứng dụng microservices trên Cloud.

    • Containers & Orchestration: Kết hợp Ansible với Docker, Kubernetes để triển khai ứng dụng containerized trên Cloud.

  4. Bảo mật cho môi trường cloud:

    • IAM (Identity and Access Management): Quản lý quyền truy cập đến tài nguyên Cloud.

    • Security Groups & Firewalls: Cấu hình tường lửa cho cloud instances và networks.

    • Secrets Management: Lưu trữ và quản lý bí mật an toàn trên Cloud.

  5. Chủ đề dự án thực tế tham khảo:

    • Triển khai ứng dụng web đa tầng trên AWS, Azure hoặc GCP.

    • Tự động hóa việc tạo và quản lý môi trường development, staging, production trên Cloud.

    • Xây dựng CI/CD pipeline cho ứng dụng Cloud, tích hợp Ansible vào quy trình deploy.

Network automation:

  1. Network automation:

    • NetDevOps: Tìm hiểu về NetDevOps và cách Ansible hỗ trợ tự động hóa mạng.

    • Network as Code: Định nghĩa cấu hình mạng dưới dạng code, sử dụng Git để quản lý version.

  2. Thiết bị mạng:

    • CLI (Command Line Interface): Nắm vững cú pháp CLI của các thiết bị mạng phổ biến: Cisco IOS, Juniper Junos, Arista EOS.

    • Data Models (YANG): Tìm hiểu về YANG data models, cơ sở cho Network Automation hiện đại.

  3. Ansible cho network:

    • Modules chuyên dụng: Sử dụng các modules cho Cisco, Juniper, Arista, và các nhà cung cấp khác.

    • Network modules: net_interface, net_vlan, net_l2_interface, net_bgp, net_facts, ...

  4. Kiến trúc mạng hiện đại:

    • SDN (Software-Defined Networking): Tìm hiểu về SDN và cách Ansible tích hợp với các controller SDN.

    • Network Virtualization (VXLAN, SD-WAN): Tự động hóa việc cấu hình và quản lý mạng ảo.

  5. Một số nội dung thực hành tham khảo:

    • Cấu hình VLAN, STP, EtherChannel trên switch Cisco sử dụng Ansible.

    • Cấu hình routing protocols (RIP, OSPF, BGP) trên router Cisco sử dụng Ansible.

    • Tự động hóa việc backup và restore cấu hình thiết bị mạng.

Luyện kỹ năng thêm:

  • Khả năng giải quyết vấn đề: Debug Playbook, phân tích log, tìm kiếm giải pháp cho các vấn đề phức tạp.

  • Làm việc với Git: Quản lý code Ansible bằng Git, sử dụng branching, merging, ...

Bài hướng dẫn chi tiết:

https://mydevopslearning.notion.site/Ansible-c-b-n-80ae212032d144359793f62b71d1ee9d