Puppet 如何按角色划分hiera配置?

Puppet 如何按角色划分hiera配置?,puppet,hiera,Puppet,Hiera,我使用hiera为我的节点分配类,如webserver或dbserver。webserver类只包括apache并在其上设置一些配置(例如端口)。显然,我不想为每个节点复制这个配置,所以我把它放在common.yaml中。然而,我的common.yaml变得越来越大,所以我想将其拆分。我希望一个文件包含webserver角色的配置,另一个文件包含dbserver角色的配置,等等。我想象我的hiera.yaml如下所示: :hierarchy: - "fqdn/%{::fqdn}" - "

我使用hiera为我的节点分配类,如
webserver
dbserver
webserver
类只包括apache并在其上设置一些配置(例如端口)。显然,我不想为每个节点复制这个配置,所以我把它放在common.yaml中。然而,我的common.yaml变得越来越大,所以我想将其拆分。我希望一个文件包含
webserver
角色的配置,另一个文件包含
dbserver
角色的配置,等等。我想象我的hiera.yaml如下所示:

:hierarchy:
  - "fqdn/%{::fqdn}"
  - "role/%{ROLE}"
  - common
其中
角色
文件夹将包含类似
webserver.yaml
appserver.yaml
dbserver.yaml
的文件。我看到很多博客帖子说,解决方案是创建一个自定义的“角色”事实,但大多数博客都是通过从代理节点上的文件(例如从
/etc/role
)加载该事实来实现的,在我看来,这似乎与傀儡的观点背道而驰(我专门使用puppet,这样我就不必每次都登录到每个节点并更改一些配置,每次我都希望它有一些新角色)

要明确的是,我不想编辑代理上的文件来实现这一点,我希望使用主服务器上的配置完成这一切

我想我可以像下面这样,详尽地列出每个角色作为层次结构中的一个元素,但这似乎不那么容易管理

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

有什么方法可以解决这个问题吗?

要在hiera配置中使用
$Role
,需要将其作为事实/变量提供,但是有一种方法可以在主机上而不是在节点上执行此操作。这是可以使用的方法之一

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


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

我想出了一个解决方案。唯一的缺点是,角色的最大数量是硬编码的。这将是在使用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