我有一個完整的廚師配置角色,食譜,數據包等,在私人git存儲庫中的配置。數據包加密在Chef服務器上加密,但是如何加密本地副本?
我看到,我可以使用--secret-file選項在數據塊上傳到Chef服務器時對其進行加密。
但我想要存儲在git存儲庫中加密的數據庫。
唯一想到的是在本地製作一個純文本json文件,將其上傳到Chef並加密,然後從Chef網頁獲取加密的JSON並將其粘貼到我的存儲庫副本中。
有沒有其他人解決了這個問題?
我有一個完整的廚師配置角色,食譜,數據包等,在私人git存儲庫中的配置。數據包加密在Chef服務器上加密,但是如何加密本地副本?
我看到,我可以使用--secret-file選項在數據塊上傳到Chef服務器時對其進行加密。
但我想要存儲在git存儲庫中加密的數據庫。
唯一想到的是在本地製作一個純文本json文件,將其上傳到Chef並加密,然後從Chef網頁獲取加密的JSON並將其粘貼到我的存儲庫副本中。
有沒有其他人解決了這個問題?
我在我的廚師工作目錄下的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-client在某個節點上運行時,可能會導致一些錯誤。
所以我想在本地編輯加密的數據包,沒有廚師服務器,然後將新版本與新版本的食譜一起上傳(在測試通過後)。所以這裏是我現在用來編輯加密數據包的rake任務。
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]
我從例子中@德拉科 - 亞特遠一點,我會發現自己想要編輯的數據包,而在菜譜目錄通過做類似../encrypted_data_bag等東西,所以我縮短了名稱,並使用一些額外的bash魔法來查找實際目錄,即使它是符號鏈接的(可以從文件系統中的任何地方調用)。由於我不是唯一一個處理數據包的人,所以我希望能夠隨時顯示數據包內容,以防別人更新了項目並仍將數據推入回購站(以防他們忘記添加數據) 。我還希望將數據從存儲庫中刪除,如果從服務器中刪除數據以保持一致。所以我想出了這個劇本。請記住,我的encrypted_data_bag_secret駐留在/ etc/chef/encrypted_data_bag_secret下,但其他人可能會選擇將其放在其他位置,這就是爲什麼腳本頂部有SECRETFILE,只需在加密的祕密文件存在的位置修改即可。
#!/bin/bash -e
SECRETFILE="/etc/chef/encrypted_data_bag_secret"
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
appDir="$(cd -P "$(dirname "$SOURCE")/" && pwd)"
cd $appDir
if [ "$1" != "edit" ] && [ "$1" != "create" ] && [ "$1" != "delete" ] && [ "$1" != "show" ]
then
echo "Bad arguments!"
echo "First argument is what you want to do on the databag (show|edit|create|delete)"
echo "Second argument is the databag"
echo "Third argument is the item inside the databag"
echo ""
echo "Example: ./dbag edit aws main"
echo ""
echo "You used ($1) as the action to perform on ($2)/($3)"
exit 1
else
if [ "$1" == "delete" ]; then
knife data bag $1 $2 $3
if [ -z "$3" ]; then
rm -rf data_bags/$2
else
rm -f data_bags/$2/$3.json
fi
else
mkdir -p $appDir/data_bags/$2
knife data bag $1 $2 $3 --secret-file $SECRETFILE
knife data bag show $2 $3 -Fj > "./data_bags/$2/$3.json"
fi
fi
很好地完成。 :) – Mojo
謝謝;)所有關於自動化的一切哈哈 –
的另一種方式實現這一目標是使用刀插件:
刀備份https://github.com/mdxp/knife-backup
knife backup export data_bags
刀要領https://github.com/jkeiser/knife-essentials
knife download data_bags
我喜歡,謝謝! – Mojo
聰明,謝謝! – allaire
謝謝,這幫助了我一個不同的但相關的問題,我現在可以直接從紅寶石加密數據包,而無需聯繫廚師服務器來做到這一點,所以謝謝,超級有用!如果你想知道我是如何做到的,那麼去這裏:http://stackoverflow.com/questions/26978737/encrypt-data-bag-with-knife-from-inside-ruby – Thermatix