我在让 Puppet 2.6.4(客户端和主服务器)中的参数化类工作时遇到了麻烦
######## from /etc/puppet/manifests/nodes.pp
# defining one node to use certain version
#######################################################
node 'dev-internal-000008.domain.com' {
include software($version="dev-2011.02.11")
}
#来自/etc/puppet/modules/software/manifests/init.pp
我在这里将版本设置为“默认”
#class software($version="dev-2011.02.04b") {
File {
links => follow
}
file { "/opt/software_AIR":
ensure => directory
}
file { "/opt/software_AIR/share":
source => "puppet://puppet/software/air/$version",
recurse => "true",
}
}
#
Puppet Master 的错误
#err: Could not parse for environment production: Syntax error at '='; expected ')' at /etc/puppet/manifests/nodes.pp:10 on node dev-internal-domain.com
#
找到了解决办法
尝试
node 'dev-internal-000008.domain.com' {
class { customsoftware:version => "dev-2011.02.04b" }
}
答案1
不幸的是,参数化类不适用于include
。您必须使用新的替代类声明语法与参数化类同时引入:
node 'dev-internal-000008.domain.com' {
# include software($version="dev-2011.02.11") # (doesn't work)
class {'software':
version => "dev-2011.02.11",
} # works
}
事物:
- 请注意,它看起来像一个资源(
file
、service
等)声明。 - 定义和声明都以单词 class 开头,这一事实很容易让人困惑,但只要小心一点就没问题。
- 您不能像使用 那样多次以这种方式声明一个类
include
。 预计在 2.7 中会有所改变,并且可能会引入一些更友好的语法。
答案2
您还可以使用基于主机名的选择器:
class {'software':
version => $::hostname ? {
/hostname1/ => 'dev-2011.02.11',
default => 'dev-2011.02.04b',
},
}