我正在使用hiera将webserver
或dbserver
等类分配给我的节点。 webserver
类只包含apache并在其上设置一些配置(例如端口)。显然我不想为每个节点复制这个配置,所以我把它放在common.yaml中。但是,我的common.yaml变大了,所以我想把它分开。我希望有一个文件包含webserver
角色的配置,另一个用于dbserver
角色等。我想我的hiera.yaml看起来像这样:
:hierarchy:
- "fqdn/%{::fqdn}"
- "role/%{ROLE}"
- common
role
文件夹包含webserver.yaml
,appserver.yaml
,dbserver.yaml
等文件。我已经看到各种博客帖子说解决方案是创建一个自定义的“角色”事实,但是他们中的大多数通过从代理节点上的文件(例如从/etc/role
)加载该事实来实现这一点,我似乎打败了木偶的角色(我特意使用木偶,所以每次我希望它有一些新角色时我都不必登录每个节点并更改一些配置。)
要说清楚,我不想编辑代理上的文件以使其工作,我希望使用主服务器上的配置完成所有操作。
我想我可以拥有类似下面的内容并详尽地将每个角色列为层次结构中的一个元素,但这似乎不易管理。
:hierarchy:
- "fqdn/%{::fqdn}"
- "webserver"
- "appserver"
- "dbserver"
- common
有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
为了能够在hiera配置中使用$Role
,它需要作为事实/变量提供,但是有一种方法可以在主节点而不是节点上执行此操作。这是External Node Classifiers可以用于的事情之一。
基本上,您需要编写一个脚本来获取节点名称并打印出包含Role
参数值的yaml。例如,您可以有一个yaml文件,它只是角色的节点名称映射,然后脚本执行查找并打印结果(作为链接模式中的参数)。这是an example。
如果您对新工具感兴趣,那么还有更强大的ENC。例如,Foreman为您提供了一个Web界面,用于将主机组合成类似的角色,设置参数以注入木偶运行等等。
答案 1 :(得分: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