2012-12-12 6 views
11

Mam pełny zestaw konfiguracji Chef ról, książek kucharskich, databag itp., W prywatnym repozytorium git.Szyfrowanie worków danych szyfruje na serwerze Chef, ale jak zaszyfrować kopię lokalną?

Widzę, że mogę użyć opcji --secret-file, aby zaszyfrować databag po przesłaniu jej na serwer Chef.

Ale chcę przechowywać te zestawy danych również zaszyfrowane w repozytorium git.

Jedyne, co przychodzi mi na myśl, to tworzenie lokalnego pliku json z tekstem jawnym, przesyłanie go do Chef'a za pomocą szyfrowania, a następnie zabranie zaszyfrowanego JSON ze strony internetowej Chef i wklejenie go do mojej kopii repozytorium.

Czy ktoś jeszcze rozwiązał ten problem?

Odpowiedz

15

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] 
+0

mi się podoba, dziękuję! – Mojo

+0

Sprytny, dzięki! – allaire

+0

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

1

Wziąłem przykład z @ Draco-ater trochę dalej, jak znajdę sobie chcąc edytować torby danych, podczas gdy w katalogu książki kucharskiej robiąc coś takiego jak .../encrypted_data_bag itd., więc skróciłem nazwę i użyłem dodatkowej magii bash, aby znaleźć rzeczywisty katalog, nawet jeśli jest on dowiązany symbolicznie (można go wywołać z dowolnego miejsca w systemie plików). Ponieważ nie jestem jedyną osobą pracującą przy workach z danymi, chciałem w każdej chwili pokazać zawartość torebki na wypadek, gdyby ktoś inny zaktualizował produkty i nadal przekazywał dane do repozytorium (na wypadek, gdyby zapomniały go dodać) . Chciałem również, aby dane zostały usunięte z repozytorium, jeśli zostały usunięte z serwera, aby były bardziej spójne. Więc wymyśliłem ten skrypt. Należy pamiętać, że moja encrypted_data_bag_secret znajduje się pod/etc/chef/encrypted_data_bag_secret, jednak inni mogą umieścić ją gdzie indziej, dlatego na górze skryptu znajduje się SECRETFILE, po prostu zmodyfikuj go tam, gdzie istnieje zaszyfrowany tajny plik.

#!/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

Ładnie zrobione. :) – Mojo

+0

Dzięki;) Wszystko o automatyzacji wszystkiego lol –

Powiązane problemy