Amazon AWS EC2 + Puppet,让 Puppet 了解 AWS 实例标签

Pio*_*icz 5 puppet amazon-web-services

我的 AWS 部署遇到了问题,对 AWS 和 Puppet 来说还很陌生。

所以来到我的问题 - 你能用 AWS 机器标签或 CNAME 域区分 puppet 节点吗?

关于计划的一点背景:

  • 有多个机器集群,一个php集群,一个legacy php集群,一个java集群,一个perl集群
  • 使用 puppet 控制配置——对 puppet 来说仍然很新,但作为开发人员,我喜欢能够对服务器进行版本控制配置的想法
  • 在这些集群上启用自动缩放 - 显然,云的主要好处是在任何合理的性能方面都值得付出高昂的代价(那些亚马逊机器比我的手机慢......)
  • 部署由 Capistrano 控制,这让事情变得容易多了

因此,在 AWS 中,您会获得那些超级讨厌的公共/私有机器 dns ……您无法识别这些机器上的机器。为了缓解这个问题,像 AWS 这样的接缝希望你标记所有东西 - 所以我做到了。由于 Route53 API,找到了一个脚本,该脚本为每台带有“ShortName”标签的机器创建 CNAME 记录。

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

我想要

node 'perl-cluster'{}
Run Code Online (Sandbox Code Playgroud)

在傀儡中,有人知道如何实现这一目标吗?

谢谢

Sir*_*rch 8

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

AWS 用户数据文档

curl http://169.254.169.254/latest/
Run Code Online (Sandbox Code Playgroud)

所以当我输入facter role'dbserver','webserver' 什么的,然后用它来定义一个节点时,重要的是不要让自动缩放组关心服务器的名称是什么。

/etc/puppet/manifests/nodes.pp

node default{
  include nodes::type
}
Run Code Online (Sandbox Code Playgroud)

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

import “type.pp”
Run Code Online (Sandbox Code Playgroud)

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

class nodes::type{
   case $role {
     “dbserver” : {
       include mysql
     }
   }
   case $role {
      “webserver” : {
       include httpd
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

/etc/puppet/manifests/modules.pp

 import nodes
Run Code Online (Sandbox Code Playgroud)

我不想确切地告诉您如何在您的情况下执行此操作,但在这里我将向您展示如何创建自定义事实来报告 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
Run Code Online (Sandbox Code Playgroud)

瞧,写了一个自定义事实。

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

$ facter instance_id
i-a1c0ffee
Run Code Online (Sandbox Code Playgroud)

我没有在这台机器上安装 puppet,但是如果我想让 puppet 可以使用它,请将 id 放入 /var/lib/puppet/lib/facter,并将其分发给客户端 id 确保 puppet.conf 中的 pluginsync=true。

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