Автоматизация установки и удаления LAMP-стека с помощью Ansible

—

от автора

В этом руководстве мы рассмотрим, как автоматизировать установку и удаление LAMP-стека (Linux, Apache, MySQL, PHP) с помощью Ansible. Ansible — это инструмент автоматизации с открытым исходным кодом, который позволяет вам определять инфраструктуру и управлять ею как кодом.

Введение

Стек LAMP — это популярный пакет программного обеспечения, используемый для развертывания веб-приложений. Он состоит из следующих компонентов:

  • Linux: операционная система (в данном случае мы используем инстанс Amazon Linux).

  • Apache: веб-сервер, отвечающий за обслуживание веб-контента.

  • MySQL/MariaDB: система управления реляционными базами данных для хранения данных приложений.

  • PHP: серверный язык сценариев для динамического веб-контента.

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

Что понадобится

Прежде чем мы начнем, убедитесь, что у вас есть:

  • Экземпляр Amazon Linux с установленным Ansible.

  • Доступ к сервису AWS Secrets Manager.

Создание Ansible Playbook

Начнем с создания плейбука Ansible, который установит стек LAMP и настроит компоненты.

--- - name: "Installing LAMP stack and configuring"   hosts: amazon   become: true   vars_files:     - httpd.vars     - mariadb.vars     - packages.vars   tasks:     # Task 1: Installing Packages     - name: "Installing Packages"       yum:         name: "{{ packages }}"         state: present       tags:         - lamp         - never      # Task 2: Enabling/Restarting services     - name: "Enabling/Restarting services"       service:         name: "{{ item }}"         state: restarted         enabled: true       with_items: "{{ services }}"       tags:         - lamp         - never      # Task 3: Creating httpd.conf from template     - name: "Creating httpd.conf from httpd.conf.tmpl"       template:         src: httpd.conf.tmpl         dest: /etc/httpd/conf/httpd.conf       tags:         - lamp         - never      # Task 4: Creating Virtual host     - name: "Creating Virtual host"       template:         src: virtualhost.conf.tmpl         dest: /etc/httpd/conf.d/default.conf         owner: "{{ httpd_owner }}"         group: "{{ httpd_group }}"       tags:         - lamp         - never      # Task 5: Creating docroot for the website     - name: "Creating docroot for {{ hostname }}"       file:         path: "/var/www/html/default/"         state: directory         owner: "{{ httpd_owner }}"         group: "{{ httpd_group }}"       tags:         - lamp         - never      # Task 6: Setting python3 mysql module PyMySQL     - name: "Setting python3 mysql module PyMySQL"       pip:         name: PyMySQL       tags:         - lamp         - mariadb         - never      # Task 7: Setting ROOT password for mariadb-server     - name: "Setting ROOT password for mariadb-server"       ignore_errors: true       mysql_user:         login_user: "root"         login_password: ""         login_unix_socket: /var/lib/mysql/mysql.sock         name: "root"         password: "{{ mariadb_root_password }}"       tags:         - lamp         - mariadb         - never      # Task 8: Creating DB for the website     - name: "Creating DB for blog - {{blog_db_name}}"       mysql_db:         login_user: "root"         login_password: "{{ mariadb_root_password }}"         login_unix_socket: /var/lib/mysql/mysql.sock         name: "{{ blog_db_name }}"         state: present       tags:         - lamp         - mariadb         - never      # Task 9: Creating extra user for WordPress     - name: "Creating extra user for WordPress - {{extra_user_name}}"       mysql_user:         login_user: "root"         login_password: "{{ mariadb_root_password }}"         login_unix_socket: /var/lib/mysql/mysql.sock         name: "{{ extra_user_name }}"         password: "{{ extra_user_password }}"         host: "%"         priv: "{{ blog_db_name }}.*:ALL"       tags:         - lamp         - never         - mariadb      # Task 10: Downloading WordPress     - name: "Downloading WordPress using URL"       get_url:         url: "{{ wp_url }}"         dest: "/tmp/wordpress.tar.gz"       tags:         - lamp         - mariadb         - wordpress         - never      # Task 11: Extracting WordPress     - name: "Extracting WordPress"       unarchive:         src: "/tmp/wordpress.tar.gz"         dest: "/tmp/"         remote_src: true       tags:         - lamp         - mariadb         - wordpress         - never      # Task 12: Copying WordPress files to docroot     - name: "Copying WordPress files to docroot"       copy:         src: "/tmp/wordpress/"         dest: "/var/www/html/default/"         remote_src: true         owner: "{{ httpd_owner }}"         group: "{{ httpd_group }}"       tags:         - lamp         - mariadb         - wordpress         - never      # Task 13: Copying wp-config.php file to remote server     - name: "Copying wp-config.php file to remote server"       template:         src: "./wp-config.php.tmpl"         dest: "/var/www/html/default/wp-config.php"         owner: "{{ httpd_owner }}"         group: "{{ httpd_group }}"       tags:         - lamp         - mariadb         - wordpress         - never      # Task 14: Post Installation Cleanup     - name: "Post Installation Cleanup"       file:         path: "{{ item }}"         state: absent       with_items:         - "/tmp/wordpress/"         - "/tmp/wordpress.tar.gz"       tags:         - wordpress      # Task 15: Removing Packages     - name: "Removing Packages"       yum:         name: "{{ packages }}"         state: absent       tags:         - cleanup         - never      # Task 16: Removing Directories     - name: "Removing Directories"       file:         path: "{{ item }}"         state: absent       with_items:         - /etc/httpd/conf/httpd.conf         - /etc/httpd/conf.d/default.conf         - /var/www/html/default/       tags:         - cleanup         - never

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

  • Задача 1: Установка пакетов: устанавливает необходимые пакеты для стека LAMP.

  • Задача 2. Включение/перезапуск служб. Обеспечивает включение и перезапуск необходимых служб.

  • Задача 3: Создание httpd.conf из шаблона: Генерирует файл конфигурации HTTP-сервера Apache из шаблона.

  • Задача 4. Создание виртуального хоста. Создает файл конфигурации виртуального хоста для веб-сайта по умолчанию.

  • Задача 5: Создание docroot для веб-сайта: Создает корневой каталог документов для веб-сайта.

  • Задача 6: Настройка модуля python3 mysql PyMySQL: Устанавливает модуль PyMySQL для Python.

  • Задача 7: Установка пароля ROOT для mariadb-server: Установка пароля root для сервера MariaDB.

  • Задача 8: Создание БД для сайта.

  • Задача 9: Создание дополнительного пользователя с привилегиями для базы данных WordPress.

  • Задача 10: Загрузка WordPress: получение исходного кода WordPress по указанному URL-адресу.

  • Задача 11: Извлечение архива WordPress.

  • Задача 12: Копирование файлов WordPress в корневой каталог документа.

  • Задача 13: Копирование файла wp-config.php на удаленный сервер: Создает файл wp-config.php для WordPress.

  • Задача 14: Очистка после установки: очищает временные файлы и каталоги.

  • Задача 15. Удаление пакетов, которые были установлены в процессе.

  • Задача 16: Удаление каталогов, которые были созданы в процессе.

Теги

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

Для запуска определенных задач с использованием тегов вы можете использовать опцию --tags с командойansible-playbook. Вот пример команды:

ansible-playbook lamp.yml --tags lamp

В приведенной выше команде будут выполняться только задачи, отмеченные lamp.

Вы также можете исключить определенные задачи, используя --skip-tags опцию. Например, чтобы пропустить задачи с тегом never, вы можете использовать следующую команду:

ansible-playbook lamp.yml --skip-tags never

В этом случае задачи с тегом never не будут выполняться.

Кроме того, вы можете перечислить все доступные теги в playbook, используя опцию --list-tags. Вот пример команды:

ansible-playbook lamp.yml --list-tags

Эта команда отобразит список всех тегов, определенных в вашем плейбуке.

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

Шифрование

Чтобы зашифровать lamp.yml плейбук с помощью Ansible Vault, вы можете использовать команду ansible-vault. Ansible Vault предоставляет безопасный способ шифрования конфиденциальных данных в ваших книгах.

Вот команда для шифрования lamp.yml файла:

ansible-vault encrypt lamp.yml

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

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

Чтобы запустить playbook с зашифрованным файлом, вы можете использовать команду ansible-playbook вместе с --ask-vault-pass опцией ввода пароля:

ansible-playbook lamp.yml --ask-vault-pass

При появлении запроса введите пароль, который вы использовали для шифрования файла.

Обратите внимание, что вы также можете указать пароль через файл или ссылку на файл паролей, используя параметр --vault-password-file, который может быть полезен при автоматизации выполнения зашифрованных книг воспроизведения.

Зашифровав playbook с помощью Ansible Vault, вы можете защитить конфиденциальную информацию, такую как пароли, ключи API или любые другие конфиденциальные данные, которые могут присутствовать в вашем playbook.

Для дополнительной безопасности я предпринял следующие шаги:

Во-первых, я создал запись Secrets Manager в AWS для безопасного хранения пароля моего хранилища. Это гарантирует, что конфиденциальная информация хранится в зашифрованном виде и недоступна для неавторизованных пользователей.

Затем я создал политику IAM, которая предоставляет доступ на чтение к диспетчеру секретов.

{     "Version": "2012-10-17",     "Statement": [         {             "Sid": "SecretsManagerReadAccess",             "Effect": "Allow",             "Action": "secretsmanager:GetSecretValue",             "Resource": "arn:aws:secretsmanager:ap-south-1:939486479455:secret:vault_pass-yAAbi4"         }     ] }

После создания политики я создал роль IAM, которая использует эту политику. Эта роль будет прикреплена к моей главной машине, что позволит ей безопасно получить пароль хранилища от Secrets Manager.

Чтобы получить пароль хранилища из Secrets Manager, я создал сценарий bash. Сценарий использует AWS CLI команду aws secretsmanager get-secret-value и передает секретный идентификатор в качестве аргумента (vault_pass). Затем сценарий извлекает значение пароля из ответа JSON с помощью jq и сохраняет его в secret_value переменной.

Вот пример bash-скрипта:

#!/bin/bash  secret_id="vault_pass" secret_value=$(aws secretsmanager get-secret-value --secret-id "$secret_id" --query 'SecretString' --output text | jq -r '.vault_pass') # Use the secret value in further operations if [ -n "$secret_value" ]; then     # Perform desired operations using the secret value     echo "Retrieved the vault password: $secret_value" else     echo "Failed to retrieve the vault password" fi

Запустив этот сценарий, я могу безопасно получить пароль хранилища от Secrets Manager.

Наконец, чтобы использовать пароль хранилища в моем плейбуке Ansible, я передаю сценарий в качестве аргумента командной строки вместе с командой ansible-playbook. Это гарантирует, что плейбук будет иметь доступ к паролю хранилища, когда это необходимо.

ansible-playbook -i inventory lamp.yml --vault-password-file <path/to/bash/script.sh>

Заключение

С помощью этого плейбука Ansible и скрипта AWS Secrets Manager можно автоматизировать установку и настройку LAMP-стека. Это позволяет эффективно управлять инфраструктурой и упрощает процесс развертывания.


Если вы хотите научиться устанавливать LEMP-стеки, собирать Docker-контейнеры в Ansible, самостоятельно писать плейбуки, использовать роли и модули, приходите на курс «Ansible: Infrastructure as Code». Новый поток стартует 7 августа. Посмотреть программу и записаться на курс можно на нашем сайте. Ждём на курсе!


ссылка на оригинал статьи https://habr.com/ru/companies/southbridge/articles/745886/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *