11

プライベートgitリポジトリに、ロール、クックブック、データバッグなどの完全なChef構成セットがあります。

Chefサーバーにアップロードするときに、-secret-fileオプションを使用してデータバッグを暗号化できることがわかりました。

しかし、暗号化されたデータバッグもgitリポジトリに保存したいと思います。

頭に浮かぶのは、プレーンテキストのjsonファイルをローカルで作成し、暗号化してChefにアップロードしてから、暗号化されたJSONをChefWebページから取得してリポジトリコピーに貼り付けることだけです。

他の誰かがこの問題を解決しましたか?

4

3 に答える 3

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-serverでデータバッグを直接編集することです。ただし、クックブックをまだ作成していてアップロードしていない場合は問題がありますが、データバッグはすでに存在し、古いバージョンのクックブックで使用されています。このように、chef-clientを特定のノードで実行すると、エラーが発生する可能性があります。

そこで、chef-serverを使用せずに、暗号化されたデータバッグをローカルで編集し、新しいバージョンのクックブックと一緒に新しいバージョンをアップロードすることを考えていました(テストに合格した後)。これが、暗号化されたデータバッグを編集するために現在使用しているレーキタスクです

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]
于 2012-12-13T15:50:53.743 に答える
1

@ draco-aterの例をもう少し取り上げました。これは、クックブックディレクトリで../encrypted_data_bagなどを実行してデータバッグを編集したい場合があるため、名前を短くし、追加のbashマジックを使用してシンボリックリンクされている場合でも実際のディレクトリ(ファイルシステムのどこからでも呼び出すことができます)。データバッグに取り組んでいるのは私だけではないので、他の誰かがアイテムを更新し、データをリポジトリにプッシュした場合に備えて、いつでもデータバッグの内容を表示できるようにしたかったのです(追加を忘れた場合)。 。また、データの一貫性を高めるために、サーバーからデータを削除した場合は、リポジトリからデータを削除する必要がありました。そこで、このスクリプトを思いつきました。私のencrypted_data_bag_secretは/etc/ chef/encrypted_data_bag_secretの下にあることに注意してください。

#!/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
于 2013-11-22T06:08:59.590 に答える
0

これを実現するもう1つの方法は、ナイフプラグインを使用することです。

ナイフのバックアップhttps://github.com/mdxp/knife-backup

knife backup export data_bags

ナイフの必需品 https://github.com/jkeiser/knife-essentials

knife download data_bags
于 2014-01-24T17:08:31.990 に答える