木偶中hiera的嵌套YAML

木偶中hiera的嵌套YAML,yaml,puppet,hiera,Yaml,Puppet,Hiera,我正在为我们公司设计木偶建筑。我非常喜欢用hiera和YAML文件对节点进行分类的想法。但是,我确实希望能够应用不基于事实的YAML文件,或者将YAML文件导入到另一个YAML文件中 例如NodeA.yaml --- include webserver.yaml include public.yaml classes: etc. . . 这将允许我尽可能多地重用代码。这样,当我更改web服务器配置时,我只需在一个文件中进行更改,而不是在每个节点的YAML文件中进行更改 我也愿意接受其他解决

我正在为我们公司设计木偶建筑。我非常喜欢用hiera和YAML文件对节点进行分类的想法。但是,我确实希望能够应用不基于事实的YAML文件,或者将YAML文件导入到另一个YAML文件中

例如NodeA.yaml

---
include webserver.yaml
include public.yaml

classes:
etc. . . 
这将允许我尽可能多地重用代码。这样,当我更改web服务器配置时,我只需在一个文件中进行更改,而不是在每个节点的YAML文件中进行更改

我也愿意接受其他解决方案。

  • YAML不支持导入或包含
  • (不推荐)您可以使用from模块来实现所需的功能。使用
    loadyaml
    功能检查此项
  • 只需设计适当的
    hiera
    层次结构,您就可以轻松实现预期的功能。我不明白您为什么不想使用事实真相?e、 g:在每个节点上定义自定义事实
    位置
    。接下来定义层次结构:

    :hierarchy:
      - "%{::location}"/"%{::fqdn}"
      - "%{::location}"/common
      - common 
    
    接下来,在文件
    location_1/node1.yaml
    中,您将仅为该节点1定义特定的数据。在文件
    location\u 1/common.yaml
    中,为
    location\u 1
    中的所有节点定义公共数据。在
    common.yaml
    中定义所有节点的公共数据。 如果某些数据对于所有节点都是公共的,则只需在
    common.yaml
    中定义一次即可。您不必在每个节点的yaml文件中冗余地定义它


问题在于,我们的管理者希望所有节点信息都存储在主节点上。他们不希望一个节点能够改变关于它自己的任何信息。但是除了自定义事实,所有节点信息都将存储在主节点上。因此,可能只是将所有必要的信息放到common.yaml中。这似乎是适应hiera.yaml的最佳方式,但在我的情况下,没有办法改变这一点,因为它是由另一个团队管理的(我要求添加更多与我们平台相关的级别)。不幸的是,由于这个限制,我们必须在所有节点中复制粘贴相同的值。@kkamilpl说得对:您所说的要解决的问题最好通过正确定义和使用hiera层次结构来处理。事实上,在许多方面,它提供了一种外部指导的方法,可以精确地执行您提出的建议,因为它可以使HIEA将多个数据文件一起考虑,比当前的节点更具体一些。您不一定需要自定义事实才能使其工作,尽管将其与ENC set全局变量配对可能会有所帮助。