chefでmysql-5.6インストールしようとしたら苦労した話

最近chefにハマってます。
いろんなレシピを書いて勉強中です。
 
で、mysql-5.6をchefでインストールしようとしたらはまってしまいました。(泥沼に…
CentOS6標準のmysql-5.1と同じノリでやったら苦労したのでメモ。
 
 

  • mysql-5.1のとき

こんな感じでレシピ書いてました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
%w(mysql-server mysql mysql-devel).each do |pkg|
  package pkg do
    action :install
  end
end

template '/etc/my.cnf' do
  source 'my.cnf.erb'
  owner 'root'
  group 'root'
  mode 644
  notifies :restart, "service[mysqld]", :delayed
end

service 'mysqld' do
  action [:start, :enable]
end

script "Secure_Install" do
  interpreter 'bash'
  user "root"
  only_if "mysql -u root -e 'show databases'"
  code <<-EOL
    mysqladmin -u root password "your_password"
    mysql -u root -pyour_password -e "DELETE FROM mysql.user WHERE User='';"
    mysql -u root -pyour_password -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');"
    mysql -u root -pyour_password -e "DROP DATABASE test;"
    mysql -u root -pyour_password -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
    mysql -u root -pyour_password -e "FLUSH PRIVILEGES;"
  EOL
end

script "Secure_Install" doの部分はmysql_secure_installationコマンドを叩いたときに流れるクエリを並べただけです。rootのパスワードが空のときのみ実行されます。
 
 
これと同じノリでmysql-5.6のレシピを最初書いたのですがまったくうまくいかない。。。
 
 
 

(個人的)ハマりポイント

  1. MySQL-serverのrpmファイルのインストールが完了した時点でmysql_install_dbが自動実行される。
  2. 初期パスワードが設定されている。
  3. そのパスワードの有効期限?が切れている。。。

 
上から順番に。

MySQL-serverのrpmファイルのインストールが完了した時点でmysql_install_dbが自動実行される

今までは初回起動時だったと思います。なのでmysqlインストール→my.cnf編集→mysql起動でいい感じにib_logfile0なんかが作成されていました。
が、rpmでmysql5.6をインストールするとその時点でmysql_install_dbが走ります。
さらに/usr/my.cnfを作成したうえで走ります。(なぜ/etc/my.cnfじゃないんだ!!!
 
MySQL-serverをインストールしてからmy.cnf(innodb_log_file_sizeとか)をいじったらうまく起動しないのです。。。  
 
なのでインストール前にmy.cnf置いておけばOKです。
(詳しくはこちら様をご覧ください。http://yoku0825.blogspot.jp/2013/01/rpmmycnf.html)
 

初期パスワードが設定されている

そのまんまです。初期パスワードは空ではなくランダムに設定されています。
その初期パスワードは/root/.mysql_secretに書かれています。 初回ログイン時にしっかり確認しましょう。  

そのパスワードの有効期限?が切れている

password_expiredなる項目がありYってなってます。
このままだと下記のようなエラーが出てしまいます。

1
2
$ mysql -u root -p -e "show databases"
ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.

よくわかんねーなーと思いながらmysql_secure_installationを読んでたら--connect-expired-passwordなるオプション見つけました。
いいのあるじゃない! これ使います。

  • mysql-5.6のレシピ

(個人的)ハマりポイントを解消した結果のレシピがこちらです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# MySQL-client MySQL-shared-compat MySQL-shared-compat MySQL-devel をインストール
for number in 0..3

  cookbook_file "/usr/local/src/#{node[:mysql56][:rpm][:filename][number]}" do
    source node[:mysql56][:rpm][:filename][number]
  end

  package node[:mysql56][:rpm][:package][number] do
    action :install
    provider Chef::Provider::Package::Rpm
    source "/usr/local/src/#{node[:mysql56][:rpm][:filename][number]}"
  end

end

link '/etc/my.cnf' do
  to '/usr/my.cnf'
end

template '/etc/my.cnf' do
  source 'my.cnf.erb'
  owner 'root'
  group 'root'
  notifies :restart, "service[mysql]", :delayed
end

# MySQL-server をインストール
cookbook_file "/usr/local/src/#{node[:mysql56][:rpm][:filename][4]}" do
  source node[:mysql56][:rpm][:filename][4]
end

package node[:mysql56][:rpm][:package][4] do
  action :install
  provider Chef::Provider::Package::Rpm
  source "/usr/local/src/#{node[:mysql56][:rpm][:filename][4]}"
end

directory '/var/run/mysqld' do
  owner 'mysql'
  group 'root'
  mode 0755
  action :create
end

service 'mysql' do
  action [:start, :enable]
end

script "Secure_Install" do
  interpreter 'bash'
  user "root"
  not_if "mysql -u root -pyour_password -e 'show databases'"
  code <<-EOL
    export Initial_PW=`head -n 1 /root/.mysql_secret |awk '{print $(NF - 0)}'`
    mysql -u root -p${Initial_PW} --connect-expired-password -e "SET PASSWORD FOR root@localhost=PASSWORD('your_password');"
    mysql -u root -pyour_password -e "SET PASSWORD FOR root@'127.0.0.1'=PASSWORD('your_password');"
    mysql -u root -pyour_password -e "DELETE FROM mysql.user WHERE User='';"
    mysql -u root -pyour_password -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');"
    mysql -u root -pyour_password -e "DROP DATABASE test;"
    mysql -u root -pyour_password -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
    mysql -u root -pyour_password -e "FLUSH PRIVILEGES;"
  EOL
end

僕のようなsqlのsもわからないようなへっぽこにしてはよくできたほうです。
満足(´ω`)

Comments