【问题标题】:puppet variables inheritance, include require?puppet 变量继承,包括 require?
【发布时间】:2016-03-08 15:23:55
【问题描述】:

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

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

例如

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

因此,为了保持理智,我根据文档创建了一些模块“额外”文件:即 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

puppet 文档目前让我大吃一惊,因此非常感谢您提供一些易于理解的帮助。

TIA。

上午

【问题讨论】:

    标签: variables inheritance module include puppet


    【解决方案1】:

    Puppet 类继承不能这样工作。子类可以覆盖由其父(或更远的祖先)声明的资源的属性,并且它可以看到它们的变量的值,但它不能导致 它们 看到它们的变量的值与其他情况不同将。实际上,父类在子类之前被完全评估,利用该特性来实现params类模式。

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

    【讨论】:

      【解决方案2】:

      你在这里的方法是错误的。您无需创建“类模板”并继承它们来构建特定的变体。

      如果您愿意,可以将清单“模板”创建为已定义的类型。它也不需要存在于nginx 模块中。将其留在上游状态是明智的。添加您自己的模块。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        • 2015-12-09
        • 2014-10-06
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多