Ansible cung cấp một kiến trúc đơn giản không yêu cầu cài đặt phần mềm đặc biệt trên các node . Nó cũng cung cấp một bộ tính năng mạnh mẽ và các module tích hợp giúp tạo điều kiện thuận lợi cho việc viết các tập lệnh tự động hóa.
Hướng dẫn này giải thích cách sử dụng Ansible để tự động hóa các bước có trong hướng dẫn của ta về Cách cài đặt Linux, Nginx, MySQL và PHP (LEMP) trên Ubuntu. Phần mềm LEMP là một group phần mềm được dùng để phục vụ các trang web động và ứng dụng web. Đây là viết tắt của hệ điều hành L inux, với một web server Nginx (phát âm như “ E ngine-X”). Dữ liệu backend được lưu trữ trong database M ySQL và xử lý bởi P HP.
Yêu cầu
Để thực hiện cài đặt tự động được cung cấp bởi playbook mà ta đang thảo luận trong hướng dẫn này, bạn cần:
- Một nút điều khiển Ansible : máy Ubuntu 18.04 được cài đặt và cấu hình Ansible để kết nối với các server Ansible của bạn bằng các SSH key . Đảm bảo rằng nút điều khiển có regular user có quyền sudo và đã bật firewall , như được giải thích trong hướng dẫn Cài đặt Server Ban đầu của ta . Để cài đặt Ansible, hãy làm theo hướng dẫn của ta về Cách cài đặt và cấu hình Ansible trên Ubuntu .
- Một hoặc nhiều Server Ansible : một hoặc nhiều server Ubuntu 18.04 từ xa đã được cài đặt trước đó theo hướng dẫn về Cách sử dụng Ansible để Tự động hóa Cài đặt Server Ban đầu trên Ubuntu .
Trước khi tiếp tục, trước tiên bạn cần đảm bảo nút điều khiển Ansible của bạn có thể kết nối và thực thi các lệnh trên (các) server Ansible của bạn. Để kiểm tra kết nối, vui lòng kiểm tra bước 3 của Cách cài đặt và cấu hình Ansible trên Ubuntu .
Playbook này làm được gì?
Playbook Ansible này cung cấp một giải pháp thay thế cho việc chạy thủ công thông qua quy trình được nêu trong hướng dẫn của ta về Cách cài đặt Linux, Nginx, MySQL, PHP ( LEMP ) trên Ubuntu 18.04 .
Chạy playbook này sẽ thực hiện các việc sau trên server Ansible của bạn:
- Cài đặt
aptitude
, được Ansible ưa thích như một giải pháp thay thế cho trình quản lý góiapt
. - Cài đặt các gói LEMP cần thiết.
- Cài đặt file cấu hình Nginx bằng cách sử dụng mẫu được cung cấp.
- Bật cấu hình Nginx mới và tắt cấu hình mặc định.
- Đặt password cho user gốc MySQL.
- Loại bỏ các account MySQL ẩn danh và database thử nghiệm.
- Cài đặt UFW để cho phép truy cập HTTP trên cổng đã cấu hình (
80
theo mặc định). - Cài đặt tập lệnh thử nghiệm PHP bằng cách sử dụng mẫu được cung cấp.
Sau khi playbook chạy xong, bạn sẽ có một môi trường web PHP chạy trên Nginx, dựa trên các tùy chọn bạn đã xác định trong các biến cấu hình của bạn .
Cách sử dụng Playbook này
Điều đầu tiên ta cần làm là lấy playbook LEMP và các phụ thuộc của nó từ repository do-community / ansible-playbooks . Ta cần sao chép repository này vào một folder local bên trong Ansible Control Node.
Trong trường hợp bạn đã sao chép repository này trước đó trong khi làm theo một hướng dẫn khác, hãy truy cập bản sao ansible-playbooks
hiện có của bạn và chạy git pull
đảm bảo bạn có nội dung cập nhật:
cd ~/ansible-playbooks git pull
Nếu đây là lần đầu tiên bạn sử dụng repository do-community/ansible-playbooks
, bạn nên bắt đầu bằng cách sao chép repository vào folder chính của bạn với:
cd ~
git clone https://github.com/do-community/ansible-playbooks.git
cd ansible-playbooks
Các file mà ta quan tâm nằm bên trong folder lemp_ubuntu1804
, có cấu trúc sau:
lemp_ubuntu1804
├── files
│ ├── info.php.j2
│ └── nginx.conf.j2
├── vars
│ └── default.yml
├── playbook.yml
└── readme.md
Đây là nội dung của từng file này:
files/info.php.j2
: Tệp mẫu để cài đặt trang thử nghiệm PHP trên web server rootfiles/nginx.conf.j2
: Tệp mẫu để cài đặt server Nginx. danh mục.vars/default.yml
: Tệp biến để tùy chỉnh cài đặt sách vở.playbook.yml
: Tệp playbook, chứa các việc sẽ được thực thi trên (các) server từ xa.readme.md
: Tệp văn bản chứa thông tin về sách chơi này.
Ta sẽ chỉnh sửa file biến của playbook để tùy chỉnh cấu hình của cả MySQL và Nginx. Truy cập folder lemp_ubuntu1804
và mở file vars/default.yml
bằng editor dòng lệnh mà bạn chọn:
cd lemp_ubuntu1804
nano vars/default.yml
Tệp này chứa một số biến cần bạn chú ý:
vars / default.yml
---
mysql_root_password: "mysql_root_password"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
Danh sách sau đây chứa giải thích ngắn gọn về từng biến này và cách bạn có thể cần thay đổi chúng:
mysql_root_password
: Mật khẩu mong muốn cho account MySQL gốc .http_host
: Tên server hoặc địa chỉ IP cho web server này.http_conf
: Tên của file cấu hình sẽ được tạo bên trong/etc/nginx/sites-available
, thường được đặt thành tên server hoặc ứng dụng để dễ nhận dạng hơn.http_port
: Cổng Nginx sẽ sử dụng để phục vụ trang web này. Đây là cổng80
theo mặc định, nhưng nếu bạn muốn phân phát trang web hoặc ứng dụng của bạn trên một cổng khác, hãy nhập cổng đó vào đây.
Khi bạn đã cập nhật xong các biến bên trong vars/default.yml
, hãy lưu file này. Nếu bạn sử dụng nano
, hãy làm như vậy bằng cách nhấn CTRL + X
, Y
, sau đó ENTER
.
Để thực thi playbook chỉ trên server1
, kết nối với quyền sammy
, bạn có thể sử dụng lệnh sau:
ansible-playbook playbook.yml -l server1 -u sammy
Bạn sẽ nhận được kết quả tương tự như sau:
Output
PLAY [all] *****************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************
ok: [server1]
TASK [Install Prerequisites] ***********************************************************************************************************
changed: [server1] => (item=aptitude)
...
TASK [UFW - Allow HTTP on port 80] *****************************************************************************************************
changed: [server1]
TASK [Sets Up PHP Info Page] ***********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Reload Nginx] *********************************************************************************************************
changed: [server1]
PLAY RECAP *****************************************************************************************************************************
server1 : ok=12 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Lưu ý : Để biết thêm thông tin về cách chạy Ansible Playbooks, hãy xem Hướng dẫn Sheet Cheat Ansible.
Khi playbook chạy xong, hãy truy cập trình duyệt web và truy cập server lưu trữ hoặc địa chỉ IP của server , như được cấu hình trong các biến playbook, theo sau là /info.php
:
http://server_host_or_IP/info.php
Bạn sẽ thấy một trang như thế này:
Vì trang này chứa thông tin nhạy cảm về môi trường PHP của bạn, bạn nên xóa nó khỏi server bằng cách chạy lệnh rm -f /var/www/info.php
sau khi bạn đã cài đặt xong.
Nội dung Playbook
Bạn có thể tìm thấy cài đặt server LEMP có trong hướng dẫn này trong folder lemp_ubuntu1804
bên trong repository lưu trữ Playbooks Cộng đồng DigitalOcean . Để sao chép hoặc download trực tiếp nội dung tập lệnh, hãy nhấp vào nút Raw ở đầu mỗi tập lệnh.
Toàn bộ nội dung của playbook cũng như các file liên quan cũng được đưa vào đây để bạn tiện theo dõi.
vars / default.yml
Tệp biến default.yml
chứa các giá trị sẽ được sử dụng trong các việc playbook, chẳng hạn như password cho account gốc MySQL và domain để cấu hình trong Nginx.
vars / default.yml
---
mysql_root_password: "mysql_root_password"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
files / nginx.conf.j2
Tệp nginx.conf.j2
là file mẫu Jinja 2 cấu hình web server Nginx. Các biến được sử dụng trong mẫu này được xác định trong file biến vars/default.yml
.
files / nginx.conf.j2
server {
listen {{ http_port }};
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name {{ http_host }};
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
files / info.php.j2
Tệp info.php.j2
là một mẫu Jinja khác, được sử dụng để cài đặt tập lệnh PHP thử nghiệm trong folder root của server LEMP mới được cấu hình .
files / info.php.j2
<?php
phpinfo();
playbook.yml
Tệp playbook.yml
là nơi xác định tất cả các việc từ cài đặt này. Nó bắt đầu bằng cách xác định group server nên là mục tiêu của cài đặt này ( all
), sau đó nó sử dụng hàm become: true
để xác định rằng các việc phải được thực thi với sự leo thang quyền ( sudo
) theo mặc định. Sau đó, nó bao gồm file biến vars/default.yml
để tải các tùy chọn cấu hình.
playbook.yml
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install Prerequisites
apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
loop: [ 'aptitude' ]
- name: Install LEMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'nginx', 'mysql-server', 'python3-pymysql', 'php-fpm', 'php-mysql' ]
# Nginx Configuration
- name: Sets Nginx conf file
template:
src: "files/nginx.conf.j2"
dest: "/etc/nginx/sites-available/{{ http_conf }}"
- name: Enables new site
file:
src: "/etc/nginx/sites-available/{{ http_conf }}"
dest: "/etc/nginx/sites-enabled/{{ http_conf }}"
state: link
notify: Reload Nginx
- name: Removes "default" site
file:
path: "/etc/nginx/sites-enabled/default"
state: absent
notify: Reload Nginx
# MySQL Configuration
- name: Sets the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Removes all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Removes the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
# Sets Up PHP Info Page
- name: Sets Up PHP Info Page
template:
src: "files/info.php.j2"
dest: "/var/www/html/info.php"
# Handlers
handlers:
- name: Reload Nginx
service:
name: nginx
state: reloaded
- name: Restart Nginx
service:
name: nginx
state: restarted
Vui lòng sửa đổi các file này để phù hợp nhất với nhu cầu cá nhân của bạn trong quy trình làm việc của bạn .
Kết luận
Trong hướng dẫn này, ta đã sử dụng Ansible để tự động hóa quá trình cài đặt và cài đặt môi trường LEMP trên server từ xa. Bởi vì mỗi cá nhân thường có nhu cầu khác nhau khi làm việc với database MySQL và người sử dụng, ta khuyên bạn kiểm tra tài liệu Ansible chính thức để biết thêm thông tin và sử dụng trường hợp của mysql_user
module Ansible.