LoginSignup
7
6

More than 5 years have passed since last update.

chef(ruby)でipアドレスの末尾を置換

Last updated at Posted at 2013-12-19

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で頑張ってみた次第です。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6