Inheritance Puppet&Hiera层次结构和类名

Inheritance Puppet&Hiera层次结构和类名,inheritance,puppet,hiera,Inheritance,Puppet,Hiera,Hiera中的“calling_class”查找变量让我头疼 给定这样的hiera配置: --- :backends: yaml :yaml: :datadir: :hierarchy: - "node/%{::clientcert}" - "profile/%{calling_class}" - "roles/%{calling_class}" - common :logger: console 以及Puppet中的role.pp,其中包含以下内容: class rol

Hiera中的“calling_class”查找变量让我头疼

给定这样的hiera配置:

---
:backends: yaml
:yaml:
  :datadir: 
:hierarchy:
  - "node/%{::clientcert}"
  - "profile/%{calling_class}"
  - "roles/%{calling_class}"
  - common
:logger: console
以及Puppet中的role.pp,其中包含以下内容:

class role::base {
  notify { "output scope 1":
    message => inline_template("scope='<%= scope.source.name %>'"),
  }
  $profiles = hiera_array('role::profiles', [])
  notify { "Including profiles: ${profiles}": }
  # include $profiles
}

class role::app inherits role::base{
  notify { "output scope 2":
    message => inline_template("scope='<%= scope.source.name %>'"),
  }
  $profiles = hiera_array('role::profiles', [])
  notify { "Including profiles: ${profiles}": }
}
---
role::profiles:
  - webserver
  - application
我希望看到这样的情况:

Notice: Including profiles: webapp
Notice: scope='role::app'
Notice: Including profiles: webapp
Notice: scope='role::app'
Notice: Finished catalog run in 0.11 seconds
但我得到的是:

Notice: Including profiles: 
Notice: scope='role::base'
Notice: Including profiles: webapp
Notice: scope='role::app'
Notice: Finished catalog run in 0.11 seconds

似乎当一个类被继承或包含时,两种情况都是相同的,Hiera中的“calling_class”设置为继承的类,而不是执行继承的类。是我遗漏了什么,还是这就是希拉的工作方式?我认为继承类会将scope.source.name设置为子类,而不是父类。

您也可以使用此解决方案。唯一的缺点是角色的最大数量是硬编码的。使用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

FWIW,我不会试图依靠$calling_class来完成任何不仅仅是令人眼花缭乱的事情。@FelixFrank我希望使用它可以更容易地根据我调用的类将Hiera的数据拆分成一个等级。