Шифрование данных суммирует шифрование на сервере Chef, но как шифровать локальную копию?

У меня есть полный набор конфигураций поваров, кулинарные книги, базы данных и т.д. в частном репозитории git.

Я вижу, что я могу использовать параметр -secret-file для шифрования базы данных при ее загрузке на сервер Chef.

Но я хочу сохранить эти базы данных, зашифрованные в репозитории git, а также.

Единственное, что приходит на ум, - это создать файл jcl файла с открытым текстом, загрузить его в шеф-повар с помощью шифрования, а затем зашифровать JSON с веб-страницы Chef и вставить его в мою копию репозитория.

Кто-нибудь еще решил эту проблему?

Ответ 1

У меня есть следующий 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

Это экономит меня, набирая каждый раз, когда я ножу, чтобы показать мне зашифрованный пакет данных. И он автоматически обновляет/сохраняет его в репозиторий, когда я его редактирую.

Обновлено 30.08.2013

Недостатком script выше является то, что вы редактируете свой пакет данных прямо на сервере-шеф-поваре. Но есть проблема, когда вы все еще работаете над какой-то кулинарной книгой и не загружаете ее, но пакет данных уже существует и используется старой версией кулинарной книги. Таким образом, когда chef-client запускается на некотором node, это может привести к некоторым ошибкам.

Итак, я подумывал об изменении зашифрованного пакета данных локально, без chef-сервера, а затем загрузил новую версию вместе с новой версией кулинарной книги (после того, как тесты прошли). Итак, вот задача 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]

Ответ 2

Я взял пример от @draco-ater немного дальше, так как хотел бы, чтобы я редактировал пакеты данных, находясь в каталоге cookbook, делая что-то вроде.. /encrypted _data_bag и т.д., поэтому я сократил имя и использовал некоторые дополнительные bash magic, чтобы найти фактический каталог, даже если он символически связан (может быть вызван из любой точки файловой системы). Поскольку я не единственный, кто работает с пакетами данных, я хотел, чтобы в любой момент можно было показать содержимое пакета данных, если кто-то еще обновил элементы и все еще нажимал данные в репо (в случае, если они забыли добавить его), Я также хотел, чтобы данные были удалены из репозитория, если они были удалены с сервера, чтобы быть более последовательными. Поэтому я придумал этот script. Пожалуйста, имейте в виду, что мой encrypted_data_bag_secret находится в /etc/chef/encrypted _data_bag_secret, однако другие могут захотеть поместить его куда-нибудь еще, поэтому в верхней части script есть 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