Nhiều ứng dụng web được ra mắt, môi trường hoạt động cho các ứng dụng này cũng vì thế mà mở rộng và tăng lên rất nhiều, do đó việc quản trị cũng phức tạp và khó khăn hơn. Chính vì thế, công cụ giúp tiết kiệm thời gian và hỗ trợ việc cài đặt và cấu hình server đang được sử dụng khá phổ biến. Bài viết dưới đây của Vietnix sẽ giới thiệu đến bạn Ansible, công cụ giúp tự động hóa setup servers Ubuntu 20.04.
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.
Nếu bạn đang tìm kiếm giải pháp máy chủ tiết kiệm chi phí thì có thể tham khảo sử dụng dịch vụ tại Vietnix. Vietnix là đơn vị chuyên cung cấp giải pháp máy chủ với nhiều loại dịch vụ khác nhau để phù hợp với nhu cầu của khách hàng.
Điểm nổi bật của dịch vụ máy chủ tại Vietnix là tính linh hoạt và đa dạng của các gói dịch vụ, phù hợp với nhiều mục đích sử dụng khác nhau. Các gói VPS Giá Rẻ và VPS Phổ Thông có giá thành thấp nhưng vẫn đảm bảo hiệu suất ổn định và đáp ứng nhu cầu sử dụng cơ bản của người dùng. Các gói VPS Cao Cấp, VPS NVMe được thiết kế để đáp ứng nhu cầu sử dụng cao hơn của người dùng, đảm bảo tốc độ xử lý và hiệu suất hoạt động tối ưu. Riêng gói VPS GPU với chuyên dụng cho treo game, treo tool MMO, chạy giả lập điện thoại,…
Hơn nữa, Vietnix cũng có khả năng tùy chỉnh các giải pháp máy chủ dành riêng cho khách hàng có nhu cầu đặc biệt. Bạn có thể liên hệ với Vietnix để được tư vấn và lựa chọn gói dịch vụ phù hợp nhất với nhu cầu.
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.
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.
Chú ý: Đả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
Chú ý: 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ó.
Là một trong những đơn vị hiếm hoi sở hữu hơn 10 năm kinh nghiệm hoạt động trong lĩnh vực cung cấp VPS, hosting, tên miền, Firewall Anti DDoS,… Vietnix đã và đang là sự lựa chọn của đông đảo người dùng. Trong đó có thể kể đến một số cái tên như: GTV, iVIVU, Vietnamworks, SAGO Media,… và hơn 50.000 khách hàng khác.
Sở hữu lượng khách hàng đông đảo như vậy nhưng Vietnix tự hào khi được 97% khách hàng giới thiệu dịch vụ sau khi sử dụng. Ngoài ra, Vietnix cũng được vinh danh với giải thưởng “Thương hiệu Việt Nam xuất sắc 2022”. Nếu bạn đang tìm giải pháp đảm bảo tính an toàn, độ ổn định, chịu tải tốt cho website của mình thì Vietnix chắc chắn sẽ là lựa chọn tối ưu nhất.
Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng 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 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Bài viết trên đây là nội dung hướng dẫn cách thực hiện tự động hóa các tác vụ ban đầu trên một server mới tạo như tạo non-root user với quyền sudo
, bật tường lửa UFW và vô hiệu hóa xác thực bằng mật khẩu cho root. Đến đây, Vietnix hi vọng rằng bạn đã hiểu và có thể áp dụng những kiến thức này vào công việc của mình.