[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".

Playbooks

Tạo một file playbook và viết vào đấy những việc cần làm sau:
  1. Install Apache
  2. Install PHP
  3. Start Apache
  4. Show "Hello World!"
Cụ thể trong file playbook.yml sẽ được viết như sau:
# 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
  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:

echo "Hello World!";
  Tiếp đến là chuẩn bị file inventory chứa thông tin server. Ở đây mình đặt tên là hosts.txt:
#hosts.txt
10.0.0.10    ansible_ssh_user=vagrant    ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
  Bây giờ bạn thử run file playbook cùng với file inventory:
$ ansible-playbook --inventory-file=hosts playbook.yml --sudo --verbose
Mở browser lên và truy cập vào ip server đã cài đặt, bạn sẽ thấy "Hello World!"

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:
  1. Install MariaDB package
  2. Start MariaDB service
  3. Create database
  4. Create database user
  5. Import database
  6. Install MySQL extension for PHP
  7. Copy PHP script to query the database
Trước tiên, ta tạo thêm roles database với cấu trúc thư mục như sau:
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.

Kết luận

Ansible làm cho việc quản lý cấu hình thực sự dễ dàng bằng các chức năng đơn giản như playbooks và vai trò. Ngoài ra cú pháp YAML thật sự rất đơn giản và dễ viết, điều này giúp các developer tiếp cận với ansible nhanh chóng.