One place for hosting & domains

      Automating Server Setup with Ansible: Набор материалов для тренинга DigitalOcean


      Материалы для проведения тренинга по автоматизации настройки сервера с помощью Ansible

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

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

      • Слайды и заметки для докладчика, включая короткие демонстрационные видеоматериалы и команды для запуска вспомогательного демонстрационного рабочего приложения. Длительность доклада составляет примерно 50 минут.
      • Репозиторий GitHub, содержащий код демоприложения и необходимые скрипты Ansible для развертывания этого приложения на сервере Ubuntu.
      • Данное руководство, которое знакомит пользователя с процессом развертывания демоприложения Travellist на базе Laravel на удаленном сервере.

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

      Введение

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

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

      Данное руководство, предназначенное для использования вместе со слайдами и замечаниями докладчика набора материалов для тренинга по автоматизации настройки сервера с помощью Ansible, демонстрирует, как настроить inventory-файл и выполнить набор скриптов для полной автоматизации процесса настройки удаленного сервера LEMP (Linux, ENginx, MariaDB и PHP-FPM) на Ubuntu 18.04, а также выполнить развертывание демонстрационного приложения Laravel для данной системы.

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

      Предварительные требования

      Для данного обучающего руководства вам потребуется следующее:

      Шаг 1 — Клонирование репозитория с демо

      Прежде всего вам необходимо клонировать репозиторий со скриптами конфигурирования 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

      Вывод будет выглядеть следующим образом:

      ansible-laravel-demo

      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/.

      Шаг 2 — Настройка inventory-файла и тестирование подключения к узлам

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

      • cp inventory-example hosts

      Теперь необходимо воспользоваться текстовым редактором по вашему выбору, чтобы открыть новый inventory-файл и обновить его на ваших серверах. Мы будем использовать nano:

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

      ansible-laravel-demo/hosts

      [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-подключение к узлам настроено корректно, вы получите следующий вывод:

      Output

      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 в используемом вами текстовом редакторе:

      ansible-laravel-demo/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. Переменные, которые вам необходимо обновить для каждой среды, указаны здесь:

      ansible-laravel-demo/group_vars/production

      ---
      # 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 Vault

      Если вы захотите поделиться своей настройкой 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) на вашем удаленном сервере (или серверах).

      Шаг 4 — Запуск плейбука LEMP

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

      ansible-laravel-demo/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

      Вывод будет выглядеть следующим образом:

      Output

      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, включенное в набор материалов, используя плейбук Ansible laravel-deploy.yml.

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

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

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

      Плейбук необходимо запускать с помощью пользователя 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 для шифрования файлов на предыдущем шаге.

      Вывод будет выглядеть следующим образом:

      Output

      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

      После завершения выполнения команды вы сможете получить доступ к демоприложению, указав в браузере доменное имя или IP-адрес вашего узла:

      http://node_domain_or_IP
      

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

      Демоприложение Travellist на базе Laravel

      Заключение

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



      Source link


      Leave a Comment