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

Ruby 如何为Puppet中的角色添加自定义或外部事实?,ruby,puppet,hiera,facter,Ruby,Puppet,Hiera,Facter,我正在为我的木偶主配置文件/角色使用控制回购 我正在使用Hiera,我想在层次结构中添加角色 我的hiera.yaml看起来像: :backends: - yaml :yaml: :datadir: "/etc/puppetlabs/code/environments/%{::environment}/hieradata" :hierarchy: - "nodes/%{::trusted.certname}" - "roles/%{::role}" - "common" s

我正在为我的木偶主配置文件/角色使用控制回购

我正在使用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添加角色事实。因此,为将来的每个新节点添加事实是没有用的。因此,我希望为每个新节点添加事实

因此,最好的方法是添加代码,以便在控制回购中为角色添加事实。模块中没有

puppet代理似乎本质上没有角色事实,因此我在
/etc/puppetlabs/facter/facts.d


我认为,如果主机名反映了角色,那么与主机名比较以添加角色的事实是没有用的。因此,我可以将层次结构与主机名而不是角色一起使用。

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

假设您有应用程序、数据库和报表角色

对于自定义事实,您需要在编译模块的
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
目录中的外部事实来执行此操作,例如
role.yaml
role.sh
文件。yaml适合于静态数据,shell脚本将是一个示例,说明如何在不使用ruby的情况下动态确定服务器的角色


您可以在此处查看其他文档:

感谢您的回复,但角色名称与主机名不同。在我的例子中,我无法知道角色何时依赖于节点信息。还有其他解决办法吗?要了解节点的role@YasserB. 根据您的一般问题,我给出了一个通常适合您需求的示例解决方案。如果你想得到确切/具体的解决方案来满足你的需求,那么我需要确切地知道你想做什么。@YasserB。您是否有CMDB或某种ENC?什么是CMDB或ENC?在傀儡运行期间,会定义变量${::ENC_role}。在事实编译阶段,是否仍然可以访问此变量?