与 Chef 一起部署 secrets.yml

Deploying secrets.yml with Chef

如何在使用 Chef 构建文件时将 Rails secrets.yml 文件部署到您的服务器?

我目前正在使用 Chef/Berkshelf/knife-solo。

我的 secrets.yml 文件显然没有提交到我的可公开访问的 github 存储库。我可以通过引用环境变量来提交它,但这些变量也必须在我可公开访问的 Chef github 存储库中的某处设置?

对于 chef-solo(更好:chef-zero)设置,我建议使用加密数据包。他们变得更容易与 chef12 一起使用:

https://docs.chef.io/chef/essentials_data_bags.html

只需将加密秘密排除在 git 之外(使用 .gitignore)并使用默认文件名 encrypted_data_bag_secret

使用knife -z(本地模式)到create/update个数据包:

# create secret
openssl rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret

# add encrypted_data_bag_secret to .gitignore

# convert your .yml file to .json
ruby -rYAML -rjson -e "puts YAML.load_file('secrets.yml').to_json"

# create encrypted data bag, don't remove/overwrite the id key!
EDITOR=vim knife data bag create -z apps railsapp --encrypt --secret-file encrypted_data_bag_secret

.chef/knife.rb:

中的便利设置
 local_mode true    # makes -z default
 knife[:secret_file] = 'encrypted_data_bag_secret' # default for --secret-file

秘诀:只映射数据包项“.to_yaml”,例如映射结构 1:1 这样您就不必编写复杂的配方逻辑,除了加载数据包项 + 使用模板资源。

继续并接受罗兰的回答,因为它有利于厨师的内置功能并且最终会起作用。我开始走那条路,感觉就像 'a lot',以及从我的应用程序到 chef 存储库的流血逻辑以及 json 和 yaml 之间的转换很烦人。

最后,我只是将对称加密 gem 添加到我的项目中,并在将 secrets.yml 文件公开到 github 之前对其进行加密。我还创建了两个 rake 任务...rake secrets:encrypt 到 运行 本地每当我需要更改秘密和 rake secrets:decrypt 我 运行 在厨师克隆项目 repo 以构建secrets.yml 文件。

我将加密密钥添加到 .gitignore 并使用 vagrant 的文件配置器进行部署。

不一定会推荐这种方式,但如果有人喜欢它就在这里...

require 'resque/tasks'
require 'symmetric-encryption'

namespace :secrets do

  task "encrypt" do
    SymmetricEncryption.load!(File.join(Rails.root, 'config/symmetric-encryption.yml'), 'production')
    SymmetricEncryption::Writer.open(encrypted_secrets_file, encryption_options) do |file| 
      file.write(File.read(decrypted_secrets_file))
    end
  end

  task "decrypt" do
    SymmetricEncryption.load!(File.join(Rails.root, 'config/symmetric-encryption.yml'), 'production')
    File.open(decrypted_secrets_file, 'w') do |file|       file.write(SymmetricEncryption::Reader.open(encrypted_secrets_file).read)    end      
  end
end

def encryption_options
  { header: false, random_key: false, random_iv: false }
end

def encrypted_secrets_file
  File.join(Rails.root, 'config/encrypted_secrets')
end

def decrypted_secrets_file
  File.join(Rails.root, 'config/secrets.yml')
end