如何在使用Chef构建Rails secrets.yml文件时将其部署到服务器?
我目前正在使用Chef / Berkshelf / knife-solo。
我的secrets.yml文件显然没有提交给我公开访问的github仓库。我可以使用对环境变量的引用来提交它,但是那些变量必须在我公开访问的Chef github repo中的某处设置?
答案 0 :(得分:1)
对于chef-solo
(更好:厨师零)设置,我建议使用加密数据包。他们变得更容易与chef12:
https://docs.chef.io/chef/essentials_data_bags.html
只需将加密机密保留在git之外(使用.gitignore)并使用默认文件名encrypted_data_bag_secret
。
使用knife -z
(本地模式)创建/更新数据包:
# 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的方式映射结构,这样您就不必编写复杂的配方逻辑,除了使用模板资源加载数据包项目。
答案 1 :(得分:0)
走在前面并接受了Roland的回答,因为它有利于厨师的内置功能,并最终会起作用。我开始沿着这条路走下去,感觉就像很多,以及从我的应用程序到厨师仓库的流血逻辑以及json和yaml之间的转换很烦人。
最后,我刚刚将对称加密gem添加到我的项目中,并在将secrets.yml
文件暴露在github上之前加密它。我还创建了两个rake任务...... rake secrets:encrypt
在我需要更改机密时在本地运行,rake secrets:decrypt
我在厨师克隆项目仓库后立即运行以构建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