如何在Puppet中为角色添加自定义或外部事实?

时间:2016-09-17 08:56:28

标签: ruby puppet hiera facter

我正在为我的木偶主人档案/角色使用控制回购。

我正在使用Hiera,我想在层次结构中添加角色

我的 hiera.yaml 看起来像:

:backends:
  - yaml
:yaml:
  :datadir: "/etc/puppetlabs/code/environments/%{::environment}/hieradata"
:hierarchy:
  - "nodes/%{::trusted.certname}"
  - "roles/%{::role}"
  - "common"

site.pp

node xx01 {
include role::cassandra
}

node xx02 {
include role::mysql
}

node xx03 {
include role::cassandra
}

例如,我应该为节点xx01和xx03添加角色事实。因此,将来为每个新节点添加事实是没有用的。所以我希望为每个新节点添加这个事实。

所以最好的方法是添加一个代码来为控件仓库中的角色添加一个事实。不在模块中。

木偶代理似乎并没有本身的角色事实,所以我在/etc/puppetlabs/facter/facts.d

中添加了一个角色事实

如果主机名反映了角色,我认为与主机名进行比较以添加角色的事实是没用的。所以我可以使用带有主机名而不是角色的层次结构。

1 个答案:

答案 0 :(得分:1)

您可以使用外部事实或自定义事实来执行此操作。我还应该注意,你的hiera文件完全正常,并且一旦填充了这个事实,它将自动获取你的角色事实以进行数据解析。我还将从该hiera文件中假设您正在使用Puppet 4,Facter 3和Hiera 3(不是具有模块数据查找等的Puppet数据提供程序),因为您使用的语法和约定与这些一致。

我们假设你有角色app,db和report。

对于自定义事实,您可能希望在已编译模块的target="_blank"目录中编写如下代码:

<a href="https://www.google.com/" target="_blank">Google</a>

这是一个如何做到这一点的简单例子。

您也可以使用放置在已编译模块的lib/facter/role.rb目录中的外部事实来执行此操作,例如Facter.add('role') do setcode do case Facter.value(:hostname) when /db/ then role = 'db' when /app/ then role = 'app' when /report/ then role = 'report' else role = default role end end lib/facts.d文件。 yaml适用于静态数据,shell脚本将是如何在不使用ruby的情况下动态确定服务器角色的示例。

您可以在此处查看其他文档:https://docs.puppet.com/facter/3.4/custom_facts.html