puppet变量继承,包括require?

时间:2016-03-08 15:23:56

标签: variables inheritance module include puppet

我正在为jfryman的nginx模块编写一些扩展。

我有许多安装了nginx的服务器,并且有不同的站点:

e.g。

Live = site1.domain
Staging  = site1.staging.domain
Development = site1.development.domain, site2.development.domain, site3.development.domain (etc)

所以,为了节省我的理智,我已经创建了一些模块" extra"文件,根据文件:ie,modules / nginx / manifests / amcustom / site1.pp等。

现在 - 所有这些网站都包含Nginx的自定义配置,所以为了不让我重复相同的代码,我创建了以下作为"模板"对于变量 - 它被称为〜/ modules / nginx / manifests / amcustom / ux_std_vhost.pp并包含:

class  nginx::amcustom::ux_std_vhost {

        file { $nginx_dirs:
                ensure => 'directory',
                owner => 'gitpull',
                group => 'www-data',
                mode => 0750,
        }

        nginx::resource::vhost { "${webshortname}.${domain}":
                ensure  => present,
                rewrite_to_https => true,
                www_root        => "${full_web_path}/${webshortname}.${domain}/latest/",
                index_files     => [ 'index.html' ],
                location_cfg_append     => $location_cfg_append,
                ssl             => true,
                ssl_cert        => "puppet:///modules/nginx/$webshortname.$domain.nginx.crt",
                ssl_key         => "puppet:///modules/nginx/$webshortname.$domain.key",
                ssl_protocols   => 'TLSv1 TLSv1.1 TLSv1.2',
                ssl_ciphers     => '"EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH !EDH+aRSA !RC4 !a
NULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"',
        vhost_cfg_ssl_prepend   =>  {
                'add_header'   => '"Strict-Transport-Security" "max-age=15768000"'
                },
        location_raw_append     => [ 'if ($http_origin ~* (https?://[^/]*\.domain(:[0-9]+)?)) {', 'add_header "Access-Control-Allow-Origin" "$http_origin";', '}' ],
                }

}

我需要做的是使用这个"标准"文件,并为每个站点传递变量:

 ~/amcustom/site1.pp
 ~/amcustom/site2.pp
...etc

这些配置文件的内容为:

class nginx::amcustom::site1_config inherits nginx::amcustom::ux_std_vhost {
# Define my Variables:

        $full_web_path = [ '/var/sites' ]
        $webshortname  = [ 'site1' ]
        $domain        = [ 'domain' ]
        $location_cfg_append = undef
        $nginx_dirs = [ "$full_web_path/", "$full_web_path/$webshortname.$domain/" ]


        }

class nginx::amcustom::site1 {
        include ::nginx,nginx::amcustom::site1_config
        require users::amcustom::gitpull_ux
        }

我遇到的问题是我指定的变量没有传递给我的类(详细的nginx :: resource :: vhost),报告的错误是:

puppet-agent[20280]: Failed to apply catalog: Parameter path failed on File[undef]: File paths must be fully qualified, not 'undef' at /etc/puppet/environments/development/modules/nginx/manifests/amcustom/ux_std_vhost.pp:8

傀儡文件目前正在融化我的头脑,所以一些易于理解的帮助将非常感激。

TIA。

AM

2 个答案:

答案 0 :(得分:0)

Puppet类继承不起作用。子类可以覆盖由其父级(或更远的祖先)声明的资源的属性,并且它可以看到它们的变量的值,但它不能使它们看到它们的变量的不同值,否则它们将。实际上,父类在子类之前被完全评估,这个特性被用来实现params类模式。

除了params类模式之外的任何其他目的的类继承现在被广泛认为是糟糕的风格。自动数据绑定(通过Hiera)几乎解决了类继承所做的所有其他问题,以及更多。假设您至少运行Puppet 3.0(最新版本为4.3),您也可以为自动数据绑定工作。你的类的主要变化是将它依赖的可调变量放入类参数中。然后,您需要配置Hiera数据存储库,以便在每个节点的上下文中提供适当的值。

答案 1 :(得分:0)

你在这里采取了错误的做法。你不会创建"类模板"并继承它们以构建特定的变体。

清单"模板"如果您将创建为已定义的类型。它也不需要住在nginx模块中。将其置于上游状态是明智的。添加自己的模块。

define my_site_nginx::vhost($nginx_dirs,$webshortname,$domain,...) {
    file { $nginx_dirs: ... }
    nginx::resource::vhost { "${webshortname}.${domain}":
            ensure  => present,
            ...
    }
}