amazon-web-services – 亚马逊AWS EC2 Puppet,让Puppet知道AWS实例标签

我的AWS部署存在问题,对AWS和Puppet来说还不够新.

所以提出我的问题 – 您能否将木偶节点与AWS机器标签或CNAME域区分开来?

关于该计划的一点背景:

>拥有多个机器集群,一个php集群,一个遗留php集群,一个java集群,一个perl集群
>使用puppet控制配置 – 对于puppet来说还是一个新手,但作为开发人员,我喜欢能够对服务器进行版本控制配置的想法
>在这些集群上启用了自动调节功能 – 显然云的主要好处是,当涉及到任何合理的性能时,云的成本会高得多(那些亚马逊机器比我的手机慢……)
>由Capistrano控制的部署,这使事情变得容易多了

所以在AWS中你得到那些超级讨厌的公共/私人机器dns ……你无法识别那些机器.为了缓解这个问题,像AWS这样的接缝想要你标记所有东西 – 所以我做了.由于Route53 API,找到了一个脚本,该脚本使用标签“ShortName”为每台机器创建CNAME记录.

每台机器都有一个ShortName标签,它变成了它的CNAME,不幸的是,puppet仍然解析了私有的dns名称.

我想要

node 'perl-cluster'{}

在木偶,任何人都有任何线索来实现这一目标?

谢谢

最佳答案
我这样做的方法是为服务器编写一个自定义事实,以便从用户数据中识别其角色,可以在169.254.169.254上访问,查看您自己的用户数据…

AWS user-data documentation

curl http://169.254.169.254/latest/

因此当我输入facter role ill得到’dbserver’,’webserver’无论如何,然后使用它来定义一个节点,重要的是不要让自动缩放组关心服务器的名称.

/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

我不想在你的情况下告诉你如何做到这一点,但在这里我将向你展示如何创建一个自定义事实来报告EC2实例ID.

Facter,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,但如果我想让它可用于puppet,id将其放入/ var / lib / puppet / lib / facter,并将其分发给客户端id,请确保puppet.conf中的pluginsync = true.

请记住,我所说的一切都是高度主观的,它就是我如何做到的,如果有更好的方式,我会感兴趣.

转载注明原文:amazon-web-services – 亚马逊AWS EC2 Puppet,让Puppet知道AWS实例标签 - 代码日志