傀儡类继承混乱

EMi*_*ler 6 puppet

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

模块/django-env/manifests/init.pp

class django-env {
    package { "python26":
        ensure => installed
    }
    # etc ...
}
import "er.pp"
Run Code Online (Sandbox Code Playgroud)

模块/django-env/manifests/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
}
Run Code Online (Sandbox Code Playgroud)

清单/模块.pp

import "django-env"
Run Code Online (Sandbox Code Playgroud)

清单/节点.pp

node default {
    # etc ...
}
node 'centos-dev' imports default {
    include django-env
    include er-bce-dev
    include er-dev
}
Run Code Online (Sandbox Code Playgroud)

这里的结果是“继承”有效——但只有“centos-dev”节点下的第一个“er-”项被处理,我要么得到 er-bce-dev 要么得到 er-dev,但不能同时得到两者。我在这里误解了一些基本的东西。

这是importinclude之间的区别吗?(不确定我是否理解)

Mik*_*kko 11

Puppet 不支持这种配置,但可以轻松绕过限制。原因在于两个基本的傀儡“规则”:

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

er-dev并且er-bce-dev都包括 class er。但是该类不能被包含两次,因此er类仅使用 default$venvname = "er"或 overridden 执行$venvname = "er-dev",但不能同时使用两者。

解决方案:将er类更改为定义(请参阅 Puppet 语言教程(http://docs.puppetlabs.com/guides/language_tutorial.html)中的“定义” ):

模块/django-env/manifests/er.pp

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

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

导入和包含

importincludestatemens的区别是:

  • import 处理文件,不执行类
  • include 执行类
  • 必须先导入文件,然后才能包含类

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

  • include foo 尝试导入文件 module_dir/foo/manifests/init.pp
  • include foo::bar 进口 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'}
}
Run Code Online (Sandbox Code Playgroud)

您可以删除基本上所有import考虑django-env模块的语句。

木偶快乐!