繁体   English   中英

在Ruby for Chef食谱中使用变量

[英]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

我是红宝石的新手。 我尝试将access_key和secret_access_key变量声明为全局变量。 那没有解决问题。 我不确定如何解决此问题。 任何帮助表示赞赏。

问题在于变量是在块内声明的,块中声明的变量的作用域是该块,因此当块结束时( 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

要记住的一件事是,这不是存储机密的“主要方式”。 我们不想在源代码控制中使用的项目通常存储在数据包中

对于访问密钥之类的秘密,“厨师方式”是使用加密的数据包,或者如果您需要更多的企业,则可以使用厨师保险库

我认为您的方法在这里有些杂草丛生。

考虑使用AWS CloudFormation服务创建AWS基础设施,例如RDS。 Chef更适合在VM(例如EC2实例)上运行并配置软件堆栈。

例如,使用云形成来创建您的EC2实例。 使用chef在其上安装软件组件,例如JDK,Tomcat等。

正如您所包含的注释所表明的那样,使用本食谱时,IAM实例配置文件将是处理身份验证/授权的首选方式。 使用当前的解决方案,您可以考虑将这些变量存储在加密的数据包中。

我怀疑您的错误与厨师的融合/执行阶段有关。 作为故障保险,当您通过json属性执行菜谱时,可以通过刀/厨师独奏将这些信息传入。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM