【问题标题】:Puppet: Passing parameters through classesPuppet:通过类传递参数
【发布时间】:2014-02-05 22:02:12
【问题描述】:

这是我之前关于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'],
    }
}

什么是正确的课程和最佳实践?提前致谢!

【问题讨论】:

    标签: class variables parameter-passing puppet parameterized


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 明确地说,接受的答案是将值传递给另一个类,我这样做了,它按预期工作。谢谢!
    【解决方案2】:
    node 'beetle.example.com' {
        class { 'poodle::service':
            ensure => 'stopped'
        }
    }
    

    有效。

    但我不同意说“您不希望人们必须了解您模块的内部结构”,因为您希望在创建虚拟主机时灵活地定义什么端口、协议、什么后端 - 代理 + 以及什么应使用模块等。 我看不到我的项目如何通过编写包括 apache、nginx 等来实现这种灵活性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2018-05-25
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2014-05-22
      相关资源
      最近更新 更多