2012-12-12 40 views
11

Tôi có một bộ cấu hình đầu bếp đầy đủ các vai trò, sách dạy nấu ăn, thẻ dữ liệu, v.v., trong kho lưu trữ git riêng tư.Mã hóa túi dữ liệu mã hóa trên máy chủ Đầu bếp, nhưng làm thế nào để mã hóa bản sao cục bộ?

Tôi thấy rằng tôi có thể sử dụng tùy chọn --secret-file để mã hóa thẻ dữ liệu khi được tải lên máy chủ Đầu bếp.

Nhưng tôi cũng muốn lưu trữ các thẻ dữ liệu được mã hóa trong kho git.

Điều duy nhất có trong đầu là tạo một tệp json thô sơ cục bộ, tải lên đầu bếp bằng mã hóa, sau đó lấy JSON được mã hóa từ trang web Đầu bếp và dán vào bản sao lưu trữ của tôi.

Có ai khác đã giải quyết vấn đề này không?

Trả lời

15

Tôi có một bash sau (gọi là encrypted-databag.sh) trong thư mục làm việc đầu bếp của tôi:

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

Nó tiết kiệm cho tôi gõ mỗi khi tôi con dao để chỉ cho tôi cái túi dữ liệu được mã hóa. Và nó sẽ tự động cập nhật/lưu nó vào kho lưu trữ, khi tôi chỉnh sửa nó.

Cập nhật ngày 30.08.2013

Hạn chế của kịch bản trên là bạn chỉnh sửa túi dữ liệu của bạn thẳng vào bếp-server. Nhưng có một vấn đề khi bạn vẫn đang làm việc trên một số sách dạy nấu ăn và đã không tải lên nó, nhưng các túi dữ liệu đã có và được sử dụng bởi các phiên bản cũ của sách dạy nấu ăn. Bằng cách này khi đầu bếp-khách hàng được chạy trên một số nút, nó có thể dẫn đến một số lỗi.

Vì vậy, tôi đã suy nghĩ về việc chỉnh sửa túi dữ liệu được mã hóa cục bộ mà không cần đầu bếp-máy chủ và sau đó tải lên phiên bản mới của nó cùng với phiên bản mới của sách dạy nấu ăn (sau khi kiểm tra đã trôi qua). Vì vậy, đây là nhiệm vụ rake Tôi sử dụng ngay bây giờ để chỉnh sửa các túi dữ liệu đã mã hóa.

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 

Bây giờ để sửa túi dữ liệu được mã hóa tôi sử dụng:

rake databag:edit[my_databag,item_in_databag] 
+0

Tôi thích điều đó, cảm ơn bạn! – Mojo

+0

Thông minh, cảm ơn! – allaire

+0

Cảm ơn, Điều này đã giúp tôi với một vấn đề khác nhưng có liên quan, bây giờ tôi có thể mã hóa các thẻ dữ liệu trực tiếp từ ruby ​​mà không cần liên hệ với máy chủ đầu bếp để làm điều đó, vì vậy cảm ơn, siêu hữu ích! nếu bạn muốn biết làm thế nào tôi đã làm nó, sau đó đi ở đây: http: //stackoverflow.com/questions/26978737/encrypt-data-bag-with-knife-from-inside-ruby – Thermatix

1

tôi lấy ví dụ từ @ draco-ater một chút nữa là tôi sẽ thấy mình muốn chỉnh sửa túi dữ liệu trong khi trong thư mục sách dạy nấu ăn bằng cách làm một cái gì đó như ../encrypted_data_bag vv vì vậy tôi rút ngắn tên và sử dụng một số phép thuật bash thêm để tìm thư mục thực sự ngay cả khi nó được symlinked (có thể được gọi từ bất cứ nơi nào trong hệ thống tập tin). Vì tôi không phải là người duy nhất làm việc trên các túi dữ liệu nên tôi muốn khả năng hiển thị nội dung túi dữ liệu bất cứ lúc nào trong trường hợp ai đó đã cập nhật các mục và vẫn đẩy dữ liệu vào repo (trong trường hợp họ quên thêm nó) . Tôi cũng muốn dữ liệu bị xóa khỏi kho lưu trữ nếu nó đã bị xóa khỏi máy chủ để nhất quán hơn. Vì vậy, tôi đã đưa ra kịch bản này. Hãy nhớ rằng encrypted_data_bag_secret của tôi nằm dưới/etc/chef/encrypted_data_bag_secret, tuy nhiên những người khác có thể chọn đặt nó ở một nơi khác, đó là lý do tại sao có SECRETFILE ở đầu tập lệnh, chỉ sửa đổi nó với nơi tệp bí mật được mã hóa của bạn tồn tại.

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

Thực hiện tốt. :) – Mojo

+0

Cảm ơn;) Tất cả về tự động hóa mọi thứ lol –

Các vấn đề liên quan