我已经阅读了关于范围的文档,但是我仍然无法解决这个问题。 我有两个非常相似的环境 – 所以我得到了:
模块/ 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,但限制可以轻松绕过。 原因在于两个基本的木偶“规则”:
er-dev
和er-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
和$venvpath
variables,它们在定义中被指定为默认值。 名称django-env::er
将定义添加到django-env
名称空间,并允许自动导入(请参见下文)。
import
与include
的区别在于:
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你会得到很多不赞成的警告。 关键词import
和inherits
已被弃用。 而不是使用如下的布局:
/etc/puppet /manifests /nodes site.pp /modules puppet.conf
你应该使用:
/etc/puppet /environments /production /manifests 01_base_node.pp /modules environment.conf puppet.conf
而不是使用传统的site.pp
configuration:
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 }