Chefで既存手順のレシピを書く2(ユーザ作成)

こんにちは。プラットフォームの小宮です。

前回に引き続きChefの記事で失礼します。

data_bagsでユーザ管理の用意をします。

一応、以前にこちらに書いてるのですが、関連情報がまとまってるほうがいいと思うので部分的に再掲します。

data_bagsとはldapのような機能をもったデータ検索など管理ができるもの。
chef-server使う場合はサーバと通信してデータ取ってきて反映することが可能。
今回はChef-soloなので、ローカルのファイルにデータを用意して反映させる方法をとります。

参考:
もしユーザ数が多くて頻繁にアカウントが追加変更される場合、以下リンクのようにdata_bagsで有効無効も管理するのもよさそうです。
chef-data-bag活用法

[shell]# cd ;cd chef-repo/data_bags
# mkdir users;cd users
# vi xxx-op.json
// xxx-op.json
{
"id" : "xxx-op",
"groups": [ "xxx-op","wheel" ],
"uid": 1000,
"username" : "xxx-op",
"home" : "/home/xxx-op",
"shell" : "/bin/bash",
"password" : "$1$Ka.Mw69U$TT5HRfSe7xxxxx"
}

# vi yyy-op.json
// yyy-op.json
{
"id" : "yyy-op",
"groups": [ "yyy-op","wheel" ],
"uid": 500,
"username" : "yyy-op",
"home" : "/home/yyy-op",
"shell" : "/bin/bash",
"password" : "$1$Ka.Mw69U$TT5HRfSe78Pxxxxx"
}

# vi dev.json
// dev.json
{
"id" : "dev",
"groups": [ "dev","wheel" ],
"uid": 501,
"username" : "dev",
"home" : "\/home\/dev",
"shell" : "\/bin\/bash",
"password" : "$1$S/q25RbR$oO7pCoAjBWxxxxx"
}[/shell]

password は下記のコマンドにて作成する
[shell]# openssl passwd -1[/shell]

[shell]# knife solo data bag show users[/shell]
データが表示されることを確認する

・mysqlのユーザの定義を暗号化して行う

※nodeやroleのJSONファイルに平文でパスワード定義するのはセキュアでないしnode毎に記録するのもスマートでない
 ので鍵を使って暗号化できるdatabagsを使う方向とします
 knife-soloだけだと暗号化つかえないようですが、gem install knife-solo_data_bagすると使えるようになります。

[shell]# openssl rand -base64 512 | tr -d ‘\r\n’ > /etc/chef/encrypted_data_bag_secret
# chmod 400 encrypted_data_bag_secret
# cd /root/chef-repo
# knife solo data bag create mysqlusers root –secret-file ./encrypted_data_bag_secret
エディタが開くので以下を入力する
{
"id": "root",
"user": "root",
"pass": "xxxxxxx",
"host": "localhost",
"privileges": "all"
}

# knife solo data bag create mysqlusers repl –secret-file ./encrypted_data_bag_secret
エディタが開くので以下を入力する
{
"id": "repl",
"user": "repl",
"pass":"xxxxxxx",
"host":"172.20.28.%",
"privileges": ["\\:replication slave", "\\:replication client"]
}

# knife solo data bag create mysqlusers xxx_admin –secret-file ./encrypted_data_bag_secret
エディタが開くので以下を入力する
{
"id": "xxx_admin",
"user": "xxx_admin",
"pass": "xxxxxxx",
"host":"172.20.28.%"
"privileges": "all"
}

# knife solo data bag create mysqlusers zabbix –secret-file ./encrypted_data_bag_secret
エディタが開くので以下を入力する
{
"id": "zabbix",
"user": "zabbix",
"pass": "xxxxxxx",
"host": "localhost",
"privileges": "all"
}

確認
# knife solo data bag show mysqlusers
# knife solo data bag show mysqlusers repl –secret-file ./encrypted_data_bag_secret
# knife solo data bag show mysqlusers root –secret-file ./encrypted_data_bag_secret
# knife solo data bag show mysqlusers xxx_admin –secret-file ./encrypted_data_bag_secret
# knife solo data bag show mysqlusers zabbix –secret-file ./encrypted_data_bag_secret[/shell]
データが表示されることを確認する
他のコマンドは以下で確認可能
[shell]# knife solo data bag –help[/shell]

chef-serverだとdatabags用の鍵をbootstrapファイルでクライアントホストに渡すということが可能なようですが、
knife-solo_data_bagだからなのかknife solo cook hostnameする時にbootstrapファイル指定するという必要はないようでした。
vagrantのほうでどうやるのかはよく分かっていません。

続いてレシピからdata_bagsに登録したデータを取り出してみます。
data_bag(‘users’)でdata_bags/usersディレクトリに置かれたユーザーデータオブジェクトのid一覧が取得できます。
data_bag_item(‘users’, id)で指定したIDのオブジェクトをData Bagから取り出すことができます。

参考:
[chef] data bag活用法
Chef の Data Bag を使ってユーザー作成の自動化をしてみる

・login_usersのレシピを書く
[shell]cd site-cookbooks/login_users/recipes
# vi default.rb
data_ids = data_bag(‘users’)

data_ids.each do |id|
u = data_bag_item(‘users’, id)
user u[‘username’] do
home u[‘home’]
shell u[‘shell’]
uid u[‘uid’]
password u[‘password’]
end
end

group ‘wheel’ do
group_name ‘wheel’
members [‘root’, ‘xxx-op’, ‘yyy-op’, ‘dev’]
action :modify
end

cookbook_file ‘/home/dev/.bash_profile’ do
source ‘home/dev/.bash_profile’
owner ‘dev’
group ‘dev’
mode 0644
end[/shell]
サブグループの指定をuserリソースではできなかったのでgroupリソースを用いた

[shell]echo "umask 002" >> /home/dev/.bash_profile
tail /home/dev/.bash_profile
mkdir -p /root/chef-repo/site-cookbooks/login_users/files/default/home/dev
cp -p /home/dev/.bash_profile /root/chef-repo/site-cookbooks/login_users/files/default/home/dev/[/shell]

・mysqlのユーザ作成

参考
ChefでMySQLをインストール
今日から使い始めるChef
chef で mysql のユーザやデータベースを管理する
Chefで公開したくないJSONデータを暗号化するためにDataBagsを利用してみた記録
ChefでのMySQLパスワードの扱い

opscodeからmysql/databaseのクックブックを取得しようと思ったのですが、
うまくいかず自分で書いてないレシピのエラー特定するのがかなり難しかったのでbashにしてしまいました。

使おうとしてたのはこちら→ mysql_database_userリソースのマニュアル

レシピは以下の通り
[shell]# vi site-cookbooks/mysqld/recipes/mysql-users.rb
#include_recipe "openssl"
#include_recipe ‘database::mysql’

#mysql_connection_info = {:host => "localhost",
# :username => ‘root’,
# #:password => node[‘mysql’][‘server_root_password’]}
# :password => ”}

#mysql_database "xxx_db" do
# connection mysql_connection_info
# action :create
#end

odbadm_data = Chef::EncryptedDataBagItem.load("mysqlusers","odb_admin")
root_data = Chef::EncryptedDataBagItem.load("mysqlusers","root")
repl_data = Chef::EncryptedDataBagItem.load("mysqlusers","repl")
myuser_o = odbadm_data["user"]
mypass_o =odbadm_data["pass"]
myuser_ro = root_data["user"]
mypass_ro =root_data["pass"]
myuser_re = repl_data["user"]
mypass_re =repl_data["pass"]
#mysql_database_user "#{user}" do
# connection mysql_connection_info
# password "#{password}"
# database_name "*"
# host "[#{host}, %, localhost]"
# privileges [:all]
# action [:create, :grant]
#end
#
mysqlconn = "mysql -u root"
script "create_msql_odbadm" do
not_if "ls /root/.path_to_file"
#not_if "#{mysqlconn} -p #{mypass_ro} -e ‘select count(*) from mysql.user where user=\’repl\’;’"
interpreter "bash"
user "root"
code <<-EOL
#{mysqlconn} << EOF
grant all privileges on *.* to #{myuser_o}@’%’ identified by "#{mypass_o}";
grant all privileges on *.* to #{myuser_o}@’10.0.0.%’ identified by "#{mypass_o}";
grant all privileges on *.* to #{myuser_o}@’localhost’ identified by "#{mypass_o}";
grant all privileges on *.* to #{myuser_ro}@’10.0.0.%’ identified by "#{mypass_ro}";
grant all privileges on *.* to #{myuser_ro}@’localhost’ identified by "#{mypass_ro}";
grant replication slave, replication client on *.* to #{myuser_re}@’10.0.0.%’ identified by "#{mypass_re}";
grant replication slave, replication client on *.* to #{myuser_re}@’localhost’ identified by "#{mypass_re}";
drop database test;
delete from mysql.user where password=”;
flush privileges;
EOF
EOL
end

script "create_pfile" do
not_if ‘ls /root/.path_to_filed’
interpreter "bash"
user "root"
code <<-EOL
echo "#{mypass_ro}" > /root/.path_to_file
chown 400 /root/.path_to_file
EOL
end[/shell]

今回はとりあえずここまでです。見ていただいてありがとうございました。
次回はwebserverのレシピです。

おすすめ記事