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

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

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

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

Требования

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

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

Плейбук, который мы напишем в ходе этого мануала, автоматизирует все разделы руководства Установка стека LEMP в Ubuntu 18.04.

При запуске этого плейбука на хостах Ansible будут выполняться следующие действия:

  1. Установка инструмента aptitude, который Ansible предпочитает в качестве альтернативы менеджеру пакетов apt.
  2. Установка всех необходимых пакетов LEMP.
  3. Настройка Nginx по предоставленному шаблону.
  4. Включение новой конфигурации Nginx и отключение стандартной конфигурации.
  5. Установка пароля пользователя root MySQL.
  6. Удаление анонимных учетных записей MySQL и тестовой базы данных.
  7. Настройка UFW для поддержки HTTP-трафика по заданному порту (80).
  8. Настройка тестового скрипта PHP по заданному шаблону.

После выполнения плейбука у вас будет рабочая веб-среда PHP на Nginx, основанная на опциях, которые вы определили в переменных конфигурации.

Как использовать этот плейбук?

Первое, что нам нужно сделать – это получить плейбук LEMP и его зависимости из этого репозитория. Нам нужно клонировать этот репозиторий в локальную папку на главной ноде Ansible.

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

cd ~/ansible-playbooks
git pull

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

cd ~
git clone https://github.com/do-community/ansible-playbooks.git
cd ansible-playbooks

Интересующие нас файлы находятся в папке lemp_ubuntu1804, которая имеет следующую структуру:

lemp_ubuntu1804
├── files
│   ├── info.php.j2
│   └── nginx.conf.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

Вот что представляет собой каждый из этих файлов:

  • files/info.php.j2: файл шаблона для настройки тестовой страницы PHP в корневом каталоге веб-сервера.
  • files/nginx.conf.j2: шаблон для настройки Nginx.
  • vars/default.yml: файл переменных для настройки параметров плейбука.
  • playbook.yml: плейбук, содержащий задачи, которые должны быть выполнены на удаленном сервере.
  • readme.md: текстовый файл, содержащий информацию об этом плейбуке.

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

cd lemp_ubuntu1804
nano vars/default.yml

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

---
mysql_root_password: "mysql_root_password"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

Ниже вы найдете краткое описание этих переменных и того, как их можно изменить:

  • mysql_root_password: пароль для учетной записи root MySQL.
  • http_host: имя хоста или IP-адрес этого веб-сервера.
  • http_conf: имя конфигурационного файла, который будет создан в /etc/nginx/sites-available; обычно тут устанавливается имя хоста или приложения, чтоб найти файл было проще.
  • http_port: порт, который Nginx будет использовать для обслуживания этого сайта. По умолчанию это 80, но если вы хотите обслуживать свой сайт или приложение через другой порт, укажите его здесь.

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

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

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

ansible-playbook playbook.yml -l server1 -u root

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

PLAY [all] *****************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************
ok: [server1] TASK [Install Prerequisites] ***********************************************************************************************************
changed: [server1] => (item=aptitude)
...
TASK [UFW - Allow HTTP on port 80] *****************************************************************************************************
changed: [server1] TASK [Sets Up PHP Info Page] ***********************************************************************************************************
changed: [server1] RUNNING HANDLER [Reload Nginx] *********************************************************************************************************
changed: [server1] PLAY RECAP *****************************************************************************************************************************
server1         : ok=12   changed=9    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 и домен для настройки Nginx).

---
mysql_root_password: "mysql_root_password"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

Файл files/nginx.conf.j2

nginx.conf.j2 – это файл шаблона Jinja 2, который настраивает веб-сервер Nginx. Переменные, используемые в этом шаблоне, определены в файле vars/default.yml.

server {
listen {{ http_port }};
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name {{ http_host }};
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}

Файл files/info.php.j2

Файл info.php.j2 – это еще один шаблон Jinja, используемый для настройки тестового сценария PHP в корневом каталоге только настроенного сервера LEMP.

<?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' ] - name: Install LEMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'nginx', 'mysql-server', 'python3-pymysql', 'php-fpm', 'php-mysql' ] # Nginx Configuration
- name: Sets Nginx conf file
template:
src: "files/nginx.conf.j2"
dest: "/etc/nginx/sites-available/{{ http_conf }}"
- name: Enables new site
file:
src: "/etc/nginx/sites-available/{{ http_conf }}"
dest: "/etc/nginx/sites-enabled/{{ http_conf }}"
state: link
notify: Reload Nginx
- name: Removes "default" site
file:
path: "/etc/nginx/sites-enabled/default"
state: absent
notify: Reload Nginx
# 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
# Sets Up PHP Info Page
- name: Sets Up PHP Info Page
template:
src: "files/info.php.j2"
dest: "/var/www/html/info.php"
# Handlers
handlers:
- name: Reload Nginx
service:
name: nginx
state: reloaded
- name: Restart Nginx
service:
name: nginx
state: restarted

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

Заключение

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

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

Tags: , , , ,

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