与Chef一起部署secrets.yml

时间:2015-06-06 01:42:02

标签: ruby-on-rails chef

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

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

我的secrets.yml文件显然没有提交给我公开访问的github仓库。我可以使用对环境变量的引用来提交它,但是那些变量必须在我公开访问的Chef github repo中的某处设置?

2 个答案:

答案 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