encrypted data bag を使ってユーザ作成
chef がんばりたい。
encrypted data bag にユーザ情報を暗号化して格納、そして knife solo するまで。
knife data bags インストール
gem install knife-solo_data_bag
暗号化用の鍵作成
openssl rand -base64 512 | tr -d '\r\n' > data_bag_key
knife の設定
data_bag_path './data_bags' encrypted_data_bag_secret './data_bag_key' cookbook_path ["./cookbooks", "./site-cookbooks"]
EDITOR環境変数の設定
export EDITOR=vim
data bag 作成
knife solo data bag create BAG [ITEM] --secret-file ./data_bag_key
すると EDITOR に設定されたエディタが開く。また、この時に --secret-file を指定しないと暗号化されなかった。
暗号化パスワードの作成
data bag 内にパスワードを格納する際には、パスワードそのものも暗号化されている必要がある。
openssl passwd -1 password
データの作成
初期状態では id のみが格納されている。 password には上記のパスワードをコピペ。
{ "id": "[ITEM]", "user": "hoge", "password": "password" }
暗号化されているか確認
cat data_bags/BAG/[ITEM].json
{ "id": "[ITEM]", "name": { "encrypted_data": "暗号化データ", "iv": "暗号化データ", "version": 1, "cipher": "aes-256-cbc" }, "password": { "encrypted_data": "暗号化データ", "iv": "暗号化データ", "version": 1, "cipher": "aes-256-cbc" }
復号化して確認
knife solo data bag show BAG [ITEM] --secret-file ./data_bag_key
編集
knife solo data bag edit BAG [ITEM] --secret-file ./data_bag_key
recipe に適用
site-cookbooks/useradd/recipes/[ITEM].rb
user = Chef::EncryptedDataBagItem.load("BAG", '[ITEM]') user_name = user['name'] passwd = user['password'] home = "/home/#{user_name}" user user_name do home home shell "/bin/bash" supports :manage_home => true password passwd # password を関数内の頭に記載するとパスワードが設定されない場合があった action :create end group user_name do members user_name append true action :create end bash 'sudoers' do user 'root' code <<-EOS echo "#{user_name} ALL=(ALL) ALL" > /etc/sudoers.d/#{user_name} EOS end
role から呼び出す
roles/[ITEM].rb
run_list( "recipe[useradd::[ITEM]]", )
node を書く
nodes/[ITEM].rb
{ "run_list": [ "role[ITEM]" ], "override_attributes": { "node": { "hostname": "[ITEM]" } } }
cook
knife solo cook [ITEM] <i>host</i>
ちょっとハマった
- knife configure がちゃんとできていない時、knife.rb を直接指定しないと data_bag_key がうまくリモートに転送できなかった。