木偶类inheritance混乱

我已经阅读了关于范围的文档,但是我仍然无法解决这个问题。 我有两个非常相似的环境 – 所以我得到了:

模块/ django的-ENV /舱单/ init.pp

class django-env { package { "python26": ensure => installed } # etc ... } import "er.pp" 

模块/ django的-ENV /舱单/ er.pp

 $venvname = "er" $venvpath = "/home/django/virtualenvs" class er { file { "$venvpath/$venvname" : ensure => directory } # etc ... } class er-dev { include er } class er-bce-dev { $venvname = "er-bce" include er } 

舱单/ modules.pp

 import "django-env" 

舱单/ nodes.pp

 node default { # etc ... } node 'centos-dev' imports default { include django-env include er-bce-dev include er-dev } 

这里的结果是“inheritance”起作用 – 但是只有“centos-dev”节点下的第一个“er-”项目才起作用,我可以得到er-bce-dev或er-dev,但不能同时使用。 我在这里肯定有一些基本的误解。

这是导入包含的区别吗? (不知道我明白这一点)

木偶不支持这种configuration,但限制可以轻松绕过。 原因在于两个基本的木偶“规则”:

  1. 一个类只能被包含一次(随后的包含 – 语句什么也不会做)
  2. 执行顺序没有严格定义,甚至可以是随机的

er-dever-bce-dev都包括这个类。 但是这个类不能被包含两次,所以只能使用默认的$venvname = "er"或重写的$venvname = "er-dev" ,而不是同时执行。

解决scheme:将er类更改为定义(请参阅Puppet Language Tutorial( http://docs.puppetlabs.com/guides/language_tutorial.html )中的“Definitions”):

模块/ django的-ENV /舱单/ er.pp

 # Create new er resource definition define django-env::er($vpath="/home/django/virtualenvs", $vname="er") { file { "$vpath/$vname" : ensure => directory } # etc ... } 

我们不需要$venvname$venvpathvariables,它们在定义中被指定为默认值。 名称django-env::er将定义添加到django-env名称空间,并允许自动导入(请参见下文)。

导入和包含

importinclude的区别在于:

  • import使用文件,并不执行类
  • include执行类
  • 文件必须在包含类之前导入

注意:最后一条规则有一个很强的例外: Puppet模块查找 。 include语句在很多情况下都会自动导入。 这里是其中的一些:

  • include foo试图导入文件module_dir/foo/manifests/init.pp
  • include foo::bar imports module_dir/foo/manifests/bar.pp

通过这些自动导入和资源定义,您可以非常轻松地定义多个虚拟环境。 更改node 'centos-dev'

 node 'centos-dev' imports default { include django-env # The er resource with default values: django-env::er { 'er-bce': } # Another er resource with different environment name: django-env::er { 'er-bce-dev': vname => 'bce-dev'} } 

你可以根据django-env模块基本删除所有的import语句。

快乐木偶!

木偶语法演变,因为木偶3.7你会得到很多不赞成的警告。 关键词importinherits已被弃用。 而不是使用如下的布局:

  /etc/puppet /manifests /nodes site.pp /modules puppet.conf 

你应该使用:

  /etc/puppet /environments /production /manifests 01_base_node.pp /modules environment.conf puppet.conf 

而不是使用传统的site.ppconfiguration:

 import 'nodes/*.pp' node default { classs{'ntp': } } 

你应该使用标准的class (但你不能称之为class default因为它是一个保留字 ),一个文件manifets/01_common.pp

 class common { classs{'ntp': } } 

文件按字母顺序加载,所以你应该确保“基类”将被加载(编号可能是一个好主意)。

然后,而不是像这样定义一个节点:

 node /^web\d+/ inherits default { } 

使用而不是(解决经典的多重inheritance问题,所谓的钻石问题 ),例如在manifests/web.pp定义

 node /^web\d+/ { include common # include something_else }