[Phần 2] Ansible - Cài đặt LAMP với Playbooks và Roles
Trong bài viết trước, mình đã giới thiệu một số khái niệm cơ bản trong Ansible. Phần này chúng ta đi vào thực hành demo cài đặt một web server cơ bản với PHP, Apache và sau đó hiện ra màn hình "Hello World".
Các phần thục vào là cách viết trong file có định dạng là YAML nhé. Nếu chưa nắm rõ bạn xem lại phần YAML trong bài viết trước.
Trong bài viết trước bạn chỉ thấy module yum chứ không nghe nhắc gì đề module apt. Apt cũng giống như yum, giúp bạn cài đặt hay gỡ bỏ service nào đó. Nhưng do mình đang viết cho linux nên mình dùng apt. Yum sẽ dùng cho server centos nhé.
Task đầu tiền ta sẽ cài đặt apache. Tiếp đến task 2 cũng vậy, cài đặt service php để có thể chạy được các file php. Sau khi cài xong, đến task 3 là start dịch vụ apache lên. Sau cùng ở task 4 là copy file index.php đã được chuẩn bị sẵn vào thư mục www của apache.
Trong file index.php đơn giản bạn có thể viết vài dòng lệnh php như sau:
Playbooks
Tạo một file playbook và viết vào đấy những việc cần làm sau:- Install Apache
- Install PHP
- Start Apache
- Show "Hello World!"
# playbook.yml
---
- hosts: all
tasks:
- name: 1. install Apache
apt: name=apache2 state=present
- name: 2. install PHP module for Apache
apt: name=libapache2-mod-php5 state=present
- name: 3. start Apache
service: name=apache2 state=running enabled=yes
- name: 4. install Hello World PHP script
copy: src=index.php dest=/var/www/index.php mode=0664
echo "Hello World!";
#hosts.txt
10.0.0.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
$ ansible-playbook --inventory-file=hosts playbook.yml --sudo --verbose
Roles
OK, webserver đã chạy, bây giờ cần cái thêm database. Nếu bây giờ viết install vào tiếp file playbook trên thì cũng được, nhưng cách viết đó không hay, trong khi ansible đã cung cấp sẵn tính năng roles. Nên chúng ta sẽ sử dụng triệt để những tính năng mạnh mẽ mà ansible đã cung cấp. Bạn còn nhớ cấu trúc thư mục trong roles ở bài trước không. Không nhớ cũng không sao ^^. Vì mình sẽ giúp các bạn tạo ngay đây. Nhìn vào hình bên dưới và tạo một cấu trúc thư mục đơn giản giống như vậy nhé:Đầu tiên chúng ta sẽ tạo role cho webserver trước. Vì ta đã có code viết sẵn ở trên rồi, nên giờ chỉ cần phân tách và cho vào những file có chức năng riêng như sau:Trước tiên là roles/webserver/tasks/main.yml sẽ chứa đoạn script mô tả tasks cần thực hiện trong việc cài đặt và chạy webserver.
Trong thư mục roles/webserver/files chúng ta để file mẫu index.php vào.
Và sau cùng là ở file playbook.yml chính ta sẽ khai báo webserver trong thuộc tính roles.
# roles/webserver/tasks/main.yml
---
- name: 1. install Apache
apt: name=apache2 state=present
- name: 2. install PHP module for Apache
apt: name=libapache2-mod-php5 state=present
- name: 3. start Apache
service: name=apache2 state=running enabled=yes
- name: 4. install Hello World PHP script
copy: src=index.php dest=/var/www/index.php mode=0664
# playbook.yml
---
- hosts: all
roles:
- webserver
Chạy file playbook.yml với câu lệnh như ban đầu đã chạy và xem kết quả.
Cài đặt Database
Tiếp theo chúng ta sẽ cài đặt database. Dưới đây là những việc cần phải làm:- Install MariaDB package
- Start MariaDB service
- Create database
- Create database user
- Import database
- Install MySQL extension for PHP
- Copy PHP script to query the database
Giống như việc tạo webserver như trên, ta sẽ viết file main.yml trong thư mục roles/database/tasks. Sau đó là câu lệnh sql tạo table, file sql này sẽ đặt trong thư mục files. Cuối cùng là viết một file php kết nối với mysql và lấy dữ liệu lên.
# roles/database/tasks/main.yml
---
- name: 1a. Add APT GPG signing key
apt_key: url=http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xCBCB082A1BB943DB state=present
- name: 1b. Add APT repository
apt_repository: repo='deb http://ftp.osuosl.org/pub/mariadb/repo/10.0/ubuntu $ansible_distribution_release main' state=present update_cache=yes
- name: 1c. Install MariaDB server package
apt: name=mariadb-server state=present
- name: 2. Start Mysql Service
service: name=mysql state=started enabled=true
- name: Install python Mysql package #required for mysql_db tasks
apt: name=python-mysqldb state=present
- name: 3. Create a new database
mysql_db: name=demo state=present collation=utf8_general_ci
- name: 4. Create a database user
mysql_user: name=demo password=demo priv=*.*:ALL host=localhost state=present
- name: 5a. Copy sample data
copy: src=dump.sql dest=/tmp/dump.sql
- name: 5b. Insert sample data
shell: cat /tmp/dump.sql | mysql -u demo -pdemo demo
- name: 6. Install MySQL extension for PHP
apt: name=php5-mysql state=present
# roles/database/files/dump.sql
CREATE TABLE IF NOT EXISTS demo (
message varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO demo (message) VALUES('Hello World!');
# roles/database/files/db.php
$connection = new PDO('mysql:host=localhost;dbname=demo', 'demo', 'demo');
$statement = $connection->query('SELECT message FROM demo');
echo $statement->fetchColumn();
Bây giờ chạy file playbook rồi xem kết quả:
ansible-playbook -i hosts playbook.yml --sudo
Mở trình duyện và truy cập vào link http://10.0.0.10/db.php, lúc này chứ "Hello World" đó được lấy từ trong db và hiển thị lên.