通过hiera中的数据自动创建需要参数

auto-create require parameters by data in hiera

有没有办法通过hiera创建require参数?也许可以查找,但我是 puppet 的新手,不知道所有的可能性。

我正在使用 oneview-puppet 模块从 puppet apply 创建资源。

资源由 hiera 创建,定义为一个配置文件 (YAML)。我在那里结合了上面模块中的几个资源。这些资源具有复杂的依赖关系。可以找到概述 here(第 29 页)。

因此,对于每个资源,我都必须要求依赖项,尽管它可以 "found" 在我的配置文件中。实际上,它仅在 site/manifest/init.pp.

中的序列创建的资源时才有效

我尝试在 hiera 中添加 require 参数,但在那里它会被解释为字符串。

site/oneviewconf/manifest/init.pp 示例:

class oneviewconf (
  Hash $oneview_ethernet_networks = {},
  Hash $oneview_logical_interconnect_groups = {}
)
{
  $oneview_ethernet_networks.each | $k,$v | {
    oneview_ethernet_network { $k:                      # -> oneview-puppet resource
      * => $v,
    }
  }
  $oneview_logical_interconnect_groups.each | $k,$v | {
    oneview_logical_interconnect_group { $k:             # -> oneview-puppet resource
      require => Oneview_ethernet_network['VLAN0001']
      * => $v,
    }
  }
}

Hiera 示例:

---
oneviewconf::oneview_ethernet_networks:
  VLAN0001:
    ensure: present
    data:
      name: 'VLAN0001'
      vlanId: 0001
oneviewconf::oneview_logical_interconnect_groups:
  LIG_A:
    ensure: present
    data:
      name: 'LIG_A'
      networkUris: ['VLAN0001']

Is there a way to create the require parameter by hiera?

是的。

I've tried to add the require parameter in hiera, but there it will be interpreted as a string.

如果格式正确则不会。如果您查看已编译的 Puppet 目录,您可以看到资源引用是如何在 JSON 目录中编码的,这也告诉您它们需要如何在 Hiera YAML 文件中编码。

采取这样的清单:

class test {
  notify { 'notify1':
    message => 'I am notify 1',
    require => Notify['notify2'],
  }
  notify { 'notify2':
    'message' => 'I am notify 2',
  }
}

现在 compile 该目录并查看其中内容。你会看到:

    {
      "type": "Notify",
      "title": "notify1",
...
      "parameters": {
        "message": "I am notify 1",
        "require": "Notify[notify2]"
      }
    },

如果这不是很明显,而清单要求像 Notify['notify2'] 一样引用资源标题,资源标题周围的引号在目录中被删除,它变成 Notify[notify2].

因此我可以用同样的方法给Hiera添加一个参数,然后像这样重构整个东西。

希拉:

---
notify_resources:
  notify1:
    message: I am notify 1
    require: Notify[notify2]
  notify2:
    message: I am notify 2

清单:

class test {
  $notify_resources = lookup('notify_resources')
  $notify_resources.each |$k,$v| {
    notify { $k: * => $v }
  }
}

你应该这样做吗?我倾向于同意 John Bollinger 的评论,即 Hiera 中的资源引用可能是您有太多 data/code 耦合的线索。