Установка и настройка стека LAMP с помощью Ansible в Ubuntu 18.04

Автоматизация серверов в системном администрировании сегодня играет очень важную роль. Обычно для упрощения автоматизации настройки сервера используются инструменты управления конфигурацией, такие как Ansible. Они самостоятельно выполняют стандартные процедуры для новых серверов, а также уменьшают вероятность человеческих ошибок, которые могли бы возникнуть при настройке вручную.

Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на всех нодах кластера. Он также предоставляет набор надежных функций и встроенных модулей, которые облегчают написание сценариев автоматизации.

Этот мануал поможет автоматизировать установку стека LAMP: Ansible выполнит самостоятельно все действия, которые вы выполняли вручную в мануале Установка стека LAMP в Ubuntu 18.04. LAMP – это акроним, который включает в себя первые буквы названий всех компонентов: операционная система Linux, веб-сервер Apache, СУБД MySQL и язык динамической обработки PHP.

Требования

  • Главная нода Ansible. Это сервер Ubuntu 18.04 с установкой Ansible, который может подключаться хосту Ansible с помощью ключей SSH. Убедитесь, что на главной ноде есть обычный пользователь с правами sudo и включенным брандмауэром, как описано в этом мануале по начальной настройке сервера. Чтобы настроить Ansible, пожалуйста, следуйте этому мануалу.
  • Один или несколько хостов Ansible. Это удаленные серверы Ubuntu 18.04, настроенные по мануалу Автоматизация начальной настройки сервера с помощью Ansible в Ubuntu 18.04.

Примечание: Прежде чем продолжить, необходимо убедиться, что главная нода Ansible может подключаться и выполнять команды на хостах. Для проверки соединения, пожалуйста, выполните раздел 3 мануала по установке Ansible в Ubuntu 18.04.

Что делает этот плейбук?

Плейбук, который мы напишем сейчас, автоматизирует все разделы руководства Установка  стека 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 и его зависимости из этого репозитория. Клонируйте этот репозиторий в локальную папку на главной ноде Ansible.

Если вы клонировали этот репозиторий ранее, следуя другому руководству, откройте имеющуюся копию ansible-playbooks и выполните команду git pull, чтобы обновить его:

cd ~/ansible-playbooks
git pull

Если вы впервые используете этот репозиторий, вам следует сначала клонировать его в домашнюю папку с помощью команд:

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: текстовый файл, содержащий информацию об этом плейбуке.

Мы отредактируем файл vars/default.yml, чтобы настроить MySQL и Apache. Перейдите в каталог lamp_ubuntu1804 и откройте файл с помощью редактора командной строки:

cd lamp_ubuntu1804
nano vars/default.yml

Этот файл содержит несколько переменных, на которые следует обратить внимание:

---
mysql_root_password: "mysql_root_password"
app_user: "8host"
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: имя хоста или IP-адрес этого веб-сервера.
  • http_conf: имя конфигурационного файла, который будет создан в каталогах Apache.
  • http_port: порт, который Apache будет использовать для обслуживания этого сайта. По умолчанию это 80, но если вы хотите обслуживать свой сайт или приложение через другой порт, укажите его здесь.
  • disable_default: следует ли отключить стандартный сайт, который поставляется с Apache.

Когда вы закончите обновлять переменные в vars/default.yml, сохраните и закройте этот файл. Если вы использовали nano, нажмите CTRL + X, Y, а затем Enter.

Теперь вы готовы запустить плейбук на одном или нескольких серверах. По умолчанию большинство плейбуков настроено на выполнение на каждом сервере в вашем инвентаре. Флаг –l позволяет задать определенное подмножество серверов или один сервер, которые будут подвержены влиянию плейбука. Мы также можем добавить флаг -u, чтобы указать, какого пользователя на удаленном хосте нужно использовать для подключения и выполнения команд из плейбука.

Чтобы выполнить плейбук только на сервере server1 как пользователь root, вы можете использовать следующую команду:

ansible-playbook playbook.yml -l server1 -u 8host

Вы получите примерно такой вывод:

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: простая и удобная шпаргалка

Когда плейбук будет выполнен, перейдите в веб-браузер и введите свой IP-адрес сервера (как указано в переменных плейбука), после чего добавьте /info.php:

http://server_host_or_IP/info.php

На экране должна появиться страница с подробностями о стеке.

Поскольку эта страница содержит конфиденциальную информацию о вашей среде PHP, мы рекомендуем удалить ее с сервера сразу после проверки, выполнив команду:

rm -f /var/www/info.php

Содержимое плейбука

Давайте рассмотрим полное содержимое плейбука и связанные с ним файлы.

Файл vars/default.yml

Файл переменных default.yml содержит значения, которые будут использоваться в задачах плейбука (например, пароль пользователя root MySQL и домен для настройки Apache).

---
mysql_root_password: "mysql_root_password"
app_user: "8host"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

Файл apache.conf.j2

Файл apache.conf.j2 — это шаблон Jinja 2, который содержит новый виртуальный хост Apache. Переменные, использованные в этом шаблоне, определены файле vars/default.yml.

<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 в корневом каталоге только что настроенного сервера.

<?php
phpinfo();

Файл playbook.yml

playbook.yml – это файл плейбука, в нем определены все задачи для этой настройки. Файл начинается с определения группы целевых серверов (all), после чего он использует become: true, чтобы указать, что задачи должны выполняться с повышением привилегий (sudo) по умолчанию. Затем он включает файл переменной vars/default.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

Вы можете внести необходимые вам поправки в эти файлы, чтобы все индивидуальные требования вашего рабочего процесса были выполнены.

Заключение

В этом мануале мы автоматизировали установку стека LAMP на удаленные серверы с помощью Ansible. Поскольку при работе с MySQL у каждого пользователя чаще всего есть свои индивидуальные потребности, мы рекомендуем вам ознакомиться с официальной документацией Ansible. Здесь вы найдете много полезной информации и вариантов использования модуля Ansible mysql_user.

Читайте такжеСоздание плейбука Ansible

Tags: , , ,

Добавить комментарий