Ansible là một công cụ tự động hóa mã nguồn mở mạnh mẽ, giúp bạn quản lý và cấu hình các máy chủ, triển khai ứng dụng và tự động hóa các tác vụ phức tạp một cách dễ dàng. Trong bài viết này, chúng ta sẽ cùng nhau Viết Playbook Ansible đầu Tiên, một bước quan trọng để làm chủ công cụ này. Đừng lo lắng nếu bạn là người mới bắt đầu, chúng tôi sẽ hướng dẫn bạn từng bước một cách chi tiết và dễ hiểu nhất.
Ansible Playbook là gì? Tại sao cần viết Playbook Ansible?
Ansible Playbook là một tệp YAML chứa danh sách các tác vụ mà Ansible sẽ thực hiện trên các máy chủ đích. Nó giống như một kịch bản hướng dẫn Ansible thực hiện các công việc bạn muốn.
Vậy tại sao cần viết Playbook Ansible?
- Tự động hóa: Playbook giúp bạn tự động hóa các tác vụ lặp đi lặp lại, tiết kiệm thời gian và công sức. Thay vì phải thực hiện thủ công trên từng máy chủ, bạn chỉ cần chạy playbook một lần.
- Quản lý cấu hình: Playbook giúp bạn đảm bảo rằng tất cả các máy chủ của bạn có cấu hình đồng nhất. Bạn có thể sử dụng playbook để cài đặt phần mềm, cấu hình hệ thống và đảm bảo rằng tất cả các máy chủ đều tuân thủ các tiêu chuẩn của bạn.
- Triển khai ứng dụng: Playbook giúp bạn triển khai ứng dụng một cách nhanh chóng và dễ dàng. Bạn có thể sử dụng playbook để sao chép tệp, cài đặt thư viện và khởi động ứng dụng của bạn.
- Tính nhất quán và độ tin cậy: Playbook đảm bảo rằng các tác vụ được thực hiện theo cùng một cách mỗi lần, giảm thiểu rủi ro sai sót do con người. Điều này đặc biệt quan trọng trong môi trường sản xuất.
- Dễ dàng chia sẻ và tái sử dụng: Playbook được viết bằng YAML, một định dạng dễ đọc và dễ hiểu. Bạn có thể dễ dàng chia sẻ playbook của mình với đồng nghiệp và tái sử dụng chúng cho các dự án khác nhau.
“Việc làm chủ Ansible Playbook là chìa khóa để tự động hóa quy trình làm việc của bạn, giúp bạn tập trung vào những nhiệm vụ quan trọng hơn,” anh Nguyễn Văn Tùng, kỹ sư DevOps tại một công ty công nghệ lớn, chia sẻ. “Hãy bắt đầu từ những playbook đơn giản và dần dần nâng cao kỹ năng của bạn.”
Chuẩn bị trước khi viết Playbook Ansible đầu tiên
Trước khi bắt đầu viết playbook Ansible đầu tiên, bạn cần đảm bảo rằng bạn đã cài đặt Ansible và cấu hình kết nối đến các máy chủ đích. Dưới đây là các bước chuẩn bị:
-
Cài đặt Ansible:
-
Trên Ubuntu/Debian:
sudo apt update sudo apt install software-properties-common sudo apt-add-repository --yes --update ppa:ansible/ansible sudo apt install ansible
-
Trên CentOS/RHEL:
sudo yum install epel-release sudo yum install ansible
-
Trên macOS:
brew install ansible
-
-
Cấu hình tệp Inventory: Tệp inventory chứa danh sách các máy chủ mà Ansible sẽ quản lý. Mở tệp
/etc/ansible/hosts
(hoặc tệp inventory tùy chỉnh của bạn) và thêm thông tin về các máy chủ của bạn. Ví dụ:[webservers] webserver1 ansible_host=192.168.1.10 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa webserver2 ansible_host=192.168.1.11 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa [databases] dbserver1 ansible_host=192.168.1.20 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_host
: Địa chỉ IP hoặc tên miền của máy chủ.ansible_user
: Tên người dùng để kết nối SSH.ansible_ssh_private_key_file
: Đường dẫn đến tệp khóa SSH riêng tư.
-
Kiểm tra kết nối: Sử dụng lệnh
ansible all -m ping
để kiểm tra kết nối đến tất cả các máy chủ trong tệp inventory.ansible all -m ping
Nếu kết nối thành công, bạn sẽ thấy kết quả tương tự như sau:
webserver1 | SUCCESS => { "changed": false, "ping": "pong" } webserver2 | SUCCESS => { "changed": false, "ping": "pong" } dbserver1 | SUCCESS => { "changed": false, "ping": "pong" }
Nếu bạn gặp lỗi, hãy kiểm tra lại cấu hình SSH và tệp inventory của bạn.
Cấu trúc cơ bản của một Playbook Ansible
Một playbook Ansible cơ bản bao gồm các thành phần sau:
---
: Dấu phân cách YAML, cho biết bắt đầu của một tài liệu YAML.name
: Mô tả ngắn gọn về mục đích của playbook.hosts
: Chỉ định các máy chủ hoặc nhóm máy chủ mà playbook sẽ chạy trên đó.become
: Cho phép thực hiện các tác vụ với quyền sudo (quyền quản trị).tasks
: Danh sách các tác vụ mà playbook sẽ thực hiện. Mỗi tác vụ bao gồm:name
: Mô tả ngắn gọn về tác vụ.module
: Module Ansible sẽ được sử dụng để thực hiện tác vụ (ví dụ:apt
,yum
,copy
,service
, v.v.).args
: Các tham số cho module.
Ví dụ:
---
- name: Cài đặt và khởi động Nginx
hosts: webservers
become: true
tasks:
- name: Cài đặt Nginx
apt:
name: nginx
state: present
- name: Khởi động Nginx
service:
name: nginx
state: started
Viết Playbook Ansible Đầu Tiên: Cài đặt Nginx
Bây giờ, chúng ta sẽ cùng nhau viết playbook Ansible đầu tiên để cài đặt Nginx trên các máy chủ web của bạn.
-
Tạo tệp Playbook: Tạo một tệp mới với tên
install_nginx.yml
(hoặc bất kỳ tên nào bạn thích) và mở nó bằng trình soạn thảo văn bản. -
Thêm dấu phân cách YAML: Thêm
---
vào đầu tệp. -
Thêm thông tin cơ bản: Thêm
name
,hosts
, vàbecome
vào tệp.--- - name: Cài đặt Nginx trên các máy chủ web hosts: webservers become: true
-
Thêm các tác vụ: Thêm các tác vụ để cài đặt và khởi động Nginx.
--- - name: Cài đặt Nginx trên các máy chủ web hosts: webservers become: true tasks: - name: Cài đặt Nginx apt: name: nginx state: present when: ansible_os_family == "Debian" - name: Cài đặt Nginx yum: name: nginx state: present when: ansible_os_family == "RedHat" - name: Khởi động Nginx service: name: nginx state: started become: true
apt
module: Sử dụng để cài đặt các gói phần mềm trên các hệ thống dựa trên Debian (ví dụ: Ubuntu).name
: Tên gói phần mềm cần cài đặt (trong trường hợp này lànginx
).state
: Trạng thái mong muốn của gói phần mềm (present
có nghĩa là gói phần mềm phải được cài đặt).
yum
module: Sử dụng để cài đặt các gói phần mềm trên các hệ thống dựa trên Red Hat (ví dụ: CentOS). Các tham số tương tự nhưapt
module.service
module: Sử dụng để quản lý các dịch vụ hệ thống.name
: Tên dịch vụ cần quản lý (trong trường hợp này lànginx
).state
: Trạng thái mong muốn của dịch vụ (started
có nghĩa là dịch vụ phải được khởi động).become: true
đảm bảo rằng tác vụ này được thực hiện với quyền sudo.
when
clause: Cho phép bạn chỉ định điều kiện để tác vụ được thực hiện. Trong trường hợp này, tác vụ cài đặt Nginx bằngapt
chỉ được thực hiện trên các hệ thống dựa trên Debian, và tác vụ cài đặt Nginx bằngyum
chỉ được thực hiện trên các hệ thống dựa trên Red Hat. Biếnansible_os_family
là một fact Ansible, chứa thông tin về hệ điều hành của máy chủ đích.
-
Lưu tệp: Lưu tệp
install_nginx.yml
.
Chạy Playbook Ansible Đầu Tiên
Để chạy playbook Ansible, sử dụng lệnh ansible-playbook
:
ansible-playbook install_nginx.yml
Ansible sẽ kết nối đến các máy chủ được chỉ định trong tệp inventory và thực hiện các tác vụ được định nghĩa trong playbook. Bạn sẽ thấy kết quả của từng tác vụ trên màn hình.
Nếu tất cả các tác vụ thành công, bạn sẽ thấy thông báo tương tự như sau:
PLAY RECAP *********************************************************************
webserver1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
webserver2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ok
: Số lượng tác vụ thành công.changed
: Số lượng tác vụ đã thay đổi cấu hình trên máy chủ.unreachable
: Số lượng máy chủ không thể kết nối đến.failed
: Số lượng tác vụ thất bại.
Nếu có bất kỳ tác vụ nào thất bại, hãy kiểm tra lại cấu hình và playbook của bạn để xác định nguyên nhân.
Các Module Ansible Quan Trọng
Ansible cung cấp một loạt các module để thực hiện các tác vụ khác nhau. Dưới đây là một số module quan trọng mà bạn nên biết:
apt
(Debian/Ubuntu): Quản lý các gói phần mềm.yum
(CentOS/RHEL): Quản lý các gói phần mềm.copy
: Sao chép tệp từ máy chủ điều khiển sang máy chủ đích.template
: Sao chép tệp template (Jinja2) từ máy chủ điều khiển sang máy chủ đích và thay thế các biến.service
: Quản lý các dịch vụ hệ thống.user
: Quản lý người dùng hệ thống.file
: Quản lý tệp và thư mục.command
: Chạy các lệnh tùy ý trên máy chủ đích.shell
: Chạy các lệnh shell tùy ý trên máy chủ đích (tương tự nhưcommand
, nhưng hỗ trợ các tính năng shell như chuyển hướng và pipes).cron
: Quản lý các công việc cron.
Bạn có thể tìm hiểu thêm về các module Ansible tại https://docs.ansible.com/ansible/latest/modules/modules_by_category.html.
Ví dụ về các Playbook Ansible khác
Dưới đây là một vài ví dụ về các playbook Ansible khác mà bạn có thể tham khảo:
-
Cập nhật gói phần mềm:
--- - name: Cập nhật tất cả các gói phần mềm hosts: all become: true tasks: - name: Cập nhật gói phần mềm apt: upgrade: dist update_cache: yes when: ansible_os_family == "Debian" - name: Cập nhật gói phần mềm yum: update_cache: yes name: '*' state: latest when: ansible_os_family == "RedHat"
-
Tạo người dùng:
--- - name: Tạo người dùng mới hosts: all become: true tasks: - name: Tạo người dùng user: name: newuser password: "$6$salt$hashed_password" createhome: yes
-
Sao chép tệp cấu hình:
--- - name: Sao chép tệp cấu hình hosts: all become: true tasks: - name: Sao chép tệp copy: src: /path/to/local/file dest: /path/to/remote/file owner: root group: root mode: 0644
-
Triển khai ứng dụng web (sử dụng template):
--- - name: Triển khai ứng dụng web hosts: webservers become: true vars: app_name: myapp app_port: 8080 tasks: - name: Tạo thư mục ứng dụng file: path: /var/www/{{ app_name }} state: directory owner: root group: root mode: 0755 - name: Sao chép tệp cấu hình (sử dụng template) template: src: templates/nginx.conf.j2 dest: /etc/nginx/conf.d/{{ app_name }}.conf owner: root group: root mode: 0644 notify: - restart nginx - name: Sao chép mã nguồn ứng dụng copy: src: files/myapp.tar.gz dest: /var/www/{{ app_name }}/myapp.tar.gz owner: root group: root mode: 0644 - name: Giải nén mã nguồn ứng dụng unarchive: src: /var/www/{{ app_name }}/myapp.tar.gz dest: /var/www/{{ app_name }} remote_src: yes owner: root group: root handlers: - name: restart nginx service: name: nginx state: restarted
vars
: Định nghĩa các biến có thể được sử dụng trong playbook.template
module: Sao chép tệp Jinja2 template và thay thế các biến. Tệptemplates/nginx.conf.j2
sẽ chứa cấu hình Nginx cho ứng dụng web.notify
: Kích hoạt handler sau khi một tác vụ thay đổi.handlers
: Danh sách các tác vụ được kích hoạt bởinotify
. Trong trường hợp này, handler sẽ khởi động lại dịch vụ Nginx.unarchive
module: Giải nén tệp tar.gz.remote_src: yes
: Cho biết tệp nguồn nằm trên máy chủ đích, không phải trên máy chủ điều khiển.
“Việc sử dụng template giúp bạn tạo ra các tệp cấu hình động, phù hợp với từng môi trường khác nhau,” chị Trần Thị Mai Anh, chuyên gia tự động hóa hệ thống, nhận xét. “Đây là một kỹ thuật quan trọng để quản lý cấu hình một cách hiệu quả.”
Mẹo và Thủ Thuật khi Viết Playbook Ansible
- Sử dụng Roles: Roles là một cách để tổ chức playbook của bạn thành các thành phần có thể tái sử dụng. Mỗi role chứa các tác vụ, biến, handler và các tệp liên quan đến một chức năng cụ thể.
- Sử dụng Vault: Ansible Vault cho phép bạn mã hóa các thông tin nhạy cảm, chẳng hạn như mật khẩu và khóa API, trong playbook của bạn.
- Kiểm tra Playbook: Sử dụng lệnh
ansible-playbook --check
để kiểm tra playbook của bạn mà không thực sự thực hiện bất kỳ thay đổi nào trên máy chủ đích. - Sử dụng Tags: Tags cho phép bạn chỉ chạy một phần của playbook. Ví dụ:
ansible-playbook install_nginx.yml --tags install
. - Gỡ lỗi Playbook: Nếu playbook của bạn gặp lỗi, hãy sử dụng tùy chọn
-v
(verbose) hoặc-vvv
(very verbose) để hiển thị thêm thông tin gỡ lỗi. - Tìm hiểu về Ansible Galaxy: Ansible Galaxy là một kho lưu trữ các role và playbook được chia sẻ bởi cộng đồng. Bạn có thể tìm thấy các role và playbook hữu ích cho các dự án của mình trên Ansible Galaxy.
Kết luận
Chúc mừng bạn đã viết playbook Ansible đầu tiên! Đây chỉ là bước khởi đầu trong hành trình làm chủ Ansible. Hãy tiếp tục khám phá các module, tính năng và kỹ thuật nâng cao để tận dụng tối đa sức mạnh của công cụ tự động hóa này. Với Ansible, bạn có thể tự động hóa mọi thứ, từ cài đặt phần mềm đến triển khai ứng dụng và quản lý cấu hình hệ thống. Hãy nhớ rằng, thực hành là chìa khóa để thành công!
Câu hỏi thường gặp (FAQ) về Ansible Playbook
1. Ansible Playbook có thể chạy trên hệ điều hành Windows không?
Mặc dù Ansible được thiết kế để quản lý các máy chủ Linux và Unix, bạn có thể sử dụng Ansible để quản lý các máy chủ Windows bằng cách sử dụng module `win_*. Tuy nhiên, máy chủ điều khiển Ansible phải là Linux hoặc Unix.
2. Làm thế nào để xử lý lỗi trong Ansible Playbook?
Bạn có thể sử dụng block
, rescue
, và always
để xử lý lỗi trong Ansible Playbook. block
chứa các tác vụ có thể gây ra lỗi. rescue
chứa các tác vụ được thực hiện nếu một tác vụ trong block
thất bại. always
chứa các tác vụ luôn được thực hiện, bất kể tác vụ trong block
có thành công hay thất bại.
3. Làm thế nào để sử dụng biến trong Ansible Playbook?
Bạn có thể định nghĩa biến trong playbook, inventory, hoặc trong các tệp biến riêng biệt. Bạn có thể sử dụng biến bằng cách sử dụng cú pháp {{ variable_name }}
.
4. Ansible Roles là gì và tại sao nên sử dụng chúng?
Ansible Roles là một cách để tổ chức playbook của bạn thành các thành phần có thể tái sử dụng. Mỗi role chứa các tác vụ, biến, handler và các tệp liên quan đến một chức năng cụ thể. Sử dụng roles giúp bạn làm cho playbook của bạn dễ đọc, dễ bảo trì và dễ tái sử dụng hơn.
5. Ansible Vault là gì và khi nào nên sử dụng nó?
Ansible Vault cho phép bạn mã hóa các thông tin nhạy cảm, chẳng hạn như mật khẩu và khóa API, trong playbook của bạn. Bạn nên sử dụng Ansible Vault bất cứ khi nào bạn cần lưu trữ thông tin nhạy cảm trong playbook của mình.
6. Làm thế nào để chạy một playbook chỉ trên một nhóm máy chủ cụ thể?
Bạn có thể chỉ định nhóm máy chủ trong phần hosts
của playbook hoặc sử dụng tùy chọn --limit
khi chạy playbook. Ví dụ: ansible-playbook install_nginx.yml --limit webservers
.
7. Làm thế nào để biết phiên bản Ansible đang sử dụng?
Sử dụng lệnh ansible --version
để hiển thị thông tin phiên bản Ansible.