6

我正在使用 hiera 将类分配给我webserverdbserver节点。该类webserver只包括 apache 并在其上设置一些配置(例如端口)。显然我不想为每个节点复制这个配置,所以我把它放在 common.yaml 中。但是,我的 common.yaml 越来越大,所以我想将它拆分。我想要一个包含角色配置的文件webserver,另一个包含角色配置的文件dbserver等。我想象我的 hiera.yaml 看起来像这样:

:hierarchy:
  - "fqdn/%{::fqdn}"
  - "role/%{ROLE}"
  - common

role文件夹将包含文件的位置,如webserver.yaml, appserver.yaml, dbserver.yaml. 我已经看到各种博客文章说解决方案是创建一个自定义的“角色”事实,但他们中的大多数通过从代理节点上的文件(例如 from /etc/role)加载该事实来实现这一点,在我看来这似乎打败了puppet 的要点(我专门使用 puppet,所以每次我希望它具有一些新角色时,我都不必登录每个节点并更改一些配置)。

需要明确的是,我不想编辑代理上的文件来让它工作,我希望这一切都使用主服务器上的配置完成。

我想我可以有类似下面的内容并详尽地列出每个角色作为层次结构中的一个元素,但这似乎不太容易管理。

:hierarchy:
  - "fqdn/%{::fqdn}"
  - "webserver"
  - "appserver"
  - "dbserver"
  - common

有没有办法解决这个问题?

4

2 回答 2

3

为了能够$Role在您的 hiera 配置中使用,它需要作为事实/变量提供,但是有一种方法可以在主节点而不是节点上执行此操作。这是外部节点分类器可以用来做的事情之一。

基本上,您需要编写一个脚本来获取节点名称并打印出包含Role参数值的 yaml。例如,您可以有一个 yaml 文件,它只是节点名称到角色的映射,然后脚本进行查找并打印结果(作为链接模式中的参数)。这是一个例子

如果您对新工具感兴趣,还有更强大的 ENC。例如,Foreman为您提供了一个 Web 界面,用于将主机组合成相似的角色、设置参数以注入 puppet 运行等。

于 2015-05-16T04:50:38.227 回答
1

我已经想出了一个解决方案。唯一的缺点是角色的最大数量是硬编码的。使用 hiera 3 会更好,然后试试这个:

/etc/puppet/hiera.yaml

 ---
:backends:
  - yaml
:yaml:
  :datadir: /etc/puppet/hieradata
:hierarchy:
  - 'nodes/%{::clientcert}'
  - 'roles/%{::role_4}'
  - 'roles/%{::role_3}'
  - 'roles/%{::role_2}'
  - 'roles/%{::role_1}'
  - common

/etc/puppet/manifests/site.pp

# Get roles
$roles = hiera_array('roles', [])

# Declare Roles in vars (not needed in puppet 4)
$role_1 = $roles[0]
$role_2 = $roles[1]
$role_3 = $roles[2]
$role_4 = $roles[3]

# Include Classes
hiera_include('classes')

/etc/puppet/hieradata/roles/webserver.yaml

---
classes:
  - nginx

# put nginx config here

/etc/puppet/hieradata/nodes/your_node_name.yaml

---
roles:
 - webserver

classes:
# put node specific stuff here
于 2016-02-12T16:42:26.543 回答