DBのアカウントのホストの制限をするために置換したいという需要がありまして。
ohai
というchef同梱のコマンドで
ohai ipaddressと打つとlocalhostのipaddressがとれます。
ohaiでとれる値をchefのrecipeやtemplateから読むときは、node[:ipaddress]
とかすると値がとれます。
ただしnode[:ipaddress]
はmy.cnfのserver-idに第4オクテットを指定する感じにtemplateで使ってました。
templatesに置いたmy.cnfは以下のような感じ(抜粋)です
server-id = <%= node[:ipaddress].split(".").last %>
参考:http://studio3104.hatenablog.com/entry/20130218/1361163629
DBアカウントのホスト制限のためにnode[:ipaddress]
を使って置換すると
templateの値も置換されてしまうという現象が。。
rubyもchefもよくわかんないなと思いました。元の値を別の値に代入するのにも失敗したし。
→"ruby 参照渡し"でググると少しわかりました。
rubyでは変数は箱ではなくラベルでポインタなので中身を変えると元の値も変わってしまうとのこと。
そのような破壊的操作をしなければいいということですがじゃあどうすればいいのかはよくわからず。
しょうがないから、node[:network][:default_gateway]
とか別のパラメータ使いました。
デフォゲをどっかで使うなら他のブロードキャストなどを使わないとダメかも。
結果的に上手くいった置換方法のレシピ:
~略~
localip = node[:network][:default_gateway]
localip[/[0-9]+\.[0-9]+$/] = "%"
~略~
bash "secure_installation" do
only_if "#{mysqlconn} -e 'show databases;'"
code <<-EOC
localseg=#{localip}
#{mysqlconn} << EOF
grant all on *.* to #{suuser}@"${localseg}" identified by "#{supass}";
grant all on *.* to #{suuser}@'localhost' identified by "#{supass}";
grant all on *.* to #{suuser}@'::1' identified by "#{supass}";
grant all on *.* to #{suuser}@'127.0.0.1' identified by "#{supass}";
grant replication slave,replication client on *.* to #{repluser}@"${localseg}" identified by "#{replpass}";
drop database test;
delete from mysql.user where password='';
flush privileges;
~略~
※ユーザ情報はdata_bagsからロードしています。
※mysql5.6でrpmで入れてる為expect
でパスワードセットする処理をbashリソースで上のレシピの前に入れています。
参考:http://qiita.com/k-motoyan/items/25e64dc054abfa0ff7cb
結果
mysql> select user,host,password from mysql.user;
+------+---------------------+-------------------------------------------+
| user | host | password |
+------+---------------------+-------------------------------------------+
| root | localhost | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| root | test-mysql01 | *6A60A70C59535B75A79FDE4C7C55FDA55F****** |
| root | 127.0.0.1 | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| root | ::1 | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| root | 192.168.% | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| repl | 192.168.% | *43E209EED080057E35C2630AC06D32960A****** |
+------+---------------------+-------------------------------------------+
検索してもファイル内をsedってるレシピしかみつからなくて「たのしいruby」を部分的に読みました。
bash内でsedだとohaiでとれた値をマッチさせるのに括弧とかダブルクォートとかの余計な値が多くて
難儀だったのでたどたどしくrubyで頑張ってみた次第です。