Ubuntu 22.04 – Установка MySQL 5.7 – Автоматизация скрипта

Вопрос или проблема

Я работаю над платформой старого образца, для которой мы автоматизируем развертывание. Это потребует нескольких итераций, пока она не будет готова к использованию в производстве. На данный момент я на этапе настройки и конфигурирования базового MySQL 5.7.

Среда

  • Ubuntu 22.04
  • AWS

На этом этапе это скрипт Bash, который мы запускаем локально, и он настраивает все на удаленном сервере. Позже мы преобразуем это в GitHub Actions, и эта стратегия уже работала для нас в прошлом, поэтому давайте придерживаться начальной архитектуры.

Это рабочий прототип, который я запускал вручную на сервере, и он отлично работал:

# Конфигурация брандмауэра.
sudo ufw allow 3306/tcp;

sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb;

echo "mysql-apt-config mysql-apt-config/select-server select mysql-5.7" | sudo debconf-set-selections;
echo "mysql-apt-config mysql-apt-config/select-product select Ok" | sudo debconf-set-selections;

# Установка пакета конфигурации MySQL APT
sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.12-1_all.deb;

# Загрузка и добавление ключа напрямую с использованием ID ключа
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C;

# Добавление репозитория MySQL
echo "deb http://repo.mysql.com/apt/ubuntu bionic mysql-5.7" | sudo tee /etc/apt/sources.list.d/mysql.list;

sudo apt-get update;

# Установка пароля root в неинтерактивном режиме
export CONFIG_SERVER_MYSQL_ROOT_PASSWORD='exEm!@123'; # Это будет установлено в переменной окружения, которую я покажу позже.
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password '${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}'";
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password '${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}'";

# Установка MySQL 5.7
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-community-server=5.7* mysql-client=5.7*;

# Остановка MySQL
sudo systemctl stop mysql;

# Создание директории MySQL и установка разрешений
sudo mkdir -p /var/run/mysqld;
sudo chown mysql:mysql /var/run/mysqld;
sudo chmod 777 /var/run/mysqld;

# Запуск MySQL в безопасном режиме
sudo mysqld_safe --skip-grant-tables --skip-networking &

# Ожидание запуска MySQL
sleep 5;

# Выполнение команд MySQL
mysql --user=root << EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOF

# Остановка MySQL в безопасном режиме
sudo pkill mysqld;
sleep 5;

# Запуск MySQL в нормальном режиме
sudo systemctl start mysql;

# Проверка, сработал ли пароль:
mysql -u root -p'sistemA!@2131' -e "SELECT 1;";

# Проверка версии:
mysql -u root -p"${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}" -e "SELECT VERSION();";

Вот так я конвертировал это для локального запуска в автоматизированном скрипте:

# Здесь происходит загрузка переменных из .env.
source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/single-server-load-env.sh";

BACKEND_HOST_SERVER_SH_SCRIPT='
    # Конфигурация брандмауэра. \
    sudo ufw allow 3306/tcp; \

    # Обновление списков пакетов \
    sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb; \

    # Установка неинтерактивного режима. \
    echo "mysql-apt-config mysql-apt-config/select-server select mysql-5.7" | sudo debconf-set-selections; \
    echo "mysql-apt-config mysql-apt-config/select-product select Ok" | sudo debconf-set-selections; \

    # Установка пакета конфигурации MySQL APT. \
    sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.12-1_all.deb; \

    # Загрузка и добавление ключа напрямую с использованием ID ключа. \
    # Примечание: ключ устарел и может в будущем не работать, поэтому обязательно проверяйте его актуальность. \
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C; \

    # Добавление репозитория MySQL. \
    echo "deb http://repo.mysql.com/apt/ubuntu bionic mysql-5.7" | sudo tee /etc/apt/sources.list.d/mysql.list; \

    # Обновление списков пакетов. \
    sudo apt-get update; \

    # Установка пароля root в неинтерактивном режиме. \
    sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password '"$CONFIG_SERVER_MYSQL_ROOT_PASSWORD"'"; \
    sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password '"$CONFIG_SERVER_MYSQL_ROOT_PASSWORD"'"; \

    # Установка MySQL 5.7. \
    sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-community-server=5.7* mysql-client=5.7*; \

    # Остановка MySQL \
    sudo systemctl stop mysql; \

    # Создание директории MySQL и установка разрешений. \
    sudo mkdir -p /var/run/mysqld; \
    sudo chown mysql:mysql /var/run/mysqld; \
    sudo chmod 777 /var/run/mysqld; \

    # Запуск MySQL в безопасном режиме и ожидание его запуска. \
    sudo mysqld_safe --skip-grant-tables --skip-networking &
    sleep 5; \

    # Этот следующий блок, вероятно, там, где у меня проблемы с синтаксисом:
    # Выполнение команд MySQL. \
    mysql --user=root << EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOF
        # Не сработало
        # Также пытался экранировать некоторые одиночные кавычки, но не сработало

    # Выполнение команд MySQL. \
    mysql --user=root -e "FLUSH PRIVILEGES;"; \
    mysql --user=root -e "UPDATE mysql.user SET authentication_plugin='mysql_native_password', Password=PASSWORD('${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}') WHERE User="root";"; \
    mysql --user=root -e "FLUSH PRIVILEGES;";  \
        # Не сработало

    # Выполнение команд MySQL. \
    mysql --user=root -e "FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${CONFIG_SERVER_MYSQL_ROOT_PASSWORD}'; FLUSH PRIVILEGES;"; \
        # Не сработало

    # Остановка MySQL в безопасном режиме. \
    sudo pkill mysqld; \
    sleep 5; \

    # Запуск MySQL в нормальном режиме. \
    sudo systemctl start mysql; \

    # Этот блок также вызывает у меня проблемы.
    # Проверка, сработал ли пароль: \
    mysql -u root -p'"$CONFIG_SERVER_MYSQL_ROOT_PASSWORD"' -e "SELECT 1;";

    # Этот тоже.
    # Проверка версии: \
    mysql -u root -p"'"$CONFIG_SERVER_MYSQL_ROOT_PASSWORD"'" -e "SELECT VERSION();";
';

# Запись личного ключа во временный файл
echo -e "$CONFIG_SERVER_PUBLIC_KEY" > id_rsa_server_private_key_temp.pem;
chmod 600 id_rsa_server_private_key_temp.pem;

# Выполнение скрипта на сервере
ssh -v -t -t -i id_rsa_server_private_key_temp.pem \
    -o ConnectTimeout=300 \
    -o StrictHostKeyChecking=no \
    ubuntu@"$CONFIG_SERVER_BACKEND_IP" "$BACKEND_HOST_SERVER_SH_SCRIPT";

# Удаление временного личного ключа
rm id_rsa_server_private_key_temp.pem;

echo "Проверка статуса: Базовая установка MySQL 5.7 завершена.";

Журнал ошибок терминала выглядит примерно так:

# Больше информации, но в основном успешно.
update-alternatives: using /etc/mysql/mysql.cnf to provide /etc/mysql/my.cnf (my.cnf) in auto mode
Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
NEEDRESTART-VER: 3.5
NEEDRESTART-KCUR: 6.5.0-1022-aws
NEEDRESTART-KEXP: 6.5.0-1022-aws
NEEDRESTART-KSTA: 1
2025-01-17T23:50:05.205820Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2025-01-17T23:50:05.233249Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded
                                                      ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded  
                                                                                                            2025-01-17T23:50:11.399290Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
debug1: channel 0: free: client-session, nchannels 1
Connection to 123.123.123.1 closed.
Transferred: sent 6380, received 26264 bytes, in 39.7 seconds
Bytes per second: sent 160.7, received 661.7
debug1: Exit status 1
Проверка статуса: Базовая установка MySQL 5.7 завершена.

Важные заметки:

  • Переменные окружения CONFIG_SERVER_MYSQL_ROOT_PASSWORD должны хранить сложные пароли, такие как: exEm!@123
  • в файле .env переменная окружения определяется как CONFIG_SERVER_MYSQL_ROOT_PASSWORD=’exEm!@123′ (в одинарных кавычках)

Я сделал множество автоматизированных шагов подобного рода. Вот пример работающих шагов:

# Здесь происходит загрузка переменных из .env.
source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/single-server-load-env.sh";

# Шаг: Создание директории для приложения (хост-сервер)
BACKEND_HOST_SERVER_SH_SCRIPT=' \
    # Создание директории приложения \
    sudo mkdir -p /var/www/'"$APP_URL"'; \
    sudo mkdir -p /var/www/'"$APP_URL"'/public; \

    # Назначение прав собственности root \
    sudo chown root:root /var/www/'"$APP_URL"'; \

    # Установка прав доступа 755 для директории \
    sudo chmod 755 /var/www/'"$APP_URL"'; \

    # echo "Директория приложения создана и права настроены.";
';

# Запись личного ключа во временный файл
echo -e "$CONFIG_SERVER_PUBLIC_KEY" > id_rsa_server_private_key_temp.pem;
chmod 600 id_rsa_server_private_key_temp.pem;

# Выполнение скрипта конфигурации SFTP на сервере
ssh -v -t -t -i id_rsa_server_private_key_temp.pem \
    -o ConnectTimeout=300 \
    -o StrictHostKeyChecking=no \
    ubuntu@"$CONFIG_SERVER_BACKEND_IP" "$BACKEND_HOST_SERVER_SH_SCRIPT";

# Удаление временного личного ключа
rm id_rsa_server_private_key_temp.pem;

echo "Проверка статуса: Директория приложения создана и настроена успешно!";

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

Есть ли какие-то идеи, которые я могу попробовать, чтобы исправить синтаксис?

Ответ или решение

Для автоматизации установки MySQL 5.7 на экземпляре Ubuntu 22.04 в AWS, важно учесть несколько факторов. Вы столкнулись с проблемами синтаксиса и аутентификации, а также с техническими сложностями, связанными с устаревшими методами и утилитами. Рассмотрим теоретическую часть, примеры и практическое применение.

Теория

MySQL 5.7 считается устаревшей версией, и хотя она все еще поддерживается, ее установка на более современные версии Ubuntu, такие как 22.04, может вызвать трудности. Для установки пакетов необходимо использовать MySQL APT Repository, который не всегда автоматически поддерживает старые версии пакетов в новых версиях ОС.

Основные проблемы:

  1. Аутентификация: Ошибки типа "Plugin ‘auth_socket’ is not loaded" и "Access denied for user ‘root’@’localhost’" связаны с попытками использования устаревших методов аутентификации.
  2. Устаревшие репозитории и ключи: Использование старых репозиториев и ключей может привести к сбоям при установке.
  3. Ошибки синтаксиса и использования Bash: Скрипты Bash при работе с переменными и многострочными командами могут вызывать ошибки.

Пример

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

#!/bin/bash

# Загрузка переменных окружения
source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/single-server-load-env.sh"

CONFIG_SERVER_MYSQL_ROOT_PASSWORD='exEm!@123'

BACKEND_HOST_SERVER_SH_SCRIPT='
    # Настройка Firewall.
    sudo ufw allow 3306/tcp;

    # Скачивание и установка MySQL APT конфигурации.
    wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb
    echo "mysql-apt-config mysql-apt-config/select-server select mysql-5.7" | sudo debconf-set-selections
    DEBIAN_FRONTEND=noninteractive sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb

    # Добавление MySQL GPG ключа.
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C

    # Добавление репозитория MySQL 5.7.
    echo "deb http://repo.mysql.com/apt/ubuntu $(lsb_release -sc) mysql-5.7" | sudo tee /etc/apt/sources.list.d/mysql.list

    # Обновление списка пакетов.
    sudo apt-get update

    # Установка MySQL 5.7.
    echo "mysql-community-server mysql-community-server/root-pass password $CONFIG_SERVER_MYSQL_ROOT_PASSWORD" | sudo debconf-set-selections
    echo "mysql-community-server mysql-community-server/re-root-pass password $CONFIG_SERVER_MYSQL_ROOT_PASSWORD" | sudo debconf-set-selections
    DEBIAN_FRONTEND=noninteractive sudo apt-get install -y mysql-community-server=5.7* mysql-client=5.7*

    # Запуск MySQL и конфигурация пользователя root.
    sudo systemctl stop mysql
    sudo mysqld_safe --skip-grant-tables --skip-networking &
    sleep 5
    mysql --user=root <<EOF
USE mysql;
FLUSH PRIVILEGES;
ALTER USER "root"@"localhost" IDENTIFIED WITH mysql_native_password BY "$CONFIG_SERVER_MYSQL_ROOT_PASSWORD";
FLUSH PRIVILEGES;
EXIT;
EOF
    sudo pkill mysqld
    sleep 5
    sudo systemctl start mysql

    # Проверка работоспособности соединения с MySQL
    mysql -u root -p"$CONFIG_SERVER_MYSQL_ROOT_PASSWORD" -e "SELECT VERSION();"
    mysql -u root -p"$CONFIG_SERVER_MYSQL_ROOT_PASSWORD" -e "SELECT 1;"
';

# Создание временного файла с ключом
echo -e "$CONFIG_SERVER_PUBLIC_KEY" > id_rsa_server_private_key_temp.pem
chmod 600 id_rsa_server_private_key_temp.pem

# Выполнение скрипта на сервере
ssh -v -t -t -i id_rsa_server_private_key_temp.pem \
    -o ConnectTimeout=300 \
    -o StrictHostKeyChecking=no \
    ubuntu@"$CONFIG_SERVER_BACKEND_IP" "$BACKEND_HOST_SERVER_SH_SCRIPT"

# Удаление временного файла с ключом
rm id_rsa_server_private_key_temp.pem

echo "Status check: Basic MySQL 5.7 installation completed."

Практическое применение

  1. Проверка совместимости ОС и пакетов: Используйте $(lsb_release -sc) для автоматической подстановки версии дистрибутива, на который ориентируется APT, чтобы избежать ошибок при добавлении репозиториев на Ubuntu 22.04.

  2. Аутентификация и права доступа: Используйте mysql_native_password, избегая ошибки плагина auth_socket. Убедитесь, что изменения применяются должным образом с помощью команды FLUSH PRIVILEGES.

  3. Стабильность скрипта: Обратите внимание на использование временного ключа и корректное завершение работы демона MySQL. Паузы (sleep) между командами могут помочь избежать ошибок с непоследовательностью действий.

Следуя этим рекомендациям, вы сможете обеспечить корректную автоматизацию установки MySQL 5.7 на Ubuntu 22.04. Поддерживйте актуальность используемых репозиториев и ключей, и адаптируйте команды для работы с новыми версиями окружения.

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

Капча загружается...