在 Chef 食谱中使用 Ruby 中的变量
Using variables in Ruby for Chef cookbook
我有我的食谱,我用它在 AWS 上创建 RDS 实例。我不想将 AWS 凭据存储在我的代码中,因此我编写了一小段 Ruby 代码以从存储在本地计算机上的文件中获取凭据。这是代码:
Dir.glob("#{Dir.home}/.aws/config1") do |my_config_file|
access_key = File.readlines(my_config_file)[0]
secret_access_key = File.readlines(my_config_file)[1]
#puts access_key
#puts "\n"
#puts secret_access_key
end
include_recipe "aws-rds"
aws_rds db_info[:name] do
# will use the iam role if available
# optionally place the keys
# see http://docs.aws.amazon.com/AWSSdkDocsRuby/latest/DeveloperGuide/ruby-dg-roles.html
aws_access_key access_key
aws_secret_access_key secret_access_key
engine 'postgres'
db_instance_class 'db.t1.micro'
region 'us-east-1'
allocated_storage 5
master_username db_info[:username]
master_user_password db_info[:password]
end
当我 运行 我的食谱时,我不断收到这样的错误:
Recipe Compile Error in C:/Users/amohamme1/.chef/local-mode-cache/cache/cookbooks/amir_rds_test-machines/recipes/up-machines.rb
================================================================================
NoMethodError
-------------
undefined method `access_key' for Chef::Resource::AwsRds
我是 ruby 的新手。我尝试将 access_key 和 secret_access_key 变量声明为全局变量。那并没有解决问题。我不确定如何解决这个问题。感谢任何帮助。
我认为你在这里的方法有点离题。
考虑使用 AWS CloudFormation 服务创建 AWS 基础设施部分,例如 RDS。 Chef 更适合 运行 在 VM(例如 EC2 实例)上配置您的软件堆栈。
例如,使用云形成来创建您的 EC2 实例。使用chef在其上安装软件组件,如JDK、Tomcat等
正如您所包含的评论所表明的,IAM 实例配置文件将是使用此说明书时处理 authentication/authorization 的首选方式。使用您当前的解决方案,您可以考虑将这些变量存储在加密数据包中。
我怀疑您的错误与厨师的 convergence/execution 阶段有关。作为故障保险,当您通过 json 属性执行食谱时,您可以通过 knife/chef-solo 传递这些。
knife .... --json-attributes '{"myCompany":{"aws":{"access_key":"...", "secret_key":"..."}}}'
你的食谱将变成
include_recipe "aws-rds"
aws_rds db_info[:name] do
aws_access_key node[:myCompany][:aws][:access_key]
aws_secret_access_key node[:myCompany][:aws][:secret_key]
engine 'postgres'
db_instance_class 'db.t1.micro'
region 'us-east-1'
allocated_storage 5
master_username db_info[:username]
master_user_password db_info[:password]
end
问题是变量是在块内声明的,在块中声明的变量的范围是该块,因此当块结束时(end
关键字)变量消失。如果你想在你的资源中使用变量,你应该这样做:
access_key = nil
secret_access_key = nil
Dir.glob("#{Dir.home}/.aws/config1") do |my_config_file|
access_key = File.readlines(my_config_file)[0]
secret_access_key = File.readlines(my_config_file)[1]
end
aws_rds db_info[:name] do
aws_access_key access_key
aws_secret_access_key secret_access_key
engine 'postgres'
db_instance_class 'db.t1.micro'
region 'us-east-1'
allocated_storage 5
master_username db_info[:username]
master_user_password db_info[:password]
end
要记住的一件事是,这不是存储秘密的 "Chef way"。我们不希望在源代码管理中的项目通常存储在 data bags.
中
对于访问密钥等机密,"Chef way" 要么使用 encrypted data bags or if you need to be more enterprise then chef vault。
我有我的食谱,我用它在 AWS 上创建 RDS 实例。我不想将 AWS 凭据存储在我的代码中,因此我编写了一小段 Ruby 代码以从存储在本地计算机上的文件中获取凭据。这是代码:
Dir.glob("#{Dir.home}/.aws/config1") do |my_config_file|
access_key = File.readlines(my_config_file)[0]
secret_access_key = File.readlines(my_config_file)[1]
#puts access_key
#puts "\n"
#puts secret_access_key
end
include_recipe "aws-rds"
aws_rds db_info[:name] do
# will use the iam role if available
# optionally place the keys
# see http://docs.aws.amazon.com/AWSSdkDocsRuby/latest/DeveloperGuide/ruby-dg-roles.html
aws_access_key access_key
aws_secret_access_key secret_access_key
engine 'postgres'
db_instance_class 'db.t1.micro'
region 'us-east-1'
allocated_storage 5
master_username db_info[:username]
master_user_password db_info[:password]
end
当我 运行 我的食谱时,我不断收到这样的错误:
Recipe Compile Error in C:/Users/amohamme1/.chef/local-mode-cache/cache/cookbooks/amir_rds_test-machines/recipes/up-machines.rb
================================================================================
NoMethodError
-------------
undefined method `access_key' for Chef::Resource::AwsRds
我是 ruby 的新手。我尝试将 access_key 和 secret_access_key 变量声明为全局变量。那并没有解决问题。我不确定如何解决这个问题。感谢任何帮助。
我认为你在这里的方法有点离题。
考虑使用 AWS CloudFormation 服务创建 AWS 基础设施部分,例如 RDS。 Chef 更适合 运行 在 VM(例如 EC2 实例)上配置您的软件堆栈。
例如,使用云形成来创建您的 EC2 实例。使用chef在其上安装软件组件,如JDK、Tomcat等
正如您所包含的评论所表明的,IAM 实例配置文件将是使用此说明书时处理 authentication/authorization 的首选方式。使用您当前的解决方案,您可以考虑将这些变量存储在加密数据包中。
我怀疑您的错误与厨师的 convergence/execution 阶段有关。作为故障保险,当您通过 json 属性执行食谱时,您可以通过 knife/chef-solo 传递这些。
knife .... --json-attributes '{"myCompany":{"aws":{"access_key":"...", "secret_key":"..."}}}'
你的食谱将变成
include_recipe "aws-rds"
aws_rds db_info[:name] do
aws_access_key node[:myCompany][:aws][:access_key]
aws_secret_access_key node[:myCompany][:aws][:secret_key]
engine 'postgres'
db_instance_class 'db.t1.micro'
region 'us-east-1'
allocated_storage 5
master_username db_info[:username]
master_user_password db_info[:password]
end
问题是变量是在块内声明的,在块中声明的变量的范围是该块,因此当块结束时(end
关键字)变量消失。如果你想在你的资源中使用变量,你应该这样做:
access_key = nil
secret_access_key = nil
Dir.glob("#{Dir.home}/.aws/config1") do |my_config_file|
access_key = File.readlines(my_config_file)[0]
secret_access_key = File.readlines(my_config_file)[1]
end
aws_rds db_info[:name] do
aws_access_key access_key
aws_secret_access_key secret_access_key
engine 'postgres'
db_instance_class 'db.t1.micro'
region 'us-east-1'
allocated_storage 5
master_username db_info[:username]
master_user_password db_info[:password]
end
要记住的一件事是,这不是存储秘密的 "Chef way"。我们不希望在源代码管理中的项目通常存储在 data bags.
中对于访问密钥等机密,"Chef way" 要么使用 encrypted data bags or if you need to be more enterprise then chef vault。