Автоматизация настройки сервера с помощью Ansible

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

Читайте также: Основы управления конфигурациями

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

Этот мануал расскажет вам, как настроить файл инвентаризации и выполнить набор сценариев оркестровки, чтобы полностью автоматизировать процесс настройки удаленного сервера LEMP в Ubuntu 18.04 и подготовить его к развертыванию тестового приложения Laravel.

Примечание: Этот материал демонстрирует применение плейбуков для автоматизации настройки сервера с помощью Ansible. В этой демонстрации используется простое приложение Laravel, работающее на сервере LEMP. Мы рекомендуем вам адаптировать включенную в этот мануал настройку в соответствии с вашими потребностями.

Требования

1: Клонирование тестового репозитория

Первое, что нам нужно сделать, — это клонировать репозиторий, содержащий скрипты инициализации Ansible и тестовое приложение Laravel, которое мы развернем на удаленных серверах. Все необходимые файлы можно найти в этом репозитории Github.

Войдя на главную ноду Ansible как пользователь sudo, клонируйте репозиторий и перейдите в полученный каталог:

git clone https://github.com/do-community/ansible-laravel-demo.git
cd ansible-laravel-demo

Запустите команду ls, чтобы просмотреть содержимое каталога:

ls -l --group-directories-first

Вы получите такой результат:

drwxrwxr-x 3 8host 8host 4096 Mar 24 15:24 application
drwxrwxr-x 2 8host 8host 4096 Mar 24 15:24 group_vars
drwxrwxr-x 7 8host 8host 4096 Mar 24 15:24 roles
-rw-rw-r-- 1 8host 8host  102 Mar 24 15:24 inventory-example
-rw-rw-r-- 1 8host 8host 1987 Mar 24 15:24 laravel-deploy.yml
-rw-rw-r-- 1 8host 8host  794 Mar 24 15:24 laravel-env.j2
-rw-rw-r-- 1 8host 8host  920 Mar 24 15:24 readme.md
-rw-rw-r-- 1 8host 8host  318 Mar 24 15:24 server-setup.yml

В данном каталоге находятся такие файлы и папки:

  • application/: этот каталог содержит тестовое приложение Laravel, которое вы можете развернуть на сервере после оркестровки.
  • group_vars/: здесь хранятся файлы переменных, содержащие пользовательские параметры для настройки приложения (учетные данные БД, расположение файлов приложения на удаленном сервере и т.д.).
  • role/: этот каталог содержит роли Ansible, которые управляют оркестровкой LEMP для сервера Ubuntu.
  • inventory-example: этот файл можно использовать в качестве основы для пользовательской инвентаризации вашей инфраструктуры.
  • laravel-deploy.yml: этот плейбук развернет тестовое приложение Laravel на удаленном сервере.
  • laravel-env.j2: этот шаблон используется плейбуком laravel-deploy.yml для настройки файла среды приложения.
  • readme.md: этот файл содержит общую информацию об оркестровке, содержащейся в этом репозитории.
  • server-setup.yml: этот плейбук выполняет оркестровку сервера LEMP, используя роли, определенные в каталоге role/.

2: Настройка файла инвентаризации и тестирование соединения между нодами

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

cp inventory-example hosts

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

nano hosts

Данный инвентарь содержит две группы Ansible: dev и production. Этот инвентарь предназначен для демонстрации работы с групповыми переменными и настройки развертывания в нескольких средах. Если вы хотите протестировать эту настройку на одной ноде, вы можете использовать одну группу (либо dev, либо production), а вторую просто удалить из файла инвентаризации.

[dev]
203.0.113.0.101
[prod]
203.0.113.0.102
[all:vars]
ansible_python_interpreter=/usr/bin/python3

Примечание: Переменная ansible_python_interpreter определяет путь к исполняемому файлу Python на удаленном хосте. В нашем случае Ansible будет устанавливать эту переменную для всех хостов в этом файле инвентаризации.

Сохраните и закройте файл (Ctrl+X, затем Y и Enter).

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

ansible all -i hosts -m ping -u root

Давайте разберем эту команду по частям:

  • all: эта опция Ansible выполняет заданную команду на всех хостах из указанного файла инвентаризации.
  • -i hosts: определяет, какой инвентарь следует использовать. Если этот параметр не указан, Ansible попытается использовать инвентарь по умолчанию, который обычно находится в /etc/ansible/hosts.
  • -m ping: выполняет модуль Ansible ping, который проверяет подключение к нодам и выясняет, можно ли найти исполняемый файл Python в удаленных системах.
  • -u root: указывает удаленного пользователя, с помощью которого нужно подключаться к нодам. Здесь для примера мы используем учетную запись root, поскольку обычно это единственная учетная запись, доступная на всех свежих серверах. В зависимости от вашего провайдера инфраструктуры и конфигурации SSH вам могут потребоваться другие варианты подключения.

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

203.0.113.0.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
203.0.113.0.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}

Ответ pong означает, что главная нода может подключаться к управляемым нодам, а Ansible может выполнять команды Python на удаленных хостах.

3: Настройка файлов переменных

Перед запуском плейбуков нам нужно отредактировать файл переменной, который содержит имя создаваемого удаленного пользователя и учетные данные БД для подключения к MariaDB.

Откройте файл group_vars/all в текстовом редакторе:

nano group_vars/all.yml
---
# Initial Server Setup
remote_user: 8host
# MySQL Setup
mysql_root_password: MYSQL_ROOT_PASSWORD
mysql_app_db: travellist
mysql_app_user: travellist_user
mysql_app_pass: DB_PASSWORD
# Web Server Setup
http_host: "{{ ansible_facts.eth0.ipv4.address }}"
remote_www_root: /var/www
app_root_dir: travellist-demo
document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
# Laravel Env Variables
app_name: Travellist
app_env: dev
app_debug: true
app_url: "http://{{ http_host }}"
db_host: localhost
db_port: 3306
db_database: "{{ mysql_app_db }}"
db_user: "{{ mysql_app_user }}"
db_pass: "{{ mysql_app_pass }}"

Переменные, которые требуют вашего внимания:

  • remote_user: указанный пользователь будет создан на удаленном сервере и получит привилегии sudo.
  • mysql_root_password: определяет root-пароль сервера MariaDB. Обратите внимание, это должен быть сложный пароль.
  • mysql_app_db: имя создаваемой базы данных для приложения Laravel. Вам не нужно менять это значение, но вы можете сделать это, если хотите. Это значение будет использоваться для настройки конфигурационного файла Laravel .env.
  • mysql_app_user: имя пользователя базы данных для приложения Laravel. Опять же, менять это значение не обязательно, но при желании вы можете это сделать.
  • mysql_app_pass: пароль базы данных для приложения Laravel. Это должен быть сложный пароль на ваш выбор.
  • http_host: домен или IP-адрес удаленного хоста. Здесь мы используем факт Ansible, который содержит адрес ipv4 для сетевого интерфейса eth0. Если у вас есть домены, указывающие на ваши удаленные хосты, вы можете создать отдельные файлы переменных для каждого из них и переписать это значение так, чтобы конфигурация Nginx содержала правильное имя хоста для каждого сервера.

Сохраните и закройте файл.

Создание дополнительных файлов переменных для настройки нескольких сред

Если в файле инвентаря вы указали несколько нод, вы можете создать дополнительные файлы переменных для настройки каждой ноды. В данном примере инвентаря мы создали две отдельные группы: dev и production. Чтобы не использовать одинаковые учетные данные БД и другие параметры в обеих средах, нам нужно создать отдельный файл переменных для хранения значений группы production.

Вы можете скопировать файл переменных по умолчанию и использовать его в качестве основы вашего файла для группы production:

cp group_vars/all.yml group_vars/production.yml
nano group_vars/production.yml

Поскольку файл all.yml содержит значения по умолчанию, которые должны быть действительными для всех сред, вы можете удалить из нового файла production.yml все переменные, которые не нужно менять. Вот переменные, которые вы должны обновить для каждой среды:

---
# Initial Server Setup
remote_user: prod_user
# MySQL Setup
mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
mysql_app_pass: MYSQL_PROD_APP_PASSWORD
# Laravel Env Variables
app_env: prod
app_debug: false

Обратите внимание: мы изменили значение app_env на prod и установили в app_debug значение false. Это рекомендуемые настройки Laravel для среды производства.

Сохраните и закройте файл.

Шифрование файлов переменных с помощью Ansible Vault

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

Чтобы зашифровать файл для группы production, запустите:

ansible-vault encrypt group_vars/production.yml

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

Если вы хотите просмотреть файл переменных, не меняя его содержимое, вы можете использовать команду view:

ansible-vault view group_vars/production.yml

Вам будет предложено ввести тот пароль, который вы определили при шифровании этого файла с помощью ansible-vault. После ввода пароля содержимое файла появится в вашем терминале. Чтобы выйти из режима просмотра файла, введите q.

Чтобы отредактировать зашифрованный файл, используйте команду edit vault:

ansible-vault edit group_vars/production.yml

Эта команда предложит вам ввести пароль этого файла. Файл откроется для редактирования в редакторе терминала по умолчанию. После внесения необходимых изменений сохраните и закройте файл, и снова он будет зашифрован Ansible Vault автоматически.

Итак, мы закончили настройку файлов переменных. Далее мы запустим плейбук для настройки Nginx, PHP-FPM и MariaDB (что вместе с системой Linux,какой является Ubuntu, образуют стек LEMP) на удаленных серверах.

4: Запуск плейбука LEMP

Перед развертыванием тестового приложения Laravel на удаленных серверах нам необходимо настроить среду LEMP, которая будет обслуживать это приложение. Плейбук server-setup.yml включает в себя роли Ansible, необходимые для настройки этого стека. Чтобы проверить его содержимое, запустите эту команду:

cat server-setup.yml
---
- hosts: all
become: true
roles:
- { role: setup, tags: ['setup'] }
- { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
- { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
- { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
- { role: composer, tags: ['composer'] }

Вот обзор всех ролей, включенных в этот плейбук:

  • setup: содержит задачи, необходимые для создания нового системного пользователя и передачи ему привилегий sudo, а также для включения брандмауэра ufw.
  • mariadb: устанавливает сервер MariaDB и создает базу данных приложения и пользователя для нее.
  • php: устанавливает модули php-fpm и PHP, необходимые для запуска приложения Laravel.
  • nginx: устанавливает веб-сервер Nginx и открывает трафик через порт 80.
  • composer: устанавливает Composer глобально.

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

Следующая команда выполнит этот плейбук на всех серверах из вашего файла инвентаря. Флаг —ask-vault-pass необходим только в том случае, если вы использовали ansible-vault для шифрования файлов переменных на предыдущем этапе.

ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass

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

PLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [setup : Install Prerequisites] ********************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
...
RUNNING HANDLER [nginx : Reload Nginx] ******************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101             : ok=31   changed=27   unreachable=0    failed=0    skipped=0    rescued=0    ignored=1
203.0.113.0.102            : ok=31   changed=27   unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

Ваши ноды теперь готовы обслуживать приложения PHP с помощью Nginx+PHP-FPM и базы данных MariaDB. На следующем этапе мы развернем тестовое приложение Laravel с помощью плейбука laravel-deploy.yml.

5: Развертывание приложения Laravel

Теперь, когда на ваших удаленных серверах есть рабочая среда LEMP, вы можете запустить плейбук laravel-deploy.yml. Он выполнит следующие задачи:

  • Создание корневого каталога приложения на удаленном сервере, если он не был создан ранее.
  • Синхронизация локального каталога приложения с удаленным сервером с помощью модуля sync.
  • Установка привилегий для пользователя www-data в папке storage с помощью модуля acl.
  • Настройка файла приложения .env на основе шаблона laravel-env.j2.
  • Установка зависимостей приложения с помощью Composer.
  • Создание ключа безопасности приложения.
  • Установка публичной ссылки для папки storage.
  • Запуск миграций и сидеров базы данных.

Этот плейбук должен запускаться пользователем с правами sudo. Такой пользователь должен был быть создан при запуске плейбука server-setup.yml на предыдущем этапе (его имя определено в переменной remote_user).

Запустите плейбук laravel-deploy.yml с помощью этой команды:

ansible-playbook -i hosts laravel-deploy.yml -u 8host --ask-vault-pass

Напоминаем, что флаг —ask-vault-pass нужен только в том случае, если вы зашифровали файлы переменных с помощью ansible-vault.

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

PLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Make sure the remote app root exists and has the right permissions] *******************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Rsync application files to the remote server] *****************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
...
TASK [Run Migrations + Seeders] *************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101             : ok=10   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
203.0.113.0.102             : ok=10   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

После выполнения команды посетите свое приложение в браузере. Для этого введите в адресную строку:

http://node_domain_or_IP

Заключение

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

Tags: , , , , , ,

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