Ansible là một công cụ mạnh mẽ giúp tự động hóa việc cấu hình và quản lý máy chủ, trong khi Ubuntu 20.04 là một hệ điều hành phổ biến, được sử dụng rộng rãi cho các máy chủ. Kết hợp Ansible để thiết lập tự động khởi tạo máy chủ trên Ubuntu 20.04 sẽ giúp tối ưu thời gian và công sức quản trị. Bài viết này sẽ hướng dẫn bạn cách sử dụng Ansible thiết lập tự động khởi tạo Server trên Ubuntu 20.04 chi tiết.
Những điểm chính
- Sử dụng Ansible để tự động thiết lập máy chủ Ubuntu 20.04, giúp giảm thiểu lỗi do thiết lập thủ công, tận dụng kiến trúc đơn giản và các module mạnh mẽ của Ansible.
- Cần một máy chủ Ubuntu 20.04 làm Ansible control node (đã cài Ansible, SSH key, sudo user, tường lửa) và một máy chủ Ubuntu 20.04 khác làm remote server (truy cập SSH được từ control node).
- Playbook Ansible tự động hóa việc thiết lập máy chủ Ubuntu 20.04, bao gồm cài đặt gói, tạo user, cấu hình SSH, vô hiệu hóa đăng nhập root bằng mật khẩu và thiết lập firewall.
- Bài viết hướng dẫn 9 bước sử dụng Ansible để tự động thiết lập máy chủ Ubuntu 20.04, từ chuẩn bị control node, viết playbook đến chạy playbook.
- Vietnix là nhà cung cấp VPS hàng đầu, uy tín, tốc độ cao, ổn định (99.9% uptime) và bảo mật, hỗ trợ 24/7 với đa dạng gói dịch vụ.
Giới thiệu về Ansible
Tự động hóa server hiện đang đóng một vai trò trọng yếu trong việc quản trị các hệ thống do ứng dụng ngày càng tăng lên về số lượng các môi trường hoạt động của các ứng dụng hiện đại ngày nay. Những công cụ quản trị cấu hình như Ansible đang được sử dụng phổ biến để giúp tổ chức quy trình tự động setup server bằng việc thiết lập các tiêu chuẩn về thủ tục thực hiện cho các server mới. Từ đó có thể giúp giảm thiểu được các lỗi liên quan đến thiết lập thủ công gây ra.

Ansible với kiến trúc đơn giản, không cần phải có các phần mềm chuyên dụng phải cài đặt trên các nodes. Ngoài ra, nó còn mang lại những tính năng và các modules được dựng sẵn rất mạnh mẽ tạo điều kiện thuận lợi cho việc viết các scripts tự động hóa.
Bài hướng dẫn này sẽ giải thích về cách sử dụng Ansible để tự động hóa các bước setup server trên Ubuntu phiên bản 20.04.
Yêu cầu cần đáp ứng
Để bắt đầu bài hướng dẫn này bạn cần đáp ứng được các yêu cầu sau:
- Một Ansible control node: Máy chủ Ubuntu 20.04 của bạn phải cài đặt Ansible và đã được cấu hình để kết nối đến các hosts của Ansible bằng SSH key. Control node phải có một user thông thường có đặc quyền
sudo
và tường lửa được bật. - Một remote server đã được cài đặt Ubuntu 20.04: Bạn không cần phải setup trước trên server này nhưng phải truy cập được bằng SSH đến server từ Ansible control node đề cập ở trên. Server này sẽ trở thành một host cho Ansible remote server – nơi được Ansible control node thực hiện các tác vụ động.
Tác dụng của Playbook
Playbook Ansible mang đến một giải pháp thay thế cho việc tự tay setup server trên Ubuntu 20.04 và cài đặt SSH keys trên đó. Bạn chỉ cần setup một lần cho playbook và có thể sử dụng lại cho các server khác.
Khi chạy, playbook sẽ thực hiện các tác vụ sau trên các máy chủ Ansible:
- Cài đặt
aptitude
– là một package manager được dùng bởi Ansible thay thế choapt
. - Tạo một user mới với quyền
sudo
và thiết lập không mật khẩu sudo. - Copy SSH public key và include key đó vào file
authorized_keys
cho user admin mới ở trên remote host. - Vô hiệu hóa phương thức xác thực bằng mật khẩu cho root user.
- Cài đặt các packages của hệ thống.
- Cấu hình firewall UFW sao cho chỉ cho phép các kết nối bằng SSH và từ chối các kết nối khác.
Khi playbook đã chạy xong, bạn sẽ có được một user mới có thể đăng nhập vào server.
9 bước sử dụng Ansible thiết lập tự động khởi tạo Server trên Ubuntu 20.04
- Bước 1: Chuẩn bị Ansible Control Node
- Bước 2: Chuẩn bị Playbook
- Bước 3: Thêm tác vụ cài đặt Aptitude vào Playbook
- Bước 4: Thêm tác vụ Setup Sudo User vào Playbook
- Bước 5: Thêm SSH Key để Setup và vô hiệu hóa các tác vụ Root Password vào Playbook
- Bước 6: Thêm tác vụ cài đặt Package vào Playbook
- Bước 7: Thêm tác vụ Setup Firewall vào Playbook
- Bước 8: Kiểm tra lại bản hoàn chỉnh của Playbook
- Bước 9: Khởi chạy Playbook
Bước 1: Chuẩn bị Ansible Control Node
Trên Ansible control node của mình, bạn hãy thêm IP của Ansible host remote server vào trong file inventory của Ansible bằng text editor tùy ý, ở đây sử dụng nano
:
sudo nano /etc/ansible/hosts
Sau khi mở file inventory của Ansible, thêm IP của remote server vào khối [servers]
:
[servers]
server1 ansible_host=your_remote_server_ip
. . .
Sau đó, bạn cần kiểm tra và xác thực kết nối SSH giữa Ansible control node và remote server bằng lệnh sau:
ssh root@your_remote_server_ip
Chấp nhận yêu cầu xác thực và nhập mật khi được hỏi. Khi đã xác minh được kết nối SSH, nhấn CTRL+D
để đóng kết nối lại và trở về control node.
Bước 2: Chuẩn bị Playbook
File playbook.yml
là nơi tất cả các tác vụ của bạn được định nghĩa. Tác vụ là đơn vị hành động nhỏ nhất mà bạn có thể tự động hóa được bằng Ansible playbook. Đầu tiên hãy tạo playbook bằng text editor tùy ý:
nano playbook.yml
Lệnh trên sẽ mở môt file YAML trống. Trước khi đi tiến hành thêm các tác vụ vào playbook của bạn, hãy bắt đầu bằng cách thêm các mục sau:
---
- hosts: all
become: true
vars:
created_username: sammy
Nếu muốn, bạn có thể thay đổi tên user sẽ được tạo ở chỉ thị created_username
.
Hầu hết mỗi playbook đều sẽ có cách khai báo ban đầu tương tự như trên. hosts
khai báo các servers mà Ansible control node để playbook chạy trên đó. become
nêu ra tất cả các lệnh sẽ được thực hiện dưới quyền root.
vars
cho phép lưu dữ liệu vào các biến. Nếu trong tương lai, bạn muốn thay đổi thì chỉ cần chỉnh sửa những dòng này trong file là được. Dưới đây là giải thích ngắn gọn về các biến trên:
Chú ý: Nếu bạn muốn xem file hoàn chỉnh của playbook, hãy tham khảo ở bước 8. Các files định dạng YAML có thể gặp lỗi với việc thụt đầu dòng trong cấu trúc file nên bạn cần kiểm tra lại sau khi hoàn thành các tác vụ.
Bước 3: Thêm tác vụ cài đặt Aptitude vào Playbook
Mặc định, các tác vụ sẽ được thực thi đồng bộ bởi Ansible lần lượt từ trên xuống dưới theo playbook. Điều này dẫn đến việc thứ tự định nghĩa các tác vụ là rất quan trọng, và bạn có thể ngầm hiểu rằng mỗi tác vụ sẽ được thực thi sau khi tác vụ trước đã xong.
Tất cả các tác vụ trong playbook của bài hướng dẫn đều có thể chạy độc lập và có thể sử dụng lại cho các playbooks khác.
Đầu tiên, thêm tác vụ cài đặt aptitue
– là một công cụ để giao tiếp với package manager của Linux:
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest
update_cache: true
Bài viết đang sử dụng module apt
được dựng sẵn của Ansible để ra lệnh cho Ansible cài đặt aptitude
. Các modules trong Ansible là các lối tắt để thực thi thay cho những thao tác mà bạn cần phải chạy bằng các lệnh như trên bash
.
Để an toàn, Ansible sẽ chọn apt
để cài đặt các packages trong trường hợp aptitude
có vấn đề không thể dùng được. Về mặt kĩ thuật, bước này không hoàn bắt buộc do Ansible sẽ thường dùng aptitude
hơn.
Bước 4: Thêm tác vụ Setup Sudo User vào Playbook
Tuy nhiên bạn nên tránh lạm dụng root user do nhiều nguyên nhân khác nhau. Do đó, bạn có thể tự động hóa việc tạo ra một user mới được cấp quyền sudo
bằng cách thêm các dòng sau vào playbook:
- name: Setup passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%sudo'
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ created_username }}"
state: present
groups: sudo
append: true
create_home: true
Ở đây đang dùng module lineinfile
của Ansible để xác định và thay thế một dòng cụ thể nào đó trong một file. Trong trường hợp này, người dùng cần sử dụng regexfile (regular expression – biểu thức chính quy) để chỉ định một dòng trong file sudoers
, sau đó chỉnh sửa để cho phép quyền sử dụng sudo
không cần password.
Ngoài ra, bạn có thể dùng visudo
để xác thực lại tính hợp lệ của file sau khi thay đổi, để phòng những lỗi có thể xảy ra.
Để tận dụng điều này, bạn thêm một user mới với module user
. Ansible sẽ đảm bảo rằng user này được tạo ra nếu chưa tồn tại, đồng thời đảm bảo rằng user thuộc về group sudo
sẽ không bị loại ra khỏi các group khác và cùng đó là tạo ra một thư mục home.
Lưu ý
Đảm bảo là bạn có để dấu trích dẫn “” vào xung quanh dấu ngoặc cong {} nơi chỉ thị một biến. Thiếu dấu trích dẫn trên là một lỗi cú pháp rất thường gặp trong Ansible.
Bước 5: Thêm SSH Key để Setup và vô hiệu hóa các tác vụ Root Password vào Playbook
Ansible khuyến khích nên kết hợp sử dụng SSH key với việc vô hiệu hóa xác thực bằng mật khẩu cho root. Để thực hiện, thêm tác vụ sau vào playbook:
- name: Set authorized key for remote user
ansible.posix.authorized_key:
user: "{{ created_username }}"
state: present
key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
Module authorize_key
có thể được sử dụng bằng cách cung cấp tên user và vị trí của SSH key. Ở đây, đường dẫn vào key được tạo ra nhờ vào hàm lookup
của Ansible.
Moule lineinlife
sẽ tìm và thay thế một dòng khai báo trong file sshd_config
để vô hiệu hóa chức năng xác thực mật khẩu cho root và hạn chế quyền truy cập vào một số các đặc quyền nhằm tăng tính bảo mật.
Bước 6: Thêm tác vụ cài đặt Package vào Playbook
Ansible có thể đảm rằng các packages sẽ luôn được cài đặt trên Server của bạn. Và để cài đặt các packages, thay vì định nghĩa từng tác vụ riêng và gọi apt install
trên từng cái, bạn có thể liệt kê một danh sách các packages mong muốn như dưới đây:
- name: Update apt and install required system packages
apt:
pkg:
- curl
- vim
- git
- ufw
state: latest
update_cache: true
Bạn có thể thêm hoặc xóa các packages tùy ý. Điều này sẽ không những đảm bảo rằng các packages được cài đặt mà còn là với phiên bản mới nhất và được hoàn thành sau khi lệnh update của apt
được gọi.
Bước 7: Thêm tác vụ Setup Firewall vào Playbook
Firewall là một yếu tố không thể thiếu được đối với bất kì một server nào trên internet. Bạn có thể dùng Ansible để cài đặt và cấu hình cho UFW (Uncomplicated Firewall) như sau:
- name: UFW - Allow SSH connections
community.general.ufw:
rule: allow
name: OpenSSH
- name: UFW - Enable and deny by default
community.general.ufw:
state: enabled
default: deny
Đầu tiên module ufw
đảm bảo rằng truy cập bằng SSH được phép thông qua. Sau đó, module này sẽ kích hoạt Firewall và mặc định sẽ từ chối tất cả các lưu lượng khác vào server.
Bước 8: Kiểm tra lại bản hoàn chỉnh của Playbook
Bạn có thể kiểm tra lại bản hoàn chỉnh của playbook như bên dưới. Tùy thuộc cách customize của bạn mà có thể sẽ khác một chút với playbook của bài.
---
- hosts: all
become: true
vars:
created_username: sammy
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest
update_cache: true
- name: Setup passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%sudo'
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ created_username }}"
state: present
groups: sudo
append: true
create_home: true
- name: Set authorized key for remote user
ansible.posix.authorized_key:
user: "{{ created_username }}"
state: present
key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
- name: Update apt and install required system packages
apt:
pkg:
- curl
- vim
- git
- ufw
state: latest
update_cache: true
- name: UFW - Allow SSH connections
community.general.ufw:
rule: allow
name: OpenSSH
- name: UFW - Enable and deny by default
community.general.ufw:
state: enabled
default: deny
Lưu ý
Hãy để ý đến các thụt đầu dòng trong file YAML của mình. Nếu có lỗi xảy ra, thì rất có thể là do chúng. YAML khuyến khích nên sử dụng 2 khoảng trắng để thụt đầu dòng – giống như trong playbook của bài này.
Khi đã hoàn thành playbook của mình, bạn có thể lưu và thoát khỏi text editor để tiến hành khởi chạy playbook ở bước tiếp theo sau đây.
Bước 9: Khởi chạy Playbook
Bây giờ bạn đã có thể chạy playbook của mình trên một hoặc nhiều server. Hầu hết các playbook mặc định được cấu hình để thực thi trên mỗi server bên trong inventory của bạn, do đó ở đây bạn nên chỉ định server cần chạy.
Để chạy playbook trên server1
cũng như kết nối như là root
, bạn dùng lệnh như sau:
ansible-playbook playbook.yml -l server1 -u root -k
Flag -l
chỉ định server và flag -u
chỉ định user để đăng nhập vào remote server. Bởi vì, bạn chưa setup remote server nên root là lựa chọn duy nhất. Còn flag -k
là rất quan trọng đối với lần chạy playbook đầu tiên để có thể nhập mật khẩu SSH.
Bạn sẽ nhận được output tương tự như dưới dây:
Output
. . .
TASK [UFW - Allow SSH connections] ***************************************************************************************************************************************************************************************************************************
changed: [server1]
TASK [UFW - Enable and deny by default] **********************************************************************************************************************************************************************************************************************
changed: [server1]
PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
server1 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Theo output trên, server đã được set up thành công. Output của bạn không cần phải hoàn toàn giống như trên, chỉ cần không xuất hiện lỗi là được.
Sau khi đã hoàn thành bước setup đầu tiên cho playbook, tất cả lần gọi ansible tiếp theo có thể được sử dụng với user sammy
và không cần flag -k
:
ansible-playbook playbook.yml -l server1 -u sammy
Bạn cũng có thể đăng nhập vào server với lệnh sau bằng SSH:
ssh sammy@your_remote_server_ip
Hãy nhớ thay thế sammy
bằng user của bạn đã định nghĩa trong biến created_username
và server_host_or_IP
bằng địa chỉ IP của hostname server tương ứng.
Sau khi đăng nhập vào server, bạn có thể kiểm tra các quy tắc đang bật của UFW để xác nhận Firewall đã được cấu hình chính xác hay chưa:
sudo ufw status
Output sẽ tương tự như dưới đây:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Điều này cho thấy Firewall UFW đã được bật thành công. Và vì đây là tác vụ cuối cùng cài đặt cho playbook nên cũng đồng thời nói lên rằng playbook đã được thực thi thành công trên server này.
Như vậy, việc tự động hóa bằng playbook thật sự đã tiết kiệm được rất nhiều thời gian và đồng thời cũng cho phép server tuân theo một cấu hình tiêu chuẩn mà có thể được tùy chỉnh theo nhu cầu. Do đó, đây là một thành phần rất thiết yếu mà bất kì một team phát triển nào cũng cần phải có.
Vietnix – Nhà cung cấp VPS uy tín, ổn định, tốc độ cao
Vietnix là nhà cung cấp dịch vụ VPS top đầu thị trường hiện nay, nổi bật với hiệu năng vượt trội, độ ổn định cao với uptime lên đến 99.9% và bảo mật tòan diện. Bằng kinh nghiệm 12 năm hoạt động và sở hữu hạ tầng máy chủ vững chắc, Vietnix đã xây dựng 1 hệ thống hỗ trợ khách hàng 24/7, luôn sẵn sàng giải quyết mọi sự cố một cách nhanh chóng.
Cho dù bạn cần VPS cho website cá nhân, ứng dụng di động hay hệ thống doanh nghiệp quy mô lớn, Vietnix đều có giải pháp phù hợp với danh mục gói dịch vụ đa dạng như VPS AMD, VPS NVMe, VPS SSD,… Hãy lựa chọn Vietnix để trải nghiệm dịch vụ VPS chất lượng hàng đầu, xứng đáng với sự tin tưởng của bạn ngay hôm nay!
Thông tin liên hệ:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Website: https://vietnix.vn/
Qua bài viết này, bạn đã nắm được cách sử dụng Ansible thiết lập tự động khởi tạo Server trên Ubuntu 20.04, từ việc chuẩn bị môi trường, viết playbook đến thực thi các tác vụ tự động hóa. Hy vọng rằng những kiến thức này sẽ giúp bạn tiết kiệm thời gian và công sức trong việc quản trị hệ thống, đồng thời tạo nền tảng vững chắc để bạn xây dựng và triển khai các ứng dụng một cách hiệu quả và chuyên nghiệp. Ansible với khả năng tự động hóa mạnh mẽ không chỉ giúp tối ưu hóa quy trình quản lý server mà còn cho phép bạn linh hoạt mở rộng hệ thống một cách dễ dàng và đáng tin cậy trên nền tảng Ubuntu 20.04.
Mọi người cũng đọc thêm: