我正在为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
答案 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,
...
}
}