Введение
Автоматизация сервера сегодня играет важнейшую роль в системном администрировании, что вызвано расходной природой современных сред приложений. Инструменты управления конфигурацией, такие как Ansible, обычно используются для оптимизации процесса автоматизации настройки сервера путем создания стандартных процедур для новых серверов, а также снижения количества ошибок, вызванных человеческим фактором при ручной настройке.
Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлах. Также он имеет широкий набор функций и встроенные модули, упрощающие написание скриптов автоматизации.
В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке Linux, Apache, MySQL и PHP (LAMP) в Ubuntu 18.04. Комплект LAMP — это набор программного обеспечения с открытым исходным кодом, которое обычно устанавливается в комплексе для размещения на сервере динамических сайтов и веб-приложений. Этот термин представляет собой аббревиатуру. Операционная система Linux используется с веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, а за обработку динамического контента отвечает PHP.
Предварительные требования
Чтобы выполнить автоматическую настройку из сценария, который мы обсуждаем в этом руководстве, вам потребуется следующее:
Прежде чем продолжить, вам нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды для вашего хоста (или хостов) Ansible. Для проверки подключения ознакомьтесь с шагом 3 руководства по установке и настройке Ansible в Ubuntu 18.04.
Что делает этот сценарий?
Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке Linux, Apache, MySQL и PHP (LAMP) в Ubuntu 18.04.
При запуске этого сценария будут выполняться следующие действия на ваших хостах Ansible:
- Установка
aptitude
, инструмента, который в Ansible используется в качестве альтернативы диспетчеру пакетовapt
. - Установка необходимых пакетов LAMP.
- Создание нового
VirtualHost
Apache и настройка для него специального корневого каталога документов. - Активация нового
VirtualHost
. - Отключение используемого по умолчанию веб-сайта Apache, когда для переменной disable_default установлено значение
true
. - Установка пароля для root-пользователя MySQL.
- Удаление анонимных учетных записей MySQL и тестовой базы данных.
- Настройка UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер
80
). - Настройка тестового скрипта PHP с помощью предоставленного шаблона.
После выполнения запуска сценария вы получите веб-среду для PHP, запущенную поверх Apache, в соответствии с опциями, которые вы определили внутри переменных конфигурации.
Как использовать этот сценарий
В первую очередь нам нужно получить сценарий LAMP и его зависимости из репозитория do-community/ansible-playbooks. Нам нужно будет клонировать этот репозиторий в локальную папку внутри узла управления Ansible.
Если вы клонировали этот репозиторий ранее, выполняя другое руководство, перейдите к вашей копии ansible-playbooks
и запустите команду git pull
, чтобы убедиться, что репозиторий содержит обновленный контент:
- cd ~/ansible-playbooks
- git pull
Если вы впервые используете репозиторий do-community/ansible-playbooks
, необходимо начать с клонирования репозитория в вашу домашнюю папку с помощью следующей команды:
- cd ~
- git clone https://github.com/do-community/ansible-playbooks.git
- cd ansible-playbooks
Файлы, которые нас интересуют, находятся в папке lamp_ubuntu1804
, которая имеет следующую структуру:
lamp_ubuntu1804
├── files
│ ├── apache.conf.j2
│ └── info.php.j2
├── vars
│ └── default.yml
├── playbook.yml
└── readme.md
Ниже представлены все эти файлы:
files/info.php.j2
: шаблон для настройки тестовой страницы PHP в корне веб-сервераfiles/apache.conf.j2
: шаблон для настройки Apache VirtualHost.vars/default.yml
: файл переменных для настройки параметров сценария.playbook.yml
: файл сценария, содержащий задачи, которые будут выполняться на удаленном сервере (или серверах).readme.md
: текстовый файл, содержащий информацию об этом сценарии.
Мы изменим файл переменных сценария для настройки конфигураций MySQL и Apache. Перейдите в директорию lamp_ubuntu1804
и откройте файл vars/default.yml
с помощью вашего редактора командной строки:
- cd lamp_ubuntu1804
- nano vars/default.yml
Этот файл содержит несколько переменных, которые требуют вашего внимания:
vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true
Ниже приводится список, содержащий краткое описание всех этих переменных и то, как их необходимо изменить:
mysql_root_password
: желаемый пароль для учетной записи root MySQL.app_user
: удаленный пользователь без прав root для хоста Ansible, который будет настроен в качестве владельца файлов приложения.http_host
: ваше доменное имя.http_conf
: имя файла конфигурации, который будет создан в Apache.http_port
: HTTP-порт для этого виртуального хоста, где80
— это значение по умолчанию.disable_default
: нужно ли отключить веб-сайт по умолчанию, который поставляется с Apache.
После завершения обновления переменных в vars/default.yml
сохраните и закройте этот файл. Если вы используете nano
, нажмите CTRL+X
, Y
, затем ENTER
.
Теперь мы готовы к запуску этого сценария на одном или нескольких серверах. Большинство сценариев настроены для выполнения на каждом сервере в вашем распоряжении по умолчанию. Мы можем использовать флаг -l
, чтобы гарантировать, что только определенный набор серверов или отдельный сервер будут затронуты сценарием. Также мы можем использовать флаг -u
, чтобы указать, какого пользователя на удаленном сервере мы будем использовать для подключения и выполнения команд сценария на удаленных хостах.
Для выполнения сценария только на server1
, подключенном как sammy
, вы можете воспользоваться следующей командой:
- ansible-playbook playbook.yml -l server1 -u sammy
Результат должен выглядеть примерно так:
Output
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************ok: [server1]
TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude)
...
TASK [UFW - Allow HTTP on port 80] *********************************************************************************************************
changed: [server1]
TASK [Sets Up PHP Info Page] *********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Reload Apache] *********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Restart Apache] *********************************************************************************************************
changed: [server1]
PLAY RECAP *********************************************************************************************************
server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.
После завершения работы сценария откройте ваш браузер и перейдите на хост или IP-адрес сервера, в соответствии с настройками переменных сценария, добавив /info.php
:
http://server_host_or_IP/info.php
Вы увидите подобную страницу:
Поскольку эта страница содержит чувствительную информацию о вашей среде PHP, рекомендуется удалить ее с сервера с помощью команды rm -f /var/www/info.php
после завершения настройки.
Содержание сценария
Вы можете найти файлы для установки сервера LAMP, который мы обсуждаем в данном руководстве, в папке lamp_ubuntu1804
внутри репозитория DigitalOcean Community Playbooks. Чтобы скопировать или загрузить содержимое скриптов напрямую, нажмите кнопку Raw сверху каждого скрипта.
Полное содержимое сценария, как и связанные файлы, также представлены здесь для удобства.
vars/default.yml
Файл переменных default.yml
содержит значения, используемые в задачах сценария, в том числе пароль для учетной записи root MySQL и доменное имя для настройки в Apache.
vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true
files/apache.conf.j2
Файл apache.conf.j2
— это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных 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/info.php.j2
Файл info.php.j2
— это другой шаблон Jinja, который используется для настройки тестового скрипта PHP в корне документов на новом настроенном сервере LAMP.
files/info.php.j2
<?php
phpinfo();
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={{ item }} update_cache=yes state=latest force_apt_get=yes
loop: [ 'aptitude' ]
#Apache Configuration
- name: Install LAMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
- name: Create document root
file:
path: "/var/www/{{ http_host }}"
state: directory
owner: "{{ app_user }}"
mode: '0755'
- name: Set up Apache virtualhost
template:
src: "files/apache.conf.j2"
dest: "/etc/apache2/sites-available/{{ http_conf }}"
notify: Reload Apache
- name: Enable new site
shell: /usr/sbin/a2ensite {{ http_conf }}
notify: Reload Apache
- name: Disable default Apache site
shell: /usr/sbin/a2dissite 000-default.conf
when: disable_default
notify: Reload Apache
# MySQL Configuration
- name: Sets the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Removes all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Removes the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
# PHP Info Page
- name: Sets Up PHP Info Page
template:
src: "files/info.php.j2"
dest: "/var/www/{{ http_host }}/info.php"
handlers:
- name: Reload Apache
service:
name: apache2
state: reloaded
- name: Restart Apache
service:
name: apache2
state: restarted
Вы можете изменить эти файлы в соответствии с требованиями вашего рабочего процесса.
Заключение
В этом руководстве мы использовали Ansible для автоматизации процесса установки и настройки среды LAMP на удаленном сервере. Поскольку у всех возникают различные потребности при работе с базами данных MySQL и пользователями, мы рекомендуем изучить официальную документацию Ansible для получения дополнительной информации и знакомства с вариантами использования модуля mysql_user
в Ansible.
Если вы хотите включить другие задачи в этот сценарий для дальнейшей настройки сервера, ознакомьтесь с нашим вводным руководством для Ansible Введение в управление конфигурациями: создание сценариев Ansible.