نحوه استفاده از Ansible برای نصب و راه‌اندازی WordPress با LAMP بر روی Ubuntu 18.04

نحوه استفاده از 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 قادر به اتصال و اجرای فرمان‌ها در هاست Ansible است یا خیر.  برای آزمایش اتصال، لطفاً مرحله ۳ از قسمت نحوه نصب و راه‌اندازی Ansible بر روی Ubuntu 18.04 را بررسی کنید.

Playbook چه طور عمل می کند؟

اجرای این playbook اقدامات زیر را در هاست‌های Ansible شما انجام خواهد داد:

  1. aptitude را که در Ansible به عنوان جایگزینی برای دستور apt ، قسمت مدیریت بسته شناخته می‌شود نصب می‌کند.
  2. نصب بسته‌های ضروری LAMP و ضمیمه‌های PHP
  3. ایجاد و فعال‌سازی یک VirtualHost جدید در Apache برای وب‌سایت WordPress
  4. فعال‌سازی ماژول بازنویسی شده ( mod_rewrite )در Apache
  5. غیرفعال نمودن وب‌سایت پیش‌فرض Apache
  6. تنظیم گذرواژه کاربر MySQL root
  7. حذف حساب‌های کاربری ناشناس MySQL و پایگاه‌داده آزمایشی
  8.  ایجاد یک پایگاه‌داده MySQL جدید و یک اکانت کاربری جدید برای وب سایت WordPress
  9. تنظیم  UFW جهت ترخیص ترافیک HTTP در درگاه پیکربندی شده (درگاه 80 به صورت پیش فرض)
  10.  دانلود  WordPress و بازگشایی آن
  11. ایجاد مالکیت و دسترسی مناسب برای دایرکتوری
  12.  تنظیم فایل 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 می‌خواهید

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

فرم درخواست برای نصب WordPress
فرم درخواست برای نصب WordPress

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

پیغام ورود به WordPress
پیغام ورود به WordPress

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

داشبورد مدیریت WordPress
داشبورد مدیریت 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 را مطالعه نمایید.

منبع:

https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-install-and-set-up-wordpress-with-lamp-on-ubuntu-18-04