我试图find一个简单而优雅的方式,让傀儡识别它在EC2中使用的节点types。 为了简单起见,假设我有3种节点types:web,api和db。
现在,最简单的方法是使puppet清单中的节点名称等于Amazon给它们的随机主机名,例如:
node 'domU-12-12-12-12-12-AB' inherits 'common' { #you're a web instance } node 'domU-13-13-13-13-13-AC' inherits 'common' { #you're an api instance } node 'domU-14-14-14-14-14-AD' inherits 'common' { #you're a db instance }
但是,每当你添加或closures一个实例及其自然的主机名改变时,就会有节点重命名的情况。 另一个缺点是主机名更改,所以傀儡节点清单将不得不每次修补。
你经常听到的一条路线是编辑/ etc / hosts和/ etc / hostname到“web1”,然后在puppet节点语句中使用正则expression式。 问题是私有IP再一次变化,因此你需要更新/ etc / hosts,所以这是一个很头痛的问题。 您现在还需要将真正的亚马逊给定的主机名映射到您刚刚提供给实例的主机名,这是另一个令人头痛的问题。 我读了cloud-init是解决这个问题的方法,但是我还没有玩得太多。
我正在努力避免额外的开销/步骤,可能是脆弱和破裂,所以我正在寻找一个解决scheme,上面这首先是简单的。
你会推荐什么?
推荐的方法是使用自定义事实对节点进行分类。
你可以像这样使用nodes.pp
:
node default { hiera_include('classes') } node /.*some.domain.com$/ inherits default { }
这样,您可以使用hiera.yaml
轻松地分配模块,同时将通用模块保存在另一个yaml文件中。 这可能是一个例子:
--- :backends: - yaml :hierarchy: - "%{::hostname}" - common :yaml: :datadir: "/etc/puppet/hieradata/%{::domain}/%{::location}"
在/etc/facter/facts.d/datacenter.yaml
文件中定义了location
事实,如果需要,也可以有更多的事实:
--- location: rohan
生成的目录结构可能如下所示:
$ tree . ├── hiera.yaml └── some.domain.com ├── rohan │ ├── common.yaml │ ├── host.specific.yaml │ └── other.host.yaml └── mordor ├── common.yaml ├── some.host.yaml └── other.host.yaml
关于使用hiera
来分类节点的更多想法可以在这里find。
不要使用node
来分类机器。 写一个“angular色”的事实/etc/facter/facts.d/role.txt
。 使用ec2实例ID作为puppet证书名称。 使用hiera的hiera_include
根据节点的role
事实分配模块。
这是我去年就这个话题做了一个幻灯片的幻灯片。 https://speakerdeck.com/robbyt/puppetcamp-nyc-2012-puppet-in-the-cloud