2012-12-12 66 views
11

我有一個完整的廚師配置角色,食譜,數據包等,在私人git存儲庫中的配置。數據包加密在Chef服務器上加密,但是如何加密本地副本?

我看到,我可以使用--secret-file選項在數據塊上傳到Chef服務器時對其進行加密。

但我想要存儲在git存儲庫中加密的數據庫。

唯一想到的是在本地製作一個純文本json文件,將其上傳到Chef並加密,然後從Chef網頁獲取加密的JSON並將其粘貼到我的存儲庫副本中。

有沒有其他人解決了這個問題?

回答

15

我在我的廚師工作目錄下的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] 
+0

我喜歡,謝謝! – Mojo

+0

聰明,謝謝! – allaire

+0

謝謝,這幫助了我一個不同的但相關的問題,我現在可以直接從紅寶石加密數據包,而無需聯繫廚師服務器來做到這一點,所以謝謝,超級有用!如果你想知道我是如何做到的,那麼去這裏:http://stackoverflow.com/questions/26978737/encrypt-data-bag-with-knife-from-inside-ruby – Thermatix

1

我從例子中@德拉科 - 亞特遠一點,我會發現自己想要編輯的數據包,而在菜譜目錄通過做類似../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 
+0

很好地完成。 :) – Mojo

+0

謝謝;)所有關於自動化的一切哈哈 –

相關問題