【问题标题】:Using variables in Ruby for Chef cookbook在 Ruby for Chef 食谱中使用变量
【发布时间】:2015-02-11 07:03:20
【问题描述】:

我有我用来在 AWS 上创建 RDS 实例的说明书。我不想将 AWS 凭证存储在我的代码中,因此我编写了一小段 Ruby 代码 sn-p 来从存储在本地计算机上的文件中获取凭证。代码如下:

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 变量声明为全局变量。那并没有解决问题。我不确定如何解决这个问题。任何帮助表示赞赏。

【问题讨论】:

    标签: ruby amazon-web-services chef-infra chef-recipe


    【解决方案1】:

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

    要记住的一件事是,这不是存储秘密的“主厨方式”。我们不需要源代码管理的项目通常存储在data bags

    对于诸如访问密钥之类的秘密,“主厨之道”是使用encrypted data bags,或者如果您需要更多的企业,则使用chef vault

    【讨论】:

    • 我认为这也是问题所在。我确实尝试像在代码中那样在块之外声明变量。现在我收到一个新错误,类似于:Error execution action create on resource 'aws-rds[AQAAD] AWS::RDS::Errors::IncompleteSignature ---------------- --------------------- 授权标头需要“签名”参数。授权标头需要“SignedHeaders”参数。当我直接使用我的凭据时,它可以工作。我很困惑。
    • 您可以尝试使用log 资源注销access_key 和secret_access_key 以确保其设置正确
    【解决方案2】:

    我认为你在这里的方法有点过时了。

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

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

    正如您所包含的 cmets 所示,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
    

    【讨论】:

    • @arthur 在下面是正确的。这不是收敛/执行阶段的问题,而是变量范围。
    • 有趣的观点。我会试试云形成服务
    • 好吧,和我一起工作的人都想成为“平台无关”。我猜想使用 Cloud Formation 会被扔出窗外。不过感谢您的帮助。
    • 呃,太糟糕了,他们给了你这样的警察。归根结底,您仍在使用 rds。谁在乎您是否使用云形成与厨师进行了配置。如果您正在安装和维护自己的 postgres 安装,那么我同意,但这将使用 chef 来做它擅长的事情——配置一个 vm。
    • Scubadev,有任何问题可以直接与您联系吗?我现在正在尝试从快照创建一个 RDS 实例,并且我正在使用超市上的一本食谱。它没有从快照创建 RDS 的功能。我不确定如何使该功能正常工作。如果你愿意,我可以在 stackoverflow 上提出一个新问题。我使用的食谱如下:supermarket.chef.io/cookbooks/aws-rds
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多