在Hiera中实现Puppet多角色模型遇到困难求助
搞定Hiera多角色模型的配置方案
我之前也折腾过类似的Hiera多角色配置,刚好能给你捋清楚步骤,帮你实现那种node文件只放角色、角色配置单独归档的结构。咱们一步步来:
1. 先调整Hiera的层级配置
首先得修改你生产环境下的hiera.yaml(一般在/etc/puppetlabs/code/environments/production/hiera.yaml),给它加一个角色目录的层级,这样Hiera才知道去roles目录找配置。
示例配置长这样:
version: 5 defaults: datadir: data data_hash: yaml_data hierarchy: - name: "主机专属配置" path: "nodes/%{trusted.certname}.yaml" - name: "角色专属配置" paths: - "roles/%{role}.yaml" # 这里的%{role}会自动匹配你在node文件里定义的roles数组里的每一项 - name: "全局默认配置" path: "common.yaml"
2. 简化node.yaml的内容
就像你想要的那样,node文件(比如/etc/puppetlabs/code/environments/production/data/nodes/my.host.de.yaml)里只需要列出来要给这个主机用的角色就行,推荐用roles数组来定义,比直接写classes更清晰:
# my.host.de.yaml roles: - ydixken_baseinstall - additional_modules
如果你习惯原来用classes的写法也没问题,后面角色配置里的模块会自动合并进去。
3. 给每个角色单独写配置文件
在环境的data/roles目录下(没有的话自己建一个),给每个角色对应一个yaml文件,把这个角色要用到的模块、参数都写在这里:
比如data/roles/ydixken_baseinstall.yaml(基础安装角色)
classes: - base::system - ssh::server - firewall::minimal # 这个角色专属的参数配置 base::system::timezone: "Europe/Berlin" ssh::server::permit_root_login: "no"
再比如data/roles/additional_modules.yaml(额外模块角色)
classes: - monitoring::prometheus_agent - backup::rsync_client # 对应模块的参数 monitoring::prometheus_agent::server: "monitoring.my.domain"
4. 让Puppet加载所有合并后的类
最后在site.pp里加一段代码,用lookup函数把所有层级里的classes都合并起来(去重),然后加载这些类:
# site.pp # 合并所有配置里的classes数组,自动去重 $all_classes = lookup('classes', Array[String], 'unique', []) include $all_classes
几个要注意的点
- 合并策略很重要:一定要设置merge为
unique或者deep,不然容易出现重复加载类的问题,参数也能正确合并。 - 目录权限:要确保
data/roles目录的权限是Puppet服务能读取的,不然加载不到配置。 - 角色的职责要清晰:每个角色就管一类事情,比如基础系统、监控备份,这样node文件会非常简洁,后续维护也方便。
这样配置完之后,Puppet运行时会先加载主机的专属配置,然后加载每个角色的配置,把所有要应用的类和参数都合并好,完全符合你想要的那种直觉化结构。
内容的提问来源于stack exchange,提问作者Yannick Dixken
相关产品推荐
相关产品推荐

