Mam następujący bash (zwany encrypted-databag.sh) w mojej kuchni katalogu roboczego:
#!/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
To oszczędza mi wpisywania za każdym razem jak nóż, żeby pokazać mi zaszyfrowany torbę danych. I automatycznie aktualizuje/zapisuje go w repozytorium, kiedy go edytuję.
Zaktualizowano 30.08.2013
Wadą powyższego skryptu jest, aby edytować swój worek danych prosto na Chef-serwer. Ale pojawia się problem, gdy nadal pracujesz nad książką kucharską i nie przesyłasz jej, ale worek danych już tam jest i jest używany przez starszą wersję książki kucharskiej. W ten sposób, gdy szef-klient jest uruchamiany w jakimś węźle, może to prowadzić do błędów.
Tak więc myślałem o edycji zaszyfrowanej woreczku danych lokalnie, bez serwera szefa kuchni, a następnie przesłaniu nowej wersji wraz z nową wersją książki kucharskiej (po zdaniu testów). Tak oto zadanie rake używam teraz do edycji zaszyfrowanych worków danych.
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
Teraz edytować zaszyfrowanego torbę danych używam:
rake databag:edit[my_databag,item_in_databag]
mi się podoba, dziękuję! – Mojo
Sprytny, dzięki! – allaire
Dzięki, pomogło mi to z innym, ale pokrewnym problemem, mogę teraz szyfrować databagi bezpośrednio z ruby bez potrzeby kontaktowania się z serwerem szefa kuchni, aby to zrobić, więc dzięki, super pomocni! jeśli chcesz wiedzieć, jak to zrobiłem, przejdź tutaj: http: //stackoverflow.com/questions/26978737/encrypt-data-bag-with-knife-from-inside-ruby – Thermatix