Puppet:参数化类中的数组 VS 使用资源

Puppet:参数化类中的数组 VS 使用资源

我有一些用例,我想定义多个类似的资源,这些资源最终应该放在一个文件中(通过模板)。

举个例子,我正在尝试编写一个 puppet 模块,它可以让我管理 MAC 地址和网络接口名称之间的映射(从 puppet 编写 udev 的 persistent-net-rules 文件),但也有许多其他类似的用例。

我四处搜索,发现可以用新的参数化类语法:如果以这种方式实现,最终应该像这样使用:

node { "myserver.example.com":
  class { "network::iftab":
    interfaces => {
      "eth0" => { "mac" => "ab:cd:ef:98:76:54" }
      "eth1" => { "mac" => "98:76:de:ad:be:ef" }
    }
  }
}

我同意,还不算太糟,但当你管理更复杂的东西时,它会迅速爆炸(想想网络配置)。就像在这个模块中或任何其他单个配置文件中的多个复杂资源东西)。

SF 上的类似问题有人建议使用Pienaar 的 puppet-concat 模块但我怀疑它能否比参数化类更好。

在配置定义中真正酷和干净的东西应该是这样的包含主机类型,它的用法简单、漂亮、干净,并且自然地映射到多个资源,最终将在一个地方进行配置。换成我的例子,它会是这样的:

node { "myserver.example.com":
  interface { 
    "eth0":
      "mac" => "ab:cd:ef:98:76:54",
      "foo" => "bar",
      "asd" => "lol",
    "eth1":
      "mac" => "98:76:de:ad:be:ef",
      "foo" => "rab",
      "asd" => "olo",
  }
}

...在我看来这要好得多,即使每个资源都有 3 倍的选项。

我真的应该将数组传递给参数化类吗?或者有更好的方法来做这种事情?Puppet [用户|开发人员] 社区中是否存在一些公认的共识?

顺便说一句,我指的是 2.7 分支的最新稳定版本,我对与旧版本的兼容性不感兴趣。

答案1

我认为你要找的是类型。类型会给你你想要的语法,而且你可以在同一个主机上多次使用同一种类型来配置多个接口,而这是用类无法做到的。

你可以使用以下方式创建新类型定义类型,使用 Puppet DSL 编写。有关定义类型的更多信息,请参阅这里. 创建类型的另一种方法是使用自定义类型,它们是用 Ruby 编写的。

有关定义类型的示例,请查看puppetlabs-apt里皮纳尔-康卡特, 和razorsedge 网络. 海关类型的典型示例包括puppetlabs-防火墙puppetlabs-vcsrepo

相关内容