在 Ubuntu Precise 中对 EC2 中的木偶节点进行分类的优雅方法?

在 Ubuntu Precise 中对 EC2 中的木偶节点进行分类的优雅方法?

我正在尝试找到一种简单而优雅的方法,让 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

相关内容