Chef mysql recipe-按顺序为mysql中的root用户设置永久密码,我确实找到了一个在配方中使用“bash”资源运行bash脚本的进程,该脚本自动执行弹出的所有步骤处理。但是在运行收敛之后它出错了
“ERROR 1045(28000):用户'root'@'localhost'拒绝访问(使用密码:YES)”。
我理解这是因为最初临时密码是在mysqld.log文件中生成的,我需要提供这个temp passwd来运行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
答案 0 :(得分:1)
首先,您的脚本仅适用于第一次收敛。
其次,您的bash
资源只会返回上一个命令的错误( FLUSH PRIVILEGES )。资源将忽略其他命令错误,并且主厨执行将继续。您需要使用set -e
或在mysql命令之间添加&&
以避免这种情况。
无论如何,我非常建议您尝试使用官方mysql
食谱来完成任务。它会使它更简单。您可以使用以下内容来安装和设置root密码:
mysql_service 'default' do
port '3306'
initial_root_password root_password
action [:create, :start]
end
请记住这本食谱already takes many of your security measures开箱即用:
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 ;
之后,如果需要,您还可以使用database
和mysql2_chef_gem
cookbook运行自己的SQL脚本:
# 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