我创建了一个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等)相对应。我怎样才能做到这一点?
答案 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