Puppet:通过类传递参数

时间:2014-01-16 19:37:35

标签: class variables parameter-passing puppet parameterized

这是我之前关于parameterized classes的问题的后续内容。继这个例子之后,我希望能够将运行或停止传递到服务中,但是当我将服务添加到一个盒子中时,我不使用“include poodle :: service”,我使用“include poodle” “Poodle需要安装所有其他东西。

那么,我可以将变量传递给服务类,如下所示:

# SITE.PP
node 'tweedle.example.com' {
    include basicstuff
    include poodle
}
node 'beetle.example.com' {
    include basicstuff
    class { 'poodle':
        $ensure => 'stopped'
    }
}

## POODLE MODULE, manifests/init.pp
class poodle ( $ensure = 'running' ) {
    class {'poodle::install': }
    class {'poodle::config': }
    class {'poodle::service': 
        ensure => $ensure
    }
    Class ['poodle::install'] -> Class ['poodle::config'] ~> Class ['poodle::service']
}

...

class poodle::service ( $ensure ) {
    service {'poodle':
        ensure     => $ensure,
        enable     => true,
        restart    => "/etc/init.d/poodle stop && sleep 5 && /etc/init.d/poodle start",
        subscribe  => File['/opt/poodle/poodle.py'],
    }
}

或者我应该将参数直接放在服务类上,并显式调用Poodle类和Poodle的服务类,如下所示:

# SITE.PP
node 'tweedle.example.com' {
    include basicstuff
    include poodle
}
node 'beetle.example.com' {
    include basicstuff
    include poodle
    class { 'poodle::service':
        $ensure => 'stopped'
    }
}

## POODLE MODULE, manifests/init.pp
class poodle {
    class {'poodle::install': }
    class {'poodle::config': }
    class {'poodle::service': 
        ensure => $ensure
    }
    Class ['poodle::install'] -> Class ['poodle::config'] ~> Class ['poodle::service']
}

...

class poodle::service ( $ensure = 'running') {
    service {'poodle':
        ensure     => $ensure,
        enable     => true,
        restart    => "/etc/init.d/poodle stop && sleep 5 && /etc/init.d/poodle start",
        subscribe  => File['/opt/poodle/poodle.py'],
    }
}

或者是将参数添加到服务类中并且仅包含足够的参数,因为服务类具有依赖性,如下所示:

# SITE.PP
node 'tweedle.example.com' {
    include basicstuff
    include poodle
}
node 'beetle.example.com' {
    include basicstuff
    class { 'poodle::service':
        $ensure => 'stopped'
    }
}

## POODLE MODULE, manifests/init.pp
class poodle {
    class {'poodle::install': }
    class {'poodle::config': }
    class {'poodle::service': 
        ensure => $ensure
    }
    Class ['poodle::install'] -> Class ['poodle::config'] ~> Class ['poodle::service']
}

...

class poodle::service ( $ensure = 'running') {
    service {'poodle':
        ensure     => $ensure,
        enable     => true,
        restart    => "/etc/init.d/poodle stop && sleep 5 && /etc/init.d/poodle start",
        subscribe  => File['/opt/poodle/poodle.py'],
    }
}

这里的正确课程和最佳做法是什么?提前谢谢!

2 个答案:

答案 0 :(得分:4)

通常,您不希望人们必须了解模块的内部结构才能使用它。

我当然不会要求他们同时包含poodlepoodle:service

模块通常遵循以下两种结构之一:

  • 通过init.pp的单一入口点,用于简单的服务,几乎没有参数,没有单独的角色 (客户端/服务器)或“倍数”(如数据库服务器可能配置多个数据库) 它通过木偶)

  • 通过子类和处理不同角色的定义类型的多个入口点 倍数

根据您所描述的内容,我将参数放在主类中并将其传递给服务子类。

答案 1 :(得分:2)

node 'beetle.example.com' {
    class { 'poodle::service':
        ensure => 'stopped'
    }
}

作品。

但我不同意说#34;你不希望人们必须了解你的模块的内部结构"在这一点上,您希望在创建vhost时能够灵活地定义端口,协议,后端 - 代理+以及应该使用哪些模块等。 我没有看到我的项目如何通过编写包含apache,nginx等来实现这种灵活性的方法。