Использование Ansible для установки и настройки LAMP в Ubuntu 18.04

Введение

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

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

В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке Linux, Apache, MySQL и PHP (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 для автоматизации первоначальной настройки сервера в Ubuntu 18.04.

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

Что делает этот сценарий?

Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке Linux, Apache, MySQL и PHP (LAMP) в Ubuntu 18.04.

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

  1. Установка aptitude, инструмента, который в Ansible используется в качестве альтернативы диспетчеру пакетов apt.
  2. Установка необходимых пакетов LAMP.
  3. Создание нового VirtualHost Apache и настройка для него специального корневого каталога документов.
  4. Активация нового VirtualHost.
  5. Отключение используемого по умолчанию веб-сайта Apache, когда для переменной disable_default установлено значение true.
  6. Установка пароля для root-пользователя MySQL.
  7. Удаление анонимных учетных записей MySQL и тестовой базы данных.
  8. Настройка UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер 80).
  9. Настройка тестового скрипта 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 

Вы увидите подобную страницу:

страница phpinfo

Поскольку эта страница содержит чувствительную информацию о вашей среде 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 [email protected]    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.