Как автоматизировать 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