Developer Advocate
Материалы для проведения тренинга по автоматизации настройки сервера с помощью Ansible
Данный набор материалов для тренинга предназначен для ознакомления технических специалистов с понятиями управления конфигурацией и использованием Ansible для автоматизации настройки инфраструктуры сервера.
Его цель — предоставление полного набора ресурсов для докладчика при проведении мероприятия и выступления со вступительной речью, посвященной Ansible. Он включает следующее:
Руководство предназначено для предоставления дополнительных данных и пояснений при обсуждении демоприложения. Оно также служит справочником для читателей, которые хотят развернуть приложение Laravel на удаленном сервере Ubuntu с помощью Ansible.
Автоматизация сервера сегодня играет важнейшую роль в системном администрировании, что вызвано расходной природой современных сред приложений. Инструменты управления конфигурацией, такие как Ansible, обычно используются для придания гибкости процессу автоматизации настройки сервера с помощью организации стандартных процедур для новых серверов. Это полезно для снижения вызванных человеческим фактором ошибок, связанных с ручной настройкой.
Ansible предлагает упрощенную архитектуру, которая не требует установки специального программного обеспечения на узлах. Также он имеет широкий набор функций и встроенные модули, упрощающие написание скриптов автоматизации.
Данное руководство, предназначенное для использования вместе со слайдами и замечаниями докладчика набора материалов для тренинга по автоматизации настройки сервера с помощью Ansible, демонстрирует, как настроить inventory-файл и выполнить набор скриптов для полной автоматизации процесса настройки удаленного сервера LEMP (Linux, ENginx, MariaDB и PHP-FPM) на Ubuntu 18.04, а также выполнить развертывание демонстрационного приложения Laravel для данной системы.
Примечание. Этот материал предназначен для демонстрации использования плейбуков для автоматизации настройки сервера с помощью Ansible. Хотя наше демо включает приложение Laravel, запущенное на сервере LEMP, читатели могут вносить изменения и адаптировать указанную настройку согласно собственным потребностям.
Для данного обучающего руководства вам потребуется следующее:
authorized_keys
, как описано в шаге 2 руководства по настройке ключей SSH на Ubuntu 18.04. Если вы используете дроплеты DigitalOcean в качестве узлов, то можете воспользоваться контрольной панелью для добавления публичного ключа для ваших хостов Ansible.Прежде всего вам необходимо клонировать репозиторий со скриптами конфигурирования Ansible и демоприложением Laravel, которое мы будем развертывать на удаленных серверах. Все необходимые файлы можно найти в репозитории do-community/ansible-laravel-demo на Github.
После входа на контрольный узел Ansible с помощью вашего пользователя sudo клонируйте репозиторий и перейдите в директорию, созданную командой git
:
- git clone https://github.com/do-community/ansible-laravel-demo.git
- cd ansible-laravel-demo
Теперь вы можете запустить команду ls
для просмотра содержимого клонированного репозитория:
- ls -l --group-directories-first
Вывод будет выглядеть следующим образом:
drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
-rw-rw-r-- 1 sammy sammy 102 Mar 24 15:24 inventory-example
-rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
-rw-rw-r-- 1 sammy sammy 794 Mar 24 15:24 laravel-env.j2
-rw-rw-r-- 1 sammy sammy 920 Mar 24 15:24 readme.md
-rw-rw-r-- 1 sammy sammy 318 Mar 24 15:24 server-setup.yml
Ниже вы найдете описание каждой из этих папок и файлов и их значения:
application/
: эта директория содержит демоприложение Laravel, которое будет развернуто на удаленном сервере к концу тренинга.group_vars/
: эта директория содержит файлы с переменными, содержащие пользовательские опции настройки приложения, такие как учетные данные базы данных и место хранения файлов приложения на удаленном сервере.roles/
: эта директория содержит различные роли Ansible, которые определяют конфигурацию LEMP-сервера на Ubuntu.inventory-example
: этот файл может использоваться в качестве основы для создания пользовательского inventory-файла для вашей инфраструктуры.laravel-deploy.yml
: этот плейбук будет выполнять развертывание демоприложения Laravel на удаленном сервере.laravel-env.j2
: этот шаблон используется плейбуком laravel-deploy.yml
для настройки файла среды приложения.readme.md
: этот файл содержит общую информацию о конфигурации, содержащейся в этом репозитории.server-setup.yml
: этот плейбук будет выполнять конфигурацию сервера LEMP, используя роли, определенные в директории roles/
.Теперь мы создадим inventory-файл для просмотра списка хостов, которые мы будем администрировать с помощью Ansible. Сначала скопируйте файл inventory-example
в новый файл с именем hosts
:
- cp inventory-example hosts
Теперь необходимо воспользоваться текстовым редактором по вашему выбору, чтобы открыть новый inventory-файл и обновить его на ваших серверах. Мы будем использовать nano
:
- nano hosts
Пример inventory-файла, который входит в комплект материалов для тренинга, содержит две группы Ansible: dev
и production
. Это сделано для демонстрации использования переменных групп для настройки развертывания в разных средах. Если вы хотите протестировать эту настройку на отдельном узле, вы можете использовать группу dev
или production
и удалить другую группу из inventory-файла.
[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 задать эту переменную для всех хостов в этом inventory-файле.
Сохраните и закройте файл после завершения. Если вы использовали nano
, нажмите CTRL+X
, а затем Y
и ENTER
для подтверждения.
После внесения изменений в inventory-файл вы можете запустить модуль ping
в Ansible для тестирования возможности подключения узла к хостам:
- ansible all -i hosts -m ping -u root
Давайте разберем эту команду:
all
: эта опция просит Ansible запустить следующую команду для всех хостов из указанного inventory-файла.-i hosts
: указывает, какой inventory-файл необходимо использовать. Если эта опция не указана, Ansible будет пытаться использовать inventory-файл по умолчанию, который обычно находится в директории /etc/ansible/hosts
.-m ping
: эта опция запускает модуль ping
в Ansible, который будет тестировать подключение к узлам и проверять, находится ли исполняемый файл Python на удаленных системах.-u root
: этот опция указывает, какой удаленный пользователь должен использоваться для подключения к узлам. Здесь мы используем учетную запись root в качестве примера, поскольку это, как правило, единственная учетная запись, доступная на новых серверах. Другие опции подключения могут потребоваться в зависимости от поставщика инфраструктуры и конфигурации SSH.Если ваше SSH-подключение к узлам настроено корректно, вы получите следующий вывод:
Output203.0.113.0.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
203.0.113.0.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Вывод pong
означает, что ваш контрольный узел может подключаться к управляемым узлам и что Ansible может выполнять команды Python на удаленных хостах.
Перед запуском плейбуков, которые включены в этот комплект материалов для тренинга, вам необходимо будет сначала изменить файл с переменными, который содержит настройки, например, имя удаленного пользователя, которого необходимо создать, и учетные данные базы данных для настройки с помощью MariaDB.
Откройте файл group_vars/all
в используемом вами текстовом редакторе:
- nano group_vars/all.yml
---
# Initial Server Setup
remote_user: sammy
# 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 содержала корректное имя хоста для каждого сервера.Когда вы закончите редактирование этих значений, сохраните и закройте файл.
Если вы настроили ваш inventory-файл для нескольких узлов, вы, возможно, захотите создать дополнительные файлы с переменными для настройки каждого узла. В нашем примере inventory-файла мы создали две отдельные группы: 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
и задали значение false
для app_debug
. Это рекомендуемые настройки Laravel для среды production.
После завершения настройки переменных для production сохраните и закройте файл.
Если вы захотите поделиться своей настройкой Ansible с другими пользователями, необходимо обеспечить безопасность учетных данных базы данных и других конфиденциальных данных в ваших файлах с переменными. Это можно сделать с помощью Ansible Vault, утилиты, которая поставляется с Ansible по умолчанию. Ansible Vault позволяет вам шифровать файлы с переменными, чтобы только пользователи с доступом к паролю Vault могли просматривать, изменять или расшифровывать эти файлы. Пароль Vault также требуется для запуска плейбука или команды, которые используют шифрованные файлы.
Для шифрования вашего файла с переменными для production выполните следующую команду:
- ansible-vault encrypt group_vars/production.yml
Вам будет предложено ввести пароль Vault и подтвердить его. После этого, если вы решите просмотреть содержимое этого файла, вы увидите, что данные зашифрованы.
Если вы хотите просмотреть файл с переменными, не изменяя его содержимое, воспользуйтесь командой view
:
- ansible-vault view group_vars/production.yml
Вам будет предложено указать тот же пароль, который вы задали при шифровании этого файла с помощью ansible-vault
. После предоставления пароля содержимое файла появится в вашем терминале. Чтобы закрыть просмотр файла, введите q
.
Для редактирования файла, который ранее был зашифрован с помощью Ansible Vault, используйте команду edit
:
- ansible-vault edit group_vars/production.yml
Эта команда будет запрашивать пароль Vault для этого файла. Затем ваш редактор по умолчанию, поддерживающий работу в терминале, будет использован для открытия файла для редактирования. После внесения желаемых изменений сохраните и закройте файл, после чего он снова будет автоматически зашифрован в Ansible Vault.
Вы успешно завершили настройку ваших файлов с переменными. В следующем шаге мы запустим плейбук для настройки Nginx, PHP-FPM и MariaDB (которые, наряду с операционной системой на базе Linux, например Ubuntu, формируют стек 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.
Следующая команда будет запускать этот плейбук на всех серверах из вашего inventory-файла. --ask-vault-pass
требуется только в случае, если вы использовали ansible-vault
для шифрования файлов на предыдущем шаге:
- ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass
Вывод будет выглядеть следующим образом:
OutputPLAY [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, включенное в набор материалов, используя плейбук Ansible laravel-deploy.yml
.
Теперь, когда у вас есть рабочая среда LEMP на вашем удаленном сервере (серверах), вы можете запустить плейбук laravel-deploy.yml
. Этот плейбук выполняет следующие задачи:
sync
.acl
разрешений для пользователя www-data при работе с папкой хранилища..env
на основе шаблона laravel-env.j2
.storage
.Плейбук необходимо запускать с помощью пользователя non-root user с привилегиями sudo
. Этот пользователь был создан при запуске плейбука server-setup.yml
на предыдущем шаге, а его имя задано в переменной remote_user
.
Когда все будет готово, запустите плейбук laravel-deploy.yml
с помощью следующей команды:
- ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass
--ask-vault-pass
требуется только в случае, если вы использовали ansible-vault
для шифрования файлов на предыдущем шаге.
Вывод будет выглядеть следующим образом:
OutputPLAY [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
После завершения выполнения команды вы сможете получить доступ к демоприложению, указав в браузере доменное имя или IP-адрес вашего узла:
http://node_domain_or_IP
Вы увидите подобную страницу:
Это обучающее руководство демонстрирует процесс настройки inventory-файла Ansible и подключения к удаленным узлам, а также запуск плейбуков Ansible для настройки сервера LEMP и развертывания на нем демоприложения Laravel. Данное руководство служит дополнением к слайдам и заметкам для докладчика из набора материалов для тренинга по автоматизации настройки сервера с помощью Ansible и использует репозиторий GitHub, содержащий все необходимые файлы для выполнения демонстрации в рамках тренинга.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!