如何在Chef中自动化mysql_secure_installation

时间:2016-03-29 15:01:33

标签: mysql chef chef-recipe cookbook

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

1 个答案:

答案 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 ;

之后,如果需要,您还可以使用databasemysql2_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