我正在尝试找到一种简单而优雅的方法,让 Puppet 识别它在 EC2 中工作的节点类型。为简单起见,假设我有 3 种节点类型: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
}
但是,这样做的缺点是,每次添加或关闭实例时,节点重命名都会破坏源代码控制,并且其自然主机名也会更改。另一个缺点是主机名会更改,因此每次都必须修补 puppet 节点清单。
您经常听到的一种建议是将 /etc/hosts 和 /etc/hostname 编辑为“web1”之类的内容,然后在 puppet 节点语句中使用正则表达式。问题是私有 IP 再次发生变化,因此您需要更新 /etc/hosts,所以这是一个很大的麻烦。您现在还需要将真正的 Amazon 提供的主机名映射到您刚刚提供给实例的主机名,这又是一个麻烦。我读到 cloud-init 是解决这个问题的方法,但我还没有尝试过很多次。
我正在努力避免过程中可能脆弱和中断的额外开销/步骤,因此我正在寻找一个首先简单的解决方案。
你会推荐什么?
答案1
推荐的方法是使用自定义事实对节点进行分类。
你可以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}"
事实location
在文件中定义/etc/facter/facts.d/datacenter.yaml
,如果需要,还可以包含更多事实:
---
location: rohan
您的 hieradata 的最终目录结构可能如下所示:
$ 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
对节点进行分类的更多想法可以参见这里。
答案2
不要使用node
来对机器进行分类。将“角色”事实写入/etc/facter/facts.d/role.txt
。使用 ec2 实例 ID 作为 puppet 证书名称。使用 hierahiera_include
根据role
节点事实分配模块。
这是我去年就该主题所做的演示的幻灯片。 https://speakerdeck.com/robbyt/puppetcamp-nyc-2012-puppet-in-the-cloud