在Chef Recipe中动态获取Elasticache端点?

时间:2016-08-12 11:49:18

标签: chef amazon-cloudformation amazon-elasticache

我创建了一个CloudFormation模板来运行我的Web应用程序,其中包含一个Elastic Loadbalancer,三个运行Tomcat服务器的EC2实例和一个Elasticache。我在启动时运行了一个Chef配方,除其他外,它配置每个Tomcat的context.xml文件以指向Elasticache。

我想知道在配方中配置Elasticache的最佳方法是什么,所以我需要做的就是快速更改CloudFormation模板以显示它们中的一大堆( stack1-elasticache,stack2 -elasticache等

现在我简单地有一个硬编码的变量替换(不适合Chef,因为任何更改都会在每个Chef'd盒子上更新,除非每个都有单独的配方),但我想知道是否有使用方法AWS CLI和Chef的懒惰节点评估执行以下操作:

ruby_block 'Get Elasticache endpoint' do
block do
    node.run_state['elasticache'] = `some aws command to get the Elasticache endpoint I want`
end
end

source "context.xml.erb"
variables(lazy{
        {
            :tomcat_version => elasticache
        }
    }

让我感到震惊的是如何从亚马逊获取Elasticache名称。我计划做一些与我的例子非常相似的事情,增加每个新Elasticache的数量,并且它们的命名方案将与Tomcats( stack1-TC1,stack2-TC2等)相对应。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以查看AWS ruby​​ SDK gem,它可以在Cookbook库或提供程序中使用以获取运行时详细信息。在链接和一些代码下面,您可以利用它。

http://docs.aws.amazon.com/sdkforruby/api/Aws/ElastiCache/Client.html#describe_cache_clusters-instance_method

代码: -

require 'aws-sdk'

def create_aws_interface(aws_interface)        
      if !new_resource.aws_access_key.to_s.empty? && !new_resource.aws_secret_access_key.to_s.empty?
           creds = ::Aws::Credentials.new(new_resource.aws_access_key, new_resource.aws_secret_access_key)
      else
           Chef::Log.info('use iam profile')
           creds = ::Aws::InstanceProfileCredentials.new
      end
      Aws.config[:ssl_verify_peer] = false
      aws_interface.new(credentials: creds, region: new_resource.region)
end

def ec
      ec ||= create_aws_interface(::Aws::ElastiCache::Client)
end

# It will return all Elastic cache clusters in object, which needs to be parsed further.
def getClusterID()
    resp = ec.describe_cache_clusters({
       marker: "String",
       show_cache_node_info: true,
    })
end