シェフの作業ディレクトリに次のbash(encrypted-databag.shと呼ばれます)があります。
#!/bin/bash -e
knife data bag $1 $2 $3 --secret-file ~/.chef/encrypted_data_bag_secret
if [ "$1" == "edit" ] ; then
knife data bag show $2 $3 -Fj > "./data_bags/$2/$3.json"
fi
暗号化されたデータバッグを表示するためにナイフを使うたびに入力する手間が省けます。また、編集すると自動的に更新/リポジトリに保存されます。
2013年8月30日に更新
上記のスクリプトの欠点は、chef-serverでデータバッグを直接編集することです。ただし、クックブックをまだ作成していてアップロードしていない場合は問題がありますが、データバッグはすでに存在し、古いバージョンのクックブックで使用されています。このように、chef-clientを特定のノードで実行すると、エラーが発生する可能性があります。
そこで、chef-serverを使用せずに、暗号化されたデータバッグをローカルで編集し、新しいバージョンのクックブックと一緒に新しいバージョンをアップロードすることを考えていました(テストに合格した後)。これが、暗号化されたデータバッグを編集するために現在使用しているレーキタスクです。
namespace 'databag' do
desc 'Edit encrypted databag item.'
task :edit, [:databag, :item, :secret_file] do |t, args|
args.with_defaults :secret_file => "#{ENV['HOME']}/.chef/encrypted_data_bag_secret"
secret = Chef::EncryptedDataBagItem.load_secret args.secret_file
item_file = "data_bags/#{args.databag}/#{args.item}.json"
tmp_item_file = "/tmp/#{args.databag}_#{args.item}.json"
begin
#decrypt data bag into tmp file
raw_hash = Chef::JSONCompat.from_json IO.read item_file
databag_item = Chef::EncryptedDataBagItem.new raw_hash, secret
IO.write tmp_item_file, Chef::JSONCompat.to_json_pretty( databag_item.to_hash )
#edit tmp file
sh "#{ENV['EDITOR']} #{tmp_item_file}"
#encrypt tmp file data bag into original file
raw_hash = Chef::JSONCompat.from_json IO.read tmp_item_file
databag_item = Chef::EncryptedDataBagItem.encrypt_data_bag_item raw_hash, secret
IO.write item_file, Chef::JSONCompat.to_json_pretty( databag_item )
ensure
::File.delete tmp_item_file #ensure tmp file deleted.
end
end
end
次に、暗号化されたデータバッグを編集します。
rake databag:edit[my_databag,item_in_databag]