Amazon AWS EC2 + Puppet,让Puppet知道AWS实例标签

我的AWS部署有问题,对于AWS和Puppet来说是相当新颖的。

所以来到我的问题 – 你可以区分傀儡节点与AWS机器标签或CNAME域?

关于这个计划的一点背景:

  • 有多个机器集群,一个php集群,一个传统的php集群,一个java集群,一个perl集群
  • 用puppet控制configuration – 对于傀儡来说还是很新的,但作为一个开发者,我喜欢能够对服务器进行版本控制configuration的想法
  • 在这些群集上启用了自动扩展function – 显然,云计算的主要优势是,当涉及到任何合理的性能时(这些亚马逊机器比我的手机慢)
  • 部署由Capistrano控制,这使事情变得更容易

所以在AWS中,你会得到这些超级讨厌的公共/私人机器的DNS …没办法,你可以识别那些机器。 为了缓解这个问题,像AWS这样的接缝想要你标记所有东西 – 所以我做了。 find了一个脚本,为每个带有“ShortName”标签的机器创build一个CNAMElogging,这要归功于Route53 API。

每台机器都有一个ShortName标签,成为其CNAME,不幸的是puppet仍然可以parsing私人DNS名称。

我想要

node 'perl-cluster'{} 

在傀儡里,任何人都有线索来达到这个目的?

谢谢

我这样做的方式是写服务器的自定义事实,以从用户数据中识别它的angular色,可以在169.254.169.254上访问它,查看您自己的用户数据

AWS用户数据文档

 curl http://169.254.169.254/latest/ 

所以当我inputfacter facter role时,无论如何获取'dbserver','webserver',然后使用它来定义一个节点,重要的是不要让autoscaling组丝毫不在乎服务器的名字。

/etc/puppet/manifests/nodes.pp

 node default{ include nodes::type } 

/etc/puppet/modules/nodes/manifests/init.pp

 import “type.pp” 

/etc/puppet/modules/nodes/manifests/type.pp

 class nodes::type{ case $role { “dbserver” : { include mysql } } case $role { “webserver” : { include httpd } } } 

/etc/puppet/manifests/modules.pp

  import nodes 

我不想告诉你如何在你的情况下做到这一点,但在这里我会告诉你如何创build一个自定义事实来报告EC2实例ID。

装饰,curl,安装。

 mkdir -p /home/ec2-user/lib/ruby/facter export FACTERLIB=/home/ec2-user/lib/ruby/facter cat > /home/ec2-user/lib/ruby/facter/instance_id < EOF # instance_id.rb # require 'facter' Facter.add("instance_id") do setcode "/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id" end EOF 

而且,我写了一个习惯性的事实。

现在我可以使用它来获取ec2实例ID:

 $ facter instance_id i-a1c0ffee 

我没有在这台机器上安装puppet,但是如果我想把它提供给傀儡,id放在它/ var / lib / puppet / lib / facter,并分发给客户端id确保puppet.conf中的pluginsync = true。

请记住,所有我说的是非常主观的,它只是我如何做,如果更好的方式,我会感兴趣。

在1.7(2013年4月发布)中,有内置的事实报告了EC2实例的各种细节。

参考: http : //docs.puppetlabs.com/facter/1.7/core_facts.html#ec2ec2-instance-data

我同意西格的观点,在这一点上,自定义的事实似乎是要走的路。 AWS在以下url描述使用Cloud形成事实:

https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf

这是一个有趣的,如果困难的阅读。 自定义的事实是:

 # cfn.rb require 'rubygems' require 'json' filename = "/var/lib/cfn-init/data/metadata.json" if not File.exist?(filename) return end parsed = JSON.load(File.new(filename)) parsed.default = Hash.new parsed[\"Puppet\"].each do |key, value| actual_value = value if value.is_a? Array actual_value = value.join(',') end Facter.add(\"cfn_\" + key) do setcode do actual_value end end end 

然后他们configuration他们的节点,如:

 node basenode { include cfn } node /^.*internal$/ inherits basenode { case $cfn_roles { ...cloud formation include... } } 

我更倾向于通过hiera实现这个:

 --- :backends: - yaml :yaml: :datadir: /etc/puppet/hiera :hierarchy: - "roles/%{::cfn_roles}" - common 

然后有像common.yaml:

 classes: cfn # or whatever your custom fact class is 

angular色/ dbserver.yaml:

 classes: mysql 

angular色/ webserver.yaml:

 classes: httpd httpd::port: 8080 ... 

杰夫