One place for hosting & domains

      настройки

      Использование миграции и пополнения базы данных для настройки абстрактной базы данных в Laravel


      Миграции и пополнения — это мощные утилиты для базы данных, предоставляемые PHP-фреймворком Laravel, которые позволяют разработчикам быстро инициализировать, уничтожать и воссоздавать базу данных приложения. Эти утилиты помогают свести к минимуму проблемы несогласованности базы данных, которые могут возникать, когда несколько разработчиков работают над одним приложением: новым участникам нужно будет запустить всего несколько команд artisan для настройки базы данных при новой установке.

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

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

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

      Примечание. В этом обучающем руководстве мы будем использовать контейнеризованную среду разработки под управлением Docker Compose для запуска приложения, но вы можете использовать приложение на сервере LEMP. Чтобы воспользоваться этим вариантом, ознакомьтесь с нашим руководством по установке и настройке Laravel с LEMP в Ubuntu 18.04.

      Шаг 1 — Получение демонстрационного приложения

      Вначале мы получим демонстрационное приложение Laravel из репозитория GitHub. Нас интересует раздел tutorial-02, который содержит настройку Docker Compose для запуска приложения в контейнерах. В данном примере мы загрузим приложение в домашнюю папку, но вы можете использовать любую директорию по вашему выбору:

      • cd ~
      • curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-2.0.1.zip -o travellist.zip

      Поскольку мы загрузили код приложения в виде файла .zip, нам нужно воспользоваться командой unzip для распаковки архива. Если вы не использовали эту программу в последнее время, обновите локальный индекс пакетов вашего компьютера:

      Затем выполните установку пакета unzip:

      Распакуйте содержимое приложения:

      Далее необходимо переименовать директорию на travellist-demo для удобства доступа:

      • mv travellist-laravel-demo-tutorial-2.0.1 travellist-demo

      На следующем шаге мы создадим файл конфигурации .env для настройки приложения.

      Шаг 2 — Настройка файла .env приложения

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

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

      Значения в файле .env имеют приоритет по отношению к значениям в обычных файлах конфигурации, расположенных в директории config. Для каждого случая установки в новую среду требуется персонализированный файл среды, где будут определены такие настройки, как параметры подключения к базе данных, параметры отладки, URL приложения и другие параметры, в зависимости от используемой для запуска приложения среды.

      Перейдите в директорию travellist-demo:

      Теперь мы создадим новый файл .env для настройки индивидуальных параметров конфигурации для создаваемой нами среды разработки. В комплектацию Laravel входит образец файла .env, который мы скопируем для создания собственного файла:

      Откройте этот файл с помощью nano или другого текстового редактора на ваш выбор:

      Теперь ваш файл .env выглядит следующим образом:

      .env

      APP_NAME=Travellist
      APP_ENV=dev
      APP_KEY=
      APP_DEBUG=true
      APP_URL=http://localhost:8000
      
      LOG_CHANNEL=stack
      
      DB_CONNECTION=mysql
      DB_HOST=db
      DB_PORT=3306
      DB_DATABASE=travellist
      DB_USERNAME=travellist_user
      DB_PASSWORD=password

      Текущий файл .env для демонстрационного приложения travellist содержит настройки для работы в контейнеризованной среде, которую мы создали с помощью Docker Compose в последней статье данной серии. Вам не обязательно вносить изменения в эти значения, но вы можете изменить значения DB_DATABASE, DB_USERNAME и DB_PASSWORD, если захотите, так как они автоматически подставляются из нашего файла docker-compose.yml для настройки базы данных разработки. Убедитесь, что переменная DB_HOST остается без изменений, поскольку она указывает имя нашей службы базы данных в среде Docker Compose.

      При внесении любых изменений в файл обязательно сохраните и закройте его, нажав CTRL + X, Y, а затем ENTER.

      Примечание. Если вы хотите запустить приложение на сервере LEMP, вам нужно изменить выделенные значения в соответствии с собственными настройками базы данных, включая значение переменной DB_HOST.

      Шаг 3 — Установка зависимостей приложения с помощью Composer

      Теперь мы воспользуемся Composer, инструментом для управления зависимостями PHP, чтобы установить зависимости приложения и обеспечить возможность выполнения команд artisan.

      Сформируйте вашу среду Docker Compose с помощью следующей команды. В результате будет создан образ travellist для службы app и добавлены дополнительные образы Docker, необходимые службам nginx и db, чтобы создать среду приложения:

      Output

      Creating network "travellist-demo_travellist" with driver "bridge" Building app Step 1/11 : FROM php:7.4-fpm ---> fa37bd6db22a Step 2/11 : ARG user ---> Running in 9259bb2ac034 … Creating travellist-app ... done Creating travellist-nginx ... done Creating travellist-db ... done

      Выполнение этой операции может занять несколько минут. После завершения процесса мы сможем запустить Composer для установки зависимостей приложения.

      Для выполнения composer и других команд в контейнере службы app мы будем использовать docker-compose exec. Команда exec позволяет нам выполнять любую команду по нашему выбору в контейнерах под управлением Docker Compose. Она имеет следующий синтаксис: docker-compose exec service_name command.

      Примечание. Если вы предпочитаете использовать сервер LEMP для запуска демонстрационного приложения, можно проигнорировать часть docker-compose exec app для команд, представленных в рамках этого руководства. Например, вместо запуска следующей команды, как она написана, вы можете использовать следующую команду:

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

      • docker-compose exec app composer install

      Output

      Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Package operations: 85 installs, 0 updates, 0 removals - Installing doctrine/inflector (1.3.1): Downloading (100%) - Installing doctrine/lexer (1.2.0): Downloading (100%) - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%) …

      Когда Composer выполнит установку зависимостей приложения, вы сможете выполнять команды artisan. Чтобы убедиться, что приложение сможет подключиться к базе данных, выполните следующую команду, которая выполняет очистку всех существующих таблиц:

      • docker-compose exec app php artisan db:wipe

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

      Output

      Dropped all tables successfully.

      Теперь, когда вы установили зависимости приложения с помощью Composer, вы можете использовать инструмент artisan для создания миграций и пополнений.

      Шаг 4 — Создание миграций базы данных

      Инструмент командной строки artisan, предоставляемый вместе с Laravel, содержит ряд вспомогательных команд, которые могут использоваться для управления приложением и загрузки новых классов. Чтобы сгенерировать новый класс миграции, мы можем использовать команду make:migration следующим образом:

      • docker-compose exec app php artisan make:migration create_places_table

      Laravel выводит операцию, которую необходимо выполнить (create), имя таблицы (places), а также то, будет ли эта миграция создавать новую таблицу или нет, на основе описательного имени, предоставленного команде make:migration.

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

      Output

      Created Migration: 2020_02_03_143622_create_places_table

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

      Используйте предпочитаемый вами текстовый редактор для открытия сгенерированного файла миграции. Обязательно замените выделенное значение на имя вашего файла миграции:

      • nano database/migrations/2020_02_03_143622_create_places_table.php

      Сгенерированный файл миграции содержит класс CreatePlacesTable:

      database/migrations/2020_02_03_143622_create_places_table.php

      <?php
      
      use IlluminateDatabaseMigrationsMigration;
      use IlluminateDatabaseSchemaBlueprint;
      use IlluminateSupportFacadesSchema;
      
      class CreatePlacesTable extends Migration
      {
          /**
           * Run the migrations.
           *
           * @return void
           */
          public function up()
          {
              Schema::create('places', function (Blueprint $table) {
                  $table->bigIncrements('id');
                  $table->timestamps();
              });
          }
      
          /**
           * Reverse the migrations.
           *
           * @return void
           */
          public function down()
          {
              Schema::dropIfExists('places');
          }
      }
      
      

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

      Мы изменим метод up так, чтобы таблица places имела структуру, которую мы уже использовали в текущей версии приложения:

      • id: поле первичного ключа.
      • name: название места.
      • visited: было ли посещено это место или нет.

      Конструктор схемы Laravel предоставляет методы для создания, обновления и удаления таблиц в базе данных. Класс Blueprint определяет структуру таблицы и предоставляет несколько методов для абстракции определения каждого поля таблицы.

      Автоматически генерируемый код задает поле основного идентификатора id. Метод timestamps создает два поля datetime, которые автоматически обновляются классами соответствующей базы данных, когда данные помещаются в таблицу или обновляются. Помимо этого, нам потребуется добавить поля name и visited.

      Наше поле name будет иметь тип string, а для поля visited будет установлен тип boolean. Также мы зададим значение по умолчанию 0 для поля visited, так что если значение не будет передано, это будет означать, что место пока не посещено. Вот как в настоящий момент выглядит метод up:

      database/migrations/2020_02_03_143622_create_places_table.php

      …
          public function up()
          {
              Schema::create('places', function (Blueprint $table) {
                  $table->bigIncrements('id');
                  $table->string('name', 100);
                  $table->boolean('visited')->default(0);
                  $table->timestamps();
              });
          }
      …
      

      Примечание. Вы можете найти полный список доступных типов столбцов в документации Laravel.

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

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

      Шаг 5 — Создание пополнений для базы данных

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

      Теперь мы воспользуемся командой artisan, которая генерирует новый класс seeder для нашей таблицы places с названием PlacesTableSeeder:

      • docker-compose exec app php artisan make:seeder PlacesTableSeeder

      Команда будет создавать новый файл с именем PlacesTableSeeder.php внутри директории database/seeds. Откройте этот файл в текстовом редакторе по выбору:

      • nano database/seeds/PlacesTableSeeder.php

      Вот как выглядит автоматически сгенерированный файл PlacesTableSeeder.php:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      
      class PlacesTableSeeder extends Seeder
      {
          /**
           * Run the database seeds.
           *
           * @return void
           */
          public function run()
          {
              //
          }
      }
      
      

      Наш новый класс seeder содержит пустой метод с именем run. Этот метод будет вызываться при выполнении команды db:seed Artisan.

      Нам нужно изменить метод run, чтобы включить инструкции по вставке примеров данных в базу данных. Мы воспользуемся конструктором запросов Laravel для организации этого процесса.

      Конструктор запросов Laravel предоставляет гибкий интерфейс для операций с базами данных, например, для вставки, обновления и восстановления данных. Также он обеспечивает защиту от внедрения SQL-кода. Конструктор запросов определяется фасадом DB, статическим прокси для классов базы данных в контейнере службы.

      Для начала мы создадим переменную статического класса, хранящую все примеры мест, которые мы хотим вставить в базу данных в форме массива. Это позволит нам использовать цикл foreach для итерации по всем значениям, вставляя все эти значения в базу данных с помощью конструктора запросов.

      Мы назовем эту переменную $places:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      
      class PlacesTableSeeder extends Seeder
      {
          static $places = [
              'Berlin',
              'Budapest',
              'Cincinnati',
              'Denver',
              'Helsinki',
              'Lisbon',
              'Moscow',
              'Nairobi',
              'Oslo',
              'Rio',
              'Tokyo'
          ];

      Далее нам потребуется включить оператор use сверху класса PlacesTableSeeder, чтобы проще ссылаться на фасад DB в коде:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      use IlluminateSupportFacadesDB;
      
      class PlacesTableSeeder extends Seeder
      …
      

      Теперь мы можем пробежаться по значениям массива $places с помощью цикла foreach и добавить их в нашу таблицу places с помощью конструктора запросов:

      database/seeds/PlacesTableSeeder.php

      …
          public function run()
          {
              foreach (self::$places as $place) {
                  DB::table('places')->insert([
                      'name' => $place,
                      'visited' => rand(0,1) == 1
                  ]);
              }
          }
      
      

      Цикл foreach проходит по каждому значению статического массива $places. В каждой итерации мы используем фасад DB для добавления новой строки в таблице places. Мы сохраним в поле name название места, которое мы только что получили из массива $places, а для поля visited будет использоваться случайное значение 0 или 1.

      Класс PlacesTableSeeder будет выглядеть следующим образом после всех обновлений:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      use IlluminateSupportFacadesDB;
      
      class PlacesTableSeeder extends Seeder
      {
          static $places = [
              'Berlin',
              'Budapest',
              'Cincinnati',
              'Denver',
              'Helsinki',
              'Lisbon',
              'Moscow',
              'Nairobi',
              'Oslo',
              'Rio',
              'Tokyo'
          ];
      
          /**
           * Run the database seeds.
           *
           * @return void
           */
          public function run()
          {
              foreach (self::$places as $place) {
                  DB::table('places')->insert([
                      'name' => $place,
                      'visited' => rand(0,1) == 1
                  ]);
              }
          }
      }
      

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

      Классы типа seeder не загружаются автоматически в приложение. Нам нужно изменить главный класс DatabaseSeeder, чтобы добавить вызов класса типа seeder, который мы только что создали.

      Откройте файл database/seeds/DatabaseSeeder.php с помощью nano или вашего любимого редактора:

      • nano database/seeds/DatabaseSeeder.php

      Класс DatabaseSeeder выглядит стандартным образом: он наследуется от класса Seeder и имеет метод run. Мы обновим этот метод, чтобы включить PlacesTableSeeder.

      Обновите текущий метод run внутри вашего класса DatabaseSeeder, удалив закомментированную строку и заменив ее на следующий выделенный код:

      database/seeds/DatabaseSeeder.php

      …
          public function run()
          {
              $this->call(PlacesTableSeeder::class);
          }
      ...
      

      Так будет выглядеть класс DatabaseSeeder после обновления:

      database/seeds/DatabaseSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      
      class DatabaseSeeder extends Seeder
      {
          /**
           * Seed the application's database.
           *
           * @return void
           */
          public function run()
          {
              $this->call(PlacesTableSeeder::class);
          }
      }
      
      
      

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

      Мы завершили настройку миграции и наполнения для нашей таблицы places. На следующем шаге мы узнаем, как их запускать.

      Шаг 6 — Запуск миграции и наполнения базы данных

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

      Чтобы сгенерировать ключ шифрования, требуемый Laravel, вы можете использовать команду artisan key:generate:

      • docker-compose exec app php artisan key:generate

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

      http://server_host_or_ip:8000
      

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

      Ошибка MySQL

      Это означает, что приложение может подключаться к базе данных, но оно не может найти таблицу с именем places. Теперь мы создадим таблицу places, используя следующую команду migrate artisan:

      • docker-compose exec app php artisan migrate

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

      Output

      Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.06 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.06 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds) Migrating: 2020_02_10_144134_create_places_table Migrated: 2020_02_10_144134_create_places_table (0.03 seconds)

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

      На данный момент наша таблица пустая. Нам нужно запустить команду db:seed, чтобы наполнить базу данных нашими выбранными местами:

      • docker-compose exec app php artisan db:seed

      В результате будет запущен наш класс seeder и будут добавлены образцы значений, которые мы определили в нашем классе PlacesTableSeeder. Вывод будет выглядеть следующим образом:

      Output

      Seeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.

      Теперь перезагрузите страницу приложения в браузере. Вы увидите приблизительно следующую страницу:

      Демонстрационное приложение Laravel

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

      • docker-compose exec app php artisan db:wipe

      Output

      Dropped all tables successfully.

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

      • docker-compose exec app php artisan migrate --seed

      Output

      Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.06 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.07 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds) Migrating: 2020_02_10_144134_create_places_table Migrated: 2020_02_10_144134_create_places_table (0.03 seconds) Seeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.

      Если вы захотите откатить изменения, запустите следующую команду:

      • docker-compose exec app php artisan migrate:rollback

      В результате будет запущен метод down для каждого класса миграции внутри папки migrations. Как правило, он удаляет все таблицы, созданные в классах миграции, оставляя все остальные таблицы, которые могли быть созданы вручную. Вывод будет выглядеть следующим образом:

      Output

      Rolling back: 2020_02_10_144134_create_places_table Rolled back: 2020_02_10_144134_create_places_table (0.02 seconds) Rolling back: 2019_08_19_000000_create_failed_jobs_table Rolled back: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds) Rolling back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_100000_create_password_resets_table (0.02 seconds) Rolling back: 2014_10_12_000000_create_users_table Rolled back: 2014_10_12_000000_create_users_table (0.02 seconds)

      Команда отката изменений особенно полезна, когда вы вносите изменения в модели приложения, а команда db:wipe не может использоваться, например, если несколько систем используют одну базу данных.

      Заключение

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

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



      Source link

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


      Введение

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

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

      В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке Linux, Apache, MySQL и PHP (LAMP) в Ubuntu 18.04. Комплект LAMP — это набор программного обеспечения с открытым исходным кодом, которое обычно устанавливается в комплексе для размещения на сервере динамических сайтов и веб-приложений. Этот термин представляет собой аббревиатуру. Операционная система Linux используется с веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, а за обработку динамического контента отвечает PHP.

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

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

      Прежде чем продолжить, вам нужно убедиться, что ваш узел управления 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 webmaster@localhost
         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.



      Source link

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


      Введение

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

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

      В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке WordPress с LAMP в Ubuntu 18.04. WordPress — это самая популярная CMS (система управления контентом) в сети Интернет, которая позволяет пользователям создавать гибкие блоги и веб-сайты поверх бекэнда в виде базы данных MySQL и с обработкой PHP. После настройки практически все административные функции доступны через пользовательский веб-интерфейс.

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

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

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

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

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

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

      1. Установите aptitude, инструмент, который в Ansible используется в качестве альтернативы диспетчеру пакетов apt.
      2. Установите необходимые пакеты LAMP и расширения PHP.
      3. Создайте и активируйте новый VirtualHost для веб-сайта WordPress.
      4. Активируйте модуль rewrite (mod_rewrite) Apache.
      5. Отключите заданный по умолчанию веб-сайт Apache.
      6. Установите пароль для root-пользователя MySQL.
      7. Удалите анонимные учетные записи MySQL и тестовую базу данных.
      8. Создайте новую базу данных MySQL и пользователя для веб-сайта WordPress.
      9. Настройте UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер 80).
      10. Загрузите и распакуйте WordPress.
      11. Укажите корректные права владения и разрешения для директории.
      12. Настройте файл wp-config.php с помощью предоставленного шаблона.

      После завершения запуска сценария вы получите установку WordPress, запущенную поверх среды LAMP, в соответствии с опциями, которые вы определили внутри переменных конфигурации.

      Как использовать этот сценарий

      В первую очередь нам нужно получить сценарий WordPress с 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

      Файлы, которые нас интересуют, находятся в папке wordpress-lamp_ubuntu1804, которая имеет следующую структуру:

      wordpress-lamp_ubuntu1804
      ├── files
      │   ├── apache.conf.j2
      │   └── wp-config.php.j2
      ├── vars
      │   └── default.yml
      ├── playbook.yml
      └── readme.md
      

      Ниже представлены все эти файлы:

      • files/apache.conf.j2: шаблон для настройки Apache VirtualHost.
      • files/wp-config.php.j2: шаблон для настройки файла конфигурации WordPress.
      • vars/default.yml: файл переменных для настройки параметров сценария.
      • playbook.yml: файл сценария, содержащий задачи, которые будут выполняться на удаленном сервере (или серверах).
      • readme.md: текстовый файл, содержащий информацию об этом сценарии.

      Мы изменим файл переменных сценария для настройки его параметров. Перейдите в директорию wordpress-lamp_ubuntu1804 и откройте файл vars/default.yml с помощью вашего редактора командной строки:

      • cd wordpress-lamp_ubuntu1804
      • nano vars/default.yml

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

      vars/default.yml

      ---
      #System Settings
      php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
      
      #MySQL Settings
      mysql_root_password: "mysql_root_password"
      mysql_db: "wordpress"
      mysql_user: "sammy"
      mysql_password: "password"
      
      #HTTP Settings
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      

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

      • php_modules: массив, содержащий расширения PHP, которые необходимо установить для обеспечения работоспособности вашей установки WordPress. Вам не нужно изменять эту переменную, но вам может потребоваться добавить новые расширения в список, если для вашей конкретной установки это требуется.
      • mysql_root_password: желаемый пароль для учетной записи root MySQL.
      • mysql_db: имя базы данных MySQL, которая должна быть создана для WordPress.
      • mysql_user: имя пользователя MySQL, который должен быть создан для WordPress.
      • mysql_password: пароль для нового пользователя MySQL.
      • http_host: ваше доменное имя.
      • http_conf: имя файла конфигурации, который будет создан в Apache.
      • http_port: HTTP-порт для этого виртуального хоста, где 80 — это значение по умолчанию.

      После завершения обновления переменных в 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] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

      Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.

      После завершения работы сценария вы можете перейти в браузер для завершения установки WordPress оттуда.

      Перейдите на домен сервера или публичный IP-адрес:

      http://server_host_or_IP
      

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

      Страница выбора языка WordPress

      После выбора языка, который вы хотите использовать для установки WordPress, вы перейдете к финальному этапу настройки пользователя и пароля WordPress для входа в панель управления:

      Установка WordPress

      При нажатии далее вы перейдете на страницу входа:

      Запрос данных для входа в WP

      После входа вы перейдете в панель управления WordPress:

      Панель администратора WP

      Список стандартных действий по настройке вашей установки WordPress включает выбор параметров постоянных ссылок для ваших постов (см. Settings > Permalinks) и выбор новой темы (Appearance > Themes).

      Содержание сценария

      Вы можете найти файлы для установки сервера WordPress on LAMP, который мы обсуждаем в данном руководстве, в папке wordpress-lamp_ubuntu1804 внутри репозитория DigitalOcean Community Playbooks. Чтобы скопировать или загрузить содержимое скриптов напрямую, нажмите кнопку Raw сверху каждого скрипта.

      Полное содержимое сценария, как и связанные файлы, также находятся здесь для удобства.

      vars/default.yml

      Файл переменных default.yml содержит значения, используемые в задачах сценария, в том числе параметры базы данных и доменное имя для настройки в Apache.

      vars/default.yml

      #System Settings
      php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
      
      #MySQL Settings
      mysql_root_password: "mysql_root_password"
      mysql_db: "wordpress"
      mysql_user: "sammy"
      mysql_password: "password"
      
      #HTTP Settings
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      

      files/apache.conf.j2

      Файл apache.conf.j2 — это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml.

      files/apache.conf.j2

      <VirtualHost *:{{ http_port }}>
         ServerAdmin webmaster@localhost
         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/wp-config.php.j2

      Файл wp-config.php.j2 — это другой шаблон Jinja, используемый для настройки основного файла конфигурации, который используется WordPress. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml. Уникальные ключи аутентификации и секретные ключи генерируются с помощью hash-функции.

      files/info.php.j2

      <?php
      /**
       * The base configuration for WordPress
       *
       * The wp-config.php creation script uses this file during the
       * installation. You don't have to use the web site, you can
       * copy this file to "wp-config.php" and fill in the values.
       *
       * This file contains the following configurations:
       *
       * * MySQL settings
       * * Secret keys
       * * Database table prefix
       * * ABSPATH
       *
       * @link https://codex.wordpress.org/Editing_wp-config.php
       *
       * @package WordPress
       */
      
      // ** MySQL settings - You can get this info from your web host ** //
      /** The name of the database for WordPress */
      define( 'DB_NAME', '{{ mysql_db }}' );
      
      /** MySQL database username */
      define( 'DB_USER', '{{ mysql_user }}' );
      
      /** MySQL database password */
      define( 'DB_PASSWORD', '{{ mysql_password }}' );
      
      /** MySQL hostname */
      define( 'DB_HOST', 'localhost' );
      
      /** Database Charset to use in creating database tables. */
      define( 'DB_CHARSET', 'utf8' );
      
      /** The Database Collate type. Don't change this if in doubt. */
      define( 'DB_COLLATE', '' );
      
      /** Filesystem access **/
      define('FS_METHOD', 'direct');
      
      /**#@+
       * Authentication Unique Keys and Salts.
       *
       * Change these to different unique phrases!
       * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
       * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
       *
       * @since 2.6.0
       */
      define( 'AUTH_KEY',         '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'SECURE_AUTH_KEY',  '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'LOGGED_IN_KEY',    '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'NONCE_KEY',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'AUTH_SALT',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'SECURE_AUTH_SALT', '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'LOGGED_IN_SALT',   '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'NONCE_SALT',       '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      
      /**#@-*/
      
      /**
       * WordPress Database Table prefix.
       *
       * You can have multiple installations in one database if you give each
       * a unique prefix. Only numbers, letters, and underscores please!
       */
      $table_prefix = 'wp_';
      
      /**
       * For developers: WordPress debugging mode.
       *
       * Change this to true to enable the display of notices during development.
       * It is strongly recommended that plugin and theme developers use WP_DEBUG
       * in their development environments.
       *
       * For information on other constants that can be used for debugging,
       * visit the Codex.
       *
       * @link https://codex.wordpress.org/Debugging_in_WordPress
       */
      define( 'WP_DEBUG', false );
      
      /* That's all, stop editing! Happy publishing. */
      
      /** Absolute path to the WordPress directory. */
      if ( ! defined( 'ABSPATH' ) ) {
          define( 'ABSPATH', dirname( __FILE__ ) . '/' );
      }
      
      /** Sets up WordPress vars and included files. */
      require_once( ABSPATH . 'wp-settings.php' );
      
      

      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=aptitude update_cache=yes state=latest force_apt_get=yes
            tags: [ system ]
      
          - name: Install LAMP Packages
            apt: name={{ item }} update_cache=yes state=latest
            loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
            tags: [ system ]
      
          - name: Install PHP Extensions
            apt: name={{ item }} update_cache=yes state=latest
            loop: "{{ php_modules }}"
            tags: [ system ]
      
        # Apache Configuration
          - name: Create document root
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              owner: "www-data"
              group: "www-data"
              mode: '0755'
            tags: [ apache ]
      
          - name: Set up Apache VirtualHost
            template:
              src: "files/apache.conf.j2"
              dest: "/etc/apache2/sites-available/{{ http_conf }}"
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Enable rewrite module
            shell: /usr/sbin/a2enmod rewrite
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Enable new site
            shell: /usr/sbin/a2ensite {{ http_conf }}
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Disable default Apache site
            shell: /usr/sbin/a2dissite 000-default.conf
            notify: Restart Apache
            tags: [ apache ]
      
        # MySQL Configuration
          - name: Set the root password
            mysql_user:
              name: root
              password: "{{ mysql_root_password }}"
              login_unix_socket: /var/run/mysqld/mysqld.sock
            tags: [ mysql, mysql-root ]
      
          - name: Remove all anonymous user accounts
            mysql_user:
              name: ''
              host_all: yes
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Remove the MySQL test database
            mysql_db:
              name: test
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Creates database for WordPress
            mysql_db:
              name: "{{ mysql_db }}"
              state: present
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Create MySQL user for WordPress
            mysql_user:
              name: "{{ mysql_user }}"
              password: "{{ mysql_password }}"
              priv: "{{ mysql_db }}.*:ALL"
              state: present
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
        # UFW Configuration
          - name: "UFW - Allow HTTP on port {{ http_port }}"
            ufw:
              rule: allow
              port: "{{ http_port }}"
              proto: tcp
            tags: [ system ]
      
        # WordPress Configuration
          - name: Download and unpack latest WordPress
            unarchive:
              src: https://wordpress.org/latest.tar.gz
              dest: "/var/www/{{ http_host }}"
              remote_src: yes
              creates: "/var/www/{{ http_host }}/wordpress"
            tags: [ wordpress ]
      
          - name: Set ownership
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              recurse: yes
              owner: www-data
              group: www-data
            tags: [ wordpress ]
      
          - name: Set permissions for directories
            shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \;"
            tags: [ wordpress ]
      
          - name: Set permissions for files
            shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \;"
            tags: [ wordpress ]
      
          - name: Set up wp-config
            template:
              src: "files/wp-config.php.j2"
              dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
            tags: [ wordpress ]
      
        handlers:
          - name: Reload Apache
            service:
              name: apache2
              state: reloaded
      
          - name: Restart Apache
            service:
              name: apache2
              state: restarted
      

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

      Заключение

      В этом руководстве мы использовали Ansible для автоматизации процесса установки и настройки веб-сайта WordPress с LAMP на сервере Ubuntu 18.04.

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



      Source link