我使用分层来分配类,如webserver
或dbserver
到我的节点。webserver
类只包括apache和设置它的一些配置(例如端口)。显然,我不想为每个节点复制这个配置,所以我把它放在common.yaml中。然而,我的共同点。yaml越来越大,所以我想把它分拆。我想有一个文件包含webserver
角色的配置,另一个为dbserver
角色等。我在想象我的时代。
:hierarchy:
- "fqdn/%{::fqdn}"
- "role/%{ROLE}"
- common
其中role
文件夹将包含webserver.yaml
, appserver.yaml
, dbserver.yaml
等文件。我看到过各种各样的博客文章说,解决方案是创建一个自定义的"角色"事实,但大多数是通过从代理节点(例如从/etc/role
)上的文件加载事实来实现的,这对我来说似乎打败了puppet(我特别使用puppet,所以我不必每次登录到每个节点并更改一些配置我想要它有一些新的角色)。
要明确的是,我不想要在代理上编辑文件才能使其工作,我希望所有这些都使用主服务器上的配置来完成。
我想我可以像下面这样,详尽地列出每个角色作为层次结构中的一个元素,但这似乎不太好管理。
:hierarchy:
- "fqdn/%{::fqdn}"
- "webserver"
- "appserver"
- "dbserver"
- common
有办法解决这个问题吗?
为了能够在您的分层配置中使用$Role
,它需要作为事实/变量提供,但是有一种方法可以在主节点上而不是在节点上做到这一点。这是外部节点分类器可以用来做的事情之一。
基本上,您需要编写一个脚本,该脚本接受节点名称并打印出包含Role
参数值的yaml。例如,您可以有一个yaml文件,它只是节点名称到角色的映射,然后脚本执行查找并打印结果(作为链接模式中的参数)。下面是一个例子。
如果你对新工具感兴趣,还有更强大的ENC。例如,Foreman为您提供了一个web界面,用于将主机分组为类似的角色,设置参数以注入木偶运行等。
我已经想出了一个解决方案。唯一的缺点是角色的最大数量是硬编码的。这将更好地与hiera 3,直到然后尝试这个:
/etc/木偶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/木偶/表现/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/木偶hieradata/角色/webserver.yaml
---
classes:
- nginx
# put nginx config here
/etc/木偶hieradata/节点/your_node_name.yaml
---
roles:
- webserver
classes:
# put node specific stuff here