Как автоматизировать mysql_secure_installation в Chef

Рецепт шеф-повара mysql - для того, чтобы установить постоянный пароль для пользователя root в mysql, я нашел процесс, который использует ресурс "bash" в рецепте для запуска скрипта bash, который автоматизирует все шаги, которые появляются в процессе. Но после запуска конвергенции это ошибки

"ОШИБКА 1045 (28000): доступ запрещен для пользователя" root "@" localhost "(с использованием пароля: ДА)".

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

root_password = node.set['mysql_user']['root']['password']
bash "mysql_secure_installation" do
  code <<-EOH
    mysql -u root -e "DELETE FROM mysql.user WHERE User='';"
    mysql -u root -e "DROP DATABASE test;"
    mysql -u root -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
    mysql -u root -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
    mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('#{root_password}');" -D mysql
    mysql -u root -p#{root_password} -e "SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('#{root_password}');" -D mysql
    mysql -u root -p#{root_password} -e "SET PASSWORD FOR 'root'@'::1' = PASSWORD('#{root_password}');" -D mysql
    mysql -u root -p#{root_password} -e "FLUSH PRIVILEGES;"
  EOH
end

1 ответ

Прежде всего, ваш скрипт будет работать только при первой конвергенции.

Во-вторых, ваш bash Ресурс будет возвращать только ошибку последней команды (FLUSH PRIVILEGES). Другие ошибки команды будут игнорироваться ресурсом, и выполнение chef будет продолжено. Вам нужно использовать set -e или добавить && между командами mysql, чтобы избежать этого.

Во всяком случае, я очень рекомендую вам попробовать использовать официальный mysql поваренная книга для вашей задачи. Это сделает это проще. Вы можете использовать что-то вроде следующего для установки и установки пароля root:

mysql_service 'default' do
  port '3306'
  initial_root_password root_password
  action [:create, :start]
end

Имейте в виду, что эта кулинарная книга уже принимает многие из ваших мер безопасности из коробки:

UPDATE mysql.user SET #{password_column_name}=PASSWORD('#{root_password}')#{password_expired} WHERE user = 'root';
DELETE FROM mysql.user WHERE USER LIKE '';
DELETE FROM mysql.user WHERE user = 'root' and host NOT IN ('127.0.0.1', 'localhost');
FLUSH PRIVILEGES;
DELETE FROM mysql.db WHERE db LIKE 'test%';
DROP DATABASE IF EXISTS test ;

После этого вы также можете запускать свои собственные сценарии SQL, используя database а также mysql2_chef_gem поваренные книги, если хотите:

# Required by `database` cookbook MySQL resources:
mysql2_chef_gem 'default'

connection_info = {
  :host     => '127.0.0.1',
  :username => 'root',
  :password => root_password
}

mysql_database 'mysql_secure_installation' do
  connection connection_info
  database_name 'mysql'
  sql <<-EOH
    -- MY MYSQL SCRIPT HERE;
  EOH
  action :query
end
Другие вопросы по тегам