
نحوه استفاده از Ansible برای نصب و راهاندازی WordPress با LAMP بر روی Ubuntu 18.04
مقدمه
اتوماسیون سرور اکنون به دلیل ماهیت یکبار مصرف محیطهای کاربردی مدرن، نقش اساسی در مدیریت سیستمها ایفا میکند.
از ابزارهای مدیریت پیکربندی مانند Ansible معمولاً برای سادهسازی فرایند خودکارسازی تنظیم سرور با ایجاد مراحل استاندارد برای سرورهای جدید استفاده میشود و در عین حال خطای انسانی مرتبط با تنظیمات دستی را نیز کاهش میدهد.
در این مقاله به چگونگی استفاده از Ansible برای نصب و راهاندازی WordPress با LAMP بر روی Ubuntu 18.04 پرداخته میشود.
امروزه به دلیل تغییر در مناسبات بازار که کاربران را ناگزیر از استفادهی ورژنهای جدیدتری از اپلیکیشنها میکند، تنظیم خودکار سرور نقش اساسی در مدیریت سیستمها پیداکرده است.
ابزارهای مدیریت پیکربندی مانند Ansible عموما جهت سادهسازی اتوماسیون ست آپ سرور و همچنین کاهش خطای انسانی مربوط به تنظیمات دستی استفاده میشوند. این افزارها عملیات فوق را از طریق به کار بستن دستورالعملهای استاندارد انجام میدهند.
Ansible معماری سادهای پیشنهاد میکند که برای نصب شدن روی نُودها نیاز به نرمافزار خاصی ندارد. همچنین برای تسهیل در نوشتن اسکریپتهای اتوماسیون، مجموعه قدرتمندی از امکانات و ماژولها را ارائه میدهد.
دستورالعمل پیش رو توضیح میدهد که چگونه از Ansible برای نصب و راهاندازی WordPress با LAMP بر روی Ubuntu 18.04 استفاده کنید.
WordPress محبوبترین CMS (سیستم مدیریت محتوا) در اینترنت است که به کاربران اجازه میدهد تا بلاگها و وبسایتها را در بالای یک واسط MySQL (پشتیبانی) که با استفاده از PHP پردازش میگردد، راهاندازی کنند.
پس از راهاندازی، تقریباً کل پروسهی مدیریت از طریق واسط (frontend) وب انجام شود.
پیشنیاز ها:
برای اجرای تنظیمات خودکار ارائهشده در playbook به موارد ذیل نیازمند هستید:
داشتن یک نُود کنترلی Ansible: یک ماشین Ubuntu 18.04 با Ansible نصب و پیکربندی شده برای وصل شدن به هاستهای Ansible با استفاده از SSH Keys.
همانطور که در راهنمای راهاندازی سرور اولیه با اوبونتو توضیح داده شده است، اطمینان حاصل فرمایید که نُود کنترل از یک کاربر معمولی دارای دسترسی sudo برخوردار است و فایروال را نیز فعال کردهاست.
برای راهاندازی Ansible، پیشنهاد میشود مقالهی آموزشی نحوه نصب و راهاندازی Ansible بر روی Ubuntu 18.04 را بخوانید.
داشتن یک یا چند هاست برای Ansible
پیش از هر چیزی داشتن یک یا چند سرور از راهدور Ubuntu 18.04 همراه با پیروی کردن از مقاله آموزشی نحوه استفاده از Ansible برای تنظیم خودکار سرور اولیه در Ubuntu 18.04 دستورالعمل را میسر میکند.
قبل از شروع ، ابتدا باید اطمینان حاصل کنید که نُود کنترلی Ansible قادر به اتصال و اجرای فرمانها در هاست Ansible است یا خیر. برای آزمایش اتصال، لطفاً مرحله ۳ از قسمت نحوه نصب و راهاندازی Ansible بر روی Ubuntu 18.04 را بررسی کنید.
Playbook چه طور عمل می کند؟
اجرای این playbook اقدامات زیر را در هاستهای Ansible شما انجام خواهد داد:
- aptitude را که در Ansible به عنوان جایگزینی برای دستور apt ، قسمت مدیریت بسته شناخته میشود نصب میکند.
- نصب بستههای ضروری LAMP و ضمیمههای PHP
- ایجاد و فعالسازی یک VirtualHost جدید در Apache برای وبسایت WordPress
- فعالسازی ماژول بازنویسی شده ( mod_rewrite )در Apache
- غیرفعال نمودن وبسایت پیشفرض Apache
- تنظیم گذرواژه کاربر MySQL root
- حذف حسابهای کاربری ناشناس MySQL و پایگاهداده آزمایشی
- ایجاد یک پایگاهداده MySQL جدید و یک اکانت کاربری جدید برای وب سایت WordPress
- تنظیم UFW جهت ترخیص ترافیک HTTP در درگاه پیکربندی شده (درگاه 80 به صورت پیش فرض)
- دانلود WordPress و بازگشایی آن
- ایجاد مالکیت و دسترسی مناسب برای دایرکتوری
- تنظیم فایل wp-config.php با استفاده از الگوی ارایهشده
وقتی بارگذاری playbook به پایان رسید، شما یک فایل نصب WordPress که در بالای محیط LAMP بارگذرای میشود دارید. این فایل نصب به انتخابهای شما از متغییرهای پیکربندی وابسته است.
چگونه از این playbook استفاده کنید؟
اولین کاری که باید انجام دهید این است که فایل WordPress را بر روی LAMP همراه با نیازمندیها را از لینک ارائهشده do-community/ansible-playbooks دریافت نمایید. این مخزن را در یک پوشه محلی در داخل نُود کنترل Ansible کپی کنید.
در صورتی که مخزن را کپی کردید، قبل از این که راهنمای دیگری را باز کنید، به کپی ansible-playbooks موجود خود مراجعه کنید و یک فرمان git pull را اجرا کنید تا مطمئن شوید که مطالب بروز رسانی شدهاند:
$ cd ~/ansible-playbooks
$ git pull
اگر این اولین باری است که از مخزن do-community/ansible-playbooks استفاده میکنید، با کپی کردن مخزن در فولدر home خود شروع کنید:
$ cd ~
$ git clone https://github.com/do-community/ansible-playbooks.git
$ cd ansible-playbooks
پروندههایی که مایل به برسی آنها هستید، در پوشه wordpress-lamp_ubuntu1804 که همانند ساختار زیر میباشد واقع شدهاند:
wordpress-lamp_ubuntu1804
├── files
│ ├── apache.conf.j2
│ └── wp-config.php.j2
├── vars
│ └── default.yml
├── playbook.yml
└── readme.md
در این قسمت به تفسیر کدهای فوق پرداخته میشود:
• files/apache.conf.j2: فایل الگو برای راهاندازی Apache VirtualHost
• files/wp-config.php.j2: فایل الگو برای راهاندازی فایل پیکربندی WordPress
• vars/default.yml: فایل متغیر برای سفارشیسازی تنظیمات playbook
• playbook.yml: فایل playbook که شامل وظایفی است که باید بر روی سرورهای از راهدور اجرا شوند.
• readme.md: یک فایل متنی حاوی اطلاعات در مورد playbook
فایل متغیر playbook را برای سفارشیسازی گزینههای خود ویرایش کنید. دسترسی به دایرکتوری wordpress-lamp_ubuntu1804 را انتخاب کرده و فایل vars/default.yml را با استفاده از انتخاب خط دستوری زیر باز کنید:
$ cd wordpress-lamp_ubuntu1804
$ nano vars/default.yml
این فایل حاوی چند متغیر است که باید به آنها توجه کنید:
vars/default.yml
---
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"
#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
لیست زیر توضیح مختصری در مورد هر یک از این متغیرها و اینکه چگونه میتوانید آنها را عوض کنید، میدهد:
• php_modules: آرایهای حاوی افزونههای PHP که باید برای پشتیبانی از راهاندازی WordPress نصب شود. شما نیازی به تغییر این متغیر ندارید، اما در صورت نیاز ممکن است بخواهید افزونههای جدیدی را در لیست وارد کنید.
• mysql_root_password: گذرواژه مطلوب برای حساب کاربری MySQL root.
• mysql_db: نام پایگاهداده MySQL که باید برای WordPress ساخته شود.
• mysql_user: نام حساب کاربری MySQL که باید برای WordPress ایجاد شود.
• mysql_password: گذرواژه برای کاربر جدید MySQL که باید برای WordPress ساخته شود.
• http_host: نام دامنه شما.
• http_conf: نام فایل پیکربندی که در Apache ایجاد میشود.
• http_port: درگاه HTTP برای هاست مجازی، که در آن درگاه شمارهی ۸۰ پیشفرض است.
مقاله نحوه ایجاد حساب کاربری MySQL در سایت کلادینو موجود است برای ساخت حساب کاربری دیتابیس از آن می توانید استفاده کنید.
هنگامی که بروز رسانی متغیرهای درون vars/default.yml را به اتمام رساندید، این فایل را ذخیره و ببندید. اگر از دستور nano استفاده کردید، این کار را با فشار دادن CTRL + X ، Y ، و سپس ENTER انجام دهید.
حالا شما آماده اجرای این playbook بر روی یک یا چند سرور هستید. اکثر playbook ها طوری پیکربندی شدهاند که در هر سرور در فهرست شما به طور پیشفرض اجرا شوند.
برای مطمئن شدن از اینکه تنها یک زیر مجموعه از سرورها یا یک سرور واحد تحتتاثیر playbook قرار میگیرد از flag -l استفاده کنید.
همچنین میتوانید از نماد -u برای تشخیص اینکه کاربر در سرور از راهدوری که استفاده میکنید برای اجرا و اتصال فرمانهای playbook بر روی هاستهای از راهدور استفاده نمایید.
جهت اجرای playbook فقط روی server1، با اتصال به sammy، میتوانید از دستور زیر استفاده نمایید:
$ ansible-playbook playbook.yml -l server1 -u sammy
خروجی مشابه ذیل را خواهید داشت:
Output
PLAY [all] *****************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************
ok: [server1]
TASK [Install prerequisites] ***********************************************************************************************************
ok: [server1]
…
TASK [Download and unpack latest WordPress] ********************************************************************************************
changed: [server1]
TASK [Set ownership] *******************************************************************************************************************
changed: [server1]
TASK [Set permissions for directories] *************************************************************************************************
changed: [server1]
TASK [Set permissions for files] *******************************************************************************************************
changed: [server1]
TASK [Set up wp-config] ****************************************************************************************************************
changed: [server1]
RUNNING HANDLER [Reload Apache] ********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Restart Apache] *******************************************************************************************************
changed: [server1]
PLAY RECAP *****************************************************************************************************************************
server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
وقتی راهاندازی playbook به پایان رسید، میتوانید به مرورگر وب خود بروید تا نصب WordPress را در آنجا به اتمام برسانید.
به نام دامنه سرور خود یا public IP address خود مراجعه کنید:
http://server_host_or_IP
صفحه مشابه زیر را خواهید دید:

بعد از انتخاب زبانی که میخواهید برای نصب WordPress استفاده کنید، در گام آخر جهت راهاندازی حساب کاربری WordPress و گذرواژهی آن به control panel بروید.

پس از کامل کردن فرم درخواست شده، به صفحهای خواهید رفت که به شما پیغام ورود را نشان میدهد:

زمانی که وارد سیستم میشوید، به داشبورد مدیریت WordPress منتقل خواهید شد:

برخی از مراحل بعدی برای سفارشی کردن نصب WordPress شامل انتخاب تنظیمات permalinks برای پستهایتان ( میتوانید در Settings > Permalinks این کار را انجام دهید) و انتخاب یک theme جدید ( در Appearance > Themes ) میشود.
محتویات Playbook
میتوانید WordPress را در تنظیمات سرور LAMP که در این برنامه آموزشی در پوشه wordpress-lamp_ubuntu1804 داخل مخزن DigitalOcean Community Playbooks وجود دارد، پیدا کنید.
برای کپی کردن یا دانلود اسکریپت به طور مستقیم، روی دکمه Raw در بالای هر اسکریپت کلیک کنید.
محتوای کامل playbook و فایلهای مربوط به آن نیز جهت دسترسی راحت شما اینجا گنجانده شدهاست.
vars/default.yml
فایل متغیر default.yml حاوی مقادیری است که در وظایف playbook مانند تنظیمات پایگاهداده و نام دامنه برای پیکربندی در Apache، استفاده خواهد شد.
vars/default.yml
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"
#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
files/apache.conf.j2
apache.conf.j2 یک فایل در الگوی Jinja 2 است که Apache VirtualHost جدید را پیکربندی میکند. متغیرهای استفادهشده در این الگو در فایل متغیر vars/default.yml تعریف شدهاند
files/apache.conf.j2
<VirtualHost *:{{ http_port }}>
ServerAdmin webmaster@localhost
ServerName {{ http_host }}
ServerAlias www.{{ http_host }}
DocumentRoot /var/www/{{ http_host }}
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/{{ http_host }}>
Options -Indexes
</Directory>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
</VirtualHost>
files/wp-config.php.j2
فایل wp-config.php.j2 یک الگوی Jinja دیگری است، که برای راهاندازی فایل پیکربندی اصلی WordPress استفاده میشود. متغیرهای مورد استفاده در این الگو در فایل متغیر vars/default.yml تعریف شدهاند. کلیدهای احراز هویت منحصر به فرد و saltها به کمک یک تابع هش تولید میشوند.
files/info.php.j2
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the
* installation. You don't have to use the web site, you can
* copy this file to "wp-config.php" and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://codex.wordpress.org/Editing_wp-config.php
*
* @package WordPress
*/
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ mysql_db }}' );
/** MySQL database username */
define( 'DB_USER', '{{ mysql_user }}' );
/** MySQL database password */
define( 'DB_PASSWORD', '{{ mysql_password }}' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/** Filesystem access **/
define('FS_METHOD', 'direct');
/**#@+
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
/**#@-*/
/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = 'wp_';
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the Codex.
*
* @link https://codex.wordpress.org/Debugging_in_WordPress
*/
define( 'WP_DEBUG', false );
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}
/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );
playbook.yml
playbook.yml فایلی است که تمام وظایف راهاندازی نرمافزار در آن تعریف شدهاند. این کار با تعریف گروهی از سرورها که باید هدف این مجموعه all باشد شروع و پس از استفاده از become: true برای تعریف اینکه وظایف باید به صورت پیش فرض با افزایش امتیاز (sudo) اجرا گردند، تعریف میشوند.
سپس از فایل متغیر vars/default.yml برای بارگذاری گزینههای پیکربندی استفاده میشود. .
playbook.yml
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install prerequisites
apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
tags: [ system ]
- name: Install LAMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
tags: [ system ]
- name: Install PHP Extensions
apt: name={{ item }} update_cache=yes state=latest
loop: "{{ php_modules }}"
tags: [ system ]
# Apache Configuration
- name: Create document root
file:
path: "/var/www/{{ http_host }}"
state: directory
owner: "www-data"
group: "www-data"
mode: '0755'
tags: [ apache ]
- name: Set up Apache VirtualHost
template:
src: "files/apache.conf.j2"
dest: "/etc/apache2/sites-available/{{ http_conf }}"
notify: Reload Apache
tags: [ apache ]
- name: Enable rewrite module
shell: /usr/sbin/a2enmod rewrite
notify: Reload Apache
tags: [ apache ]
- name: Enable new site
shell: /usr/sbin/a2ensite {{ http_conf }}
notify: Reload Apache
tags: [ apache ]
- name: Disable default Apache site
shell: /usr/sbin/a2dissite 000-default.conf
notify: Restart Apache
tags: [ apache ]
# MySQL Configuration
- name: Set the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
tags: [ mysql, mysql-root ]
- name: Remove all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
- name: Remove the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
- name: Creates database for WordPress
mysql_db:
name: "{{ mysql_db }}"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
- name: Create MySQL user for WordPress
mysql_user:
name: "{{ mysql_user }}"
password: "{{ mysql_password }}"
priv: "{{ mysql_db }}.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
tags: [ system ]
# WordPress Configuration
- name: Download and unpack latest WordPress
unarchive:
src: https://wordpress.org/latest.tar.gz
dest: "/var/www/{{ http_host }}"
remote_src: yes
creates: "/var/www/{{ http_host }}/wordpress"
tags: [ wordpress ]
- name: Set ownership
file:
path: "/var/www/{{ http_host }}"
state: directory
recurse: yes
owner: www-data
group: www-data
tags: [ wordpress ]
- name: Set permissions for directories
shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \\;"
tags: [ wordpress ]
- name: Set permissions for files
shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \\;"
tags: [ wordpress ]
- name: Set up wp-config
template:
src: "files/wp-config.php.j2"
dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
tags: [ wordpress ]
handlers:
- name: Reload Apache
service:
name: apache2
state: reloaded
- name: Restart Apache
service:
name: apache2
state: restarted
اکنون میتوانید به بهترین وجه ممکن و با خیال راحت این فایلها را متناسب با نیازهای فردیتان در جریان کارهای شخصی اصلاح کنید.
نتیجهگیری
در این راهنما، از Ansible برای خودکار سازی روند نصب و راهاندازی یک وب سایت WordPress با LAMP بر روی سرور ۱۸.۰۴ Ubuntu استفاده کردید.
اگر علاقهمند به راهاندازی وردپرس بر روی Debian نیز هستید، میتوانید مقاله راهاندازی وردپرس با LEMP بر روی Debian 9 را مطالعه نمایید.
منبع: