Cách sử dụng Puppet để quản lí các Chủ đề và Plugin của WordPress trên Ubuntu 14.04

6 năm trước

Cách sử dụng Puppet để quản lí các Chủ đề và Plugin của WordPress trên Ubuntu 14.04

 

Nếu bạn là admin của một website và cần quản lí nhiều thành phần thực thể khác nhau trên WordPress, bạn sẽ thấy nhàm chán khi phải lặp đi lặp lại một công việc: update các chủ đề và plugin. Hơn nữa với quá nhiều chủ đề và plugin mới, bạn sẽ phải tự mình cài đặt hoặc gỡ cài đặt chúng, và điều này cũng rất mất thời gian.

Bài viết này sẽ hướng dẫn bạn cách sử dụng các manifest của Puppet và WP-CLI để tự động hóa các thao tác như cài đặt, xóa và cập nhật chủ đề và plugin của WordPress.

Yêu cầu

  • Một Cloud Server Ubuntu 14.04.
  • Một sudo user
  • Hiểu biết cơ bản về cách hoạt động của các module và manifest của Puppet. 
  • WordPress 4.1 trở lên
  • Puppet 3.7.1 trở lên

Bước 1 — Tạo một Module mới

 

Module sử dụng WP-CLI (WordPress Command Line Interface) để biểu diễn hầu hết các lệnh của nó. WP-CLI là một công cụ cho phép ta kết nối với WordPress bằng một giao diện dòng lệnh thay vì qua một trình duyệt web.

Giờ ta sẽ tạo một module sử dụng WP-CLI để kết nối với Puppet.

Vào thư mục chứa các module của Puppet.

cd /etc/puppet/modules

Tạm gọi module cần tạo là wordpress_manager. Tạo một thư mục cho nó.

sudo mkdir /etc/puppet/modules/wordpress_manager

Tạo một thư mục con tên manifests để lưu tất cả các manifest.

sudo mkdir /etc/puppet/modules/wordpress_manager/manifests
Bước 2 — Tạo một Class để cài WP-CLI
 

Ở bước này, ta sẽ tự động hóa quá trình cài đặt WP-CLI. Việc tự động cài đặt WP-CLI vì nó cần được chạy trên tất cả server chạy WordPress.

Những việc ta cần làm với class mới tạo này là:

  • Đảm bào curl đã được cài đặt để download WP-CLI.
  • Đảm bảophp5-cli được cài đặt.
  • Download WP-CLI sử dụng curl và đặt nó trong thư mục/usr/bin 
  • Kích hoạt WP-CLI bằng cách đặt nó ở chế độ 775 hoặc a+x.

Dùng nano để tạo một file tên install.pp.

sudo nano /etc/puppet/modules/wordpress_manager/manifests/install.pp

Thêm những dòng code sau vào file. Chú ý phần chú thích trong các comment.

class wordpress_manager::install {
# Install curl
package { 'curl':
ensure => latest
}# Install php5-cli
package { 'php5-cli':
ensure => latest
}# Download WP-CLI using curl
exec { 'Install WP CLI':
command => "/usr/bin/curl -o /usr/bin/wp-cli -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar",
require => [ Package['curl'], Package['php5-cli'] ],
creates => "/usr/bin/wp-cli"
}# Change the mode of WP-CLI to a+x
file { '/usr/bin/wp-cli':
mode => "775",
require => Exec['Install WP CLI']
}}

Thuộc tính creates ở lệnh exec kiểm tra xem WP-CLI đã được download về hay chưa. Nếu không có nó, Puppet sẽ download WP-CLI ,mỗi lần kích hoạt module.

 

Bước 3 — Tạo một kiểu dữ liệu cụ thể để kết nối với WP-CLI

 

Để quản lí chủ đề, các lệnh theme của WP-CLI sẽ được sử dụng. Trong manifest, ta sẽ sử dụng những lệnh con( subcommand)  activate, delete, install, và update theo sau theme , quá trình này tương tự với các lệnh quản lí plugin.

Kiểu dữ liệu mà ta sẽ định nghĩa sẽ có các thuộc tính:

  • $resource_type - Kiểu tài nguyên cần quản lí, giá trị của nó là plugin hoặc theme.
  • $action - Sẽ là một trong số các lệnh con.
  • $resource_name - Tên của plugin hoặc chủ đề.
  • $root_directory - Là thư mục gốc của WordPress nơi các lệnh wp-cli được chạy.
  • $user - Tên của user sở hữu WordPress.

Ta sẽ cần làm một số việc sau:

  • Đảm bảo WP- CLI được cài đặt
  • Tạo và thực thi các lệnh WP-CLI dựa trên đầu vào là các thông số ở trên.

Để tránh lỗi, ta sẽ dùng các thuộc tính unless và onlyif cho lệnh exec để đảm bảo:

  • Chỉ cài một item khi có chưa được cài. Lệnh is-installed được dùng để kiểm tra xem một item đã được cài hay chưa.
  • Activate/deactivate/delete/uninstall/update một item chỉ khi nó đã được cài.

Đầu tiên tạo file resource.pp.

sudo nano /etc/puppet/modules/wordpress_manager/manifests/resource.pp

Thêm những dòng code sau vào file:

Note: Mặc định thì module sẽ dùng /var/www cho thư mục cài đặt WordPress, và root là cho user. Sửa lại $root_directory và $usercho khớp với hệ thống của bạn.

define wordpress_manager::resource (
$resource_name,
$resource_type,
$root_directory = "/var/www/",
$action,
$user = "root",
){# Make sure WP_CLI is installed
require wordpress_manager::install
$wp_cli = "/usr/bin/wp-cli --allow-root"
# Install the theme or plugin unless it is already installed.
if $action == "install" {
exec { "Install $resource_name":
command => "$wp_cli $resource_type $action $resource_name",
unless => "$wp_cli $resource_type is-installed $resource_name",
cwd => $root_directory,
user => $user
}}# Activate or update the theme or plugin only if it is currently installed.
if $action == "activate" or $action == "update" {
exec { "$action $resource_name":
command => "$wp_cli $resource_type $action $resource_name",
onlyif => "$wp_cli $resource_type is-installed $resource_name",
cwd => $root_directory,
user => $user
}}# Uninstall or deactivate a plugin only if it is currently installed.
if $resource_type == "plugin" {
if $action == "uninstall" or $action == "deactivate" {
exec { "$action $resource_name":
command => "$wp_cli plugin $action $resource_name",
onlyif => "$wp_cli plugin is-installed $resource_name",
cwd => $root_directory,
user => $user
}}}# Delete a theme only if it is currently installed.
if $action == "delete" and $resource_type == "theme" {
exec { "$action $resource_name":
command => "$wp_cli theme $action $resource_name",
onlyif => "$wp_cli theme is-installed $resource_name",
cwd => $root_directory,
user => $user
}}}

Ta sẽ sử dụng cờ --allow-root cho tất cả các lệnh WP-CLI trong module này để xử lí các thể hiện của WordPress cần phỉa sử dụng quyền root. Nếu không có cờ này bạn sẽ gặp lỗi:

Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress install exists under.

Module Puppet đã được cài đặt xong. Sau đây là một vài ví dụ về cách sử dụng của nó

 

Ví dụ 1 — Áp dụng một Chủ đề mới cho WordPress

 

Dùng module Puppet vừa tạo để áp dụng một chủ đề vào một trang cụ thể.

Mặc định WordPress sử dụng theme twentyfifteen , trông như sau:

Default Look

Giờ hãy cài đặt và áp dụng một chủ đề mới, expound

Dùng nano để tạo một file tên manage_expound_theme.pp.

nano /tmp/manage_expound_theme.pp

Thêm vào file những dòng code sau:

wordpress_manager::resource { 'install expound':
resource_name => "expound",
resource_type => "theme",
action => "install"}wordpress_manager::resource { 'activate expound':
resource_name => "expound",
resource_type => "theme",
action => "activate",
require => WordPress_manager::Resource['install expound']
}

Dùng lệnh puppet apply để chạy manifest.

sudo puppet apply /tmp/manage_expound_theme.pp

Output sẽ như sau:

Notice: Compiled catalog for zona-virtualbox in environment production in 0.81 seconds
Notice: /Stage[main]/Main/WordPress_manager::Resource[install expound]/Exec[Install expound]/returns: executed successfully
Notice: /Stage[main]/Main/WordPress_manager::Resource[activate expound]/Exec[activate expound]/returns: executed successfully
Notice: Finished catalog run in 13.72 seconds

Vào trang WordPress của bạn tại địa chỉ http://your_server_ip/ để quan sát sự thay đổi:

Expound theme

 

Ví dụ 2 — Xóa một Chủ đề

 

Nếu muốn xóa một chủ đề, trước hết bạn nên áp dụng một chủ đề khác cho WordPress. Ví dụ, nếu muốn áp dụng lại twentyfifteen ,mở lại file manage_expound_theme.pp 

nano /tmp/manage_expound_theme.pp

Xóa hết các dòng code cũ đi rồi nhập đoạn code sau vào:

wordpress_manager::resource { 'activate twentyfifteen':
resource_name => "twentyfifteen",
resource_type => "theme",
action => "activate"}wordpress_manager::resource { 'delete expound':
resource_name => "expound",
resource_type => "theme",
action => "delete",
require => WordPress_manager::Resource['activate twentyfifteen']
}

Áp dụng manifest:

sudo puppet apply /tmp/manage_expound_theme.pp
 

Ví dụ 3 — Kích hoạt một Plugin

 

Plugin Akismet được cài mặc định, tuy nhiên nó chưa được kích hoạt, nên ta sẽ sử dụng module Puppet để kích hoạt nó.

Tạo một manifest mới tên manage_akismet.pp.

nano /tmp/manage_akismet.pp

Thêm vào những dòng lệnh sau:

wordpress_manager::resource { 'activate akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "activate"}

Kích hoạt manifest.

sudo puppet apply /tmp/manage_akismet.pp

Kiểm tra lại bằng lệnh plugin list. Mặc định thì module được lưu trong /var/www của thư mục cài đặt WordPress, nếu không thì bạn có thể dùng cờ --path

wp-cli --allow-root --path=/var/www/ plugin list

Output:

+---------+----------+--------+---------+
| name | status | update | version |
+---------+----------+--------+---------+
| akismet | active | none | 3.0.4 |
| hello | inactive | none | 1.6 |
+---------+----------+--------+---------+
 

Ví dụ 4 — Gỡ cài đặt Plugin

 

Để gỡ cài đặt một plugin, chẳng hạn ở đây là Akismet, mở file manage_akismet.pp.

nano /tmp/manage_akismet.pp

Xóa hết các dòng trong file và thay bằng:

wordpress_manager::resource { 'deactivate akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "deactivate"}wordpress_manager::resource { 'uninstall akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "uninstall",
require => WordPress_manager::Resource['deactivate akismet']
}

Chạy lại manifest.

sudo puppet apply /tmp/manage_akismet.pp

Giờ chạy lệnh plugin list 

wp-cli --allow-root --path=/var/www/ plugin list

Bạn sẽ không thấy Askimet xuất hiện trong danh sách các plugin nữa.

+---------+----------+--------+---------+
| name | status | update | version |
+---------+----------+--------+---------+
| hello | inactive | none | 1.6 |
+---------+----------+--------+---------+

Tổng kết

 

Giờ bạn đã biết cách quản lí các plugins và chủ đề của WordPress bằng một module Puppet đơn cùng với các ví dụ về một số lệnh đơn giản để thao tác với nó.

Bạn còn có thể làm được rất nhiều thứ, chẳng hạn thực hiện một thao tác trên nhiều host cùng một lúc bằng Puppet's Agent-Master mode. Tất cả những gì bạn cần làm là gõ wordpress_manager::resource trong phẩn miêu tả node của các host đó. Để update Akismet plugin trên hai host, host1 vàhost2, file site.pp của Puppet Master sẽ như sau:

node 'host1', 'host2' {
wordpress_manager::resource { 'update akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "update" }}

WP-CLI là một công cụ mạnh mẽ với rất nhiều lệnh để thực thi. Hãy tự mình mở rộng các module để hiểu sâu hơn về nó.