我有一组配置文件需要部署到每台服务器上的多个位置,每个位置都有不同的内容,但它们都共享相同的位置结构。我试图通过创建一个可以多次使用的通用类来减少清单中的重复量。
以下是文件结构的一个简化示例:
/home/bob/config/files.cfg
/home/bob/config/settings.cfg
/home/sue/config/files.cfg
/home/sue/config/settings.cfg
/home/ann/config/files.cfg
/home/ann/config/settings.cfg
这是我写的清单。
class config-generic {
file { "/home/$name/config/files.cfg":
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
mode => 644,
}
file { "/home/$name/config/settings.cfg":
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
mode => 644,
}
}
第一次使用该类时,它运行良好。
node "client1", "client2" {
class {'config-generic':
name => 'bob',
}
}
但是,当我再次使用该类时,会出现错误,因为该类已经定义。
(服务器上出现错误 400:重复定义:Class[config-generic] 已定义)
node "client1", "client2" {
class {'config-generic':
name => 'bob',
}
class {'config-generic':
name => 'sue',
}
}
问题:我理解这个问题 - 但是有什么更好的方法可以减少清单中的重复?我试图避免定义“文件' 为每个文件中的每个用户创建条目。
答案1
您所需要的不是一个类,而是一个定义,因为您想创建它们的多个实例,例如:
define config-generic ($ensure=present) {
file { "/home/$name/config/files.cfg":
ensure => $ensure,
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
mode => '0644',
}
file { "/home/$name/config/settings.cfg":
ensure => $ensure,
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
mode => '0644',
}
}
并使用以下命令调用它:
node "client1", "client2" {
config-generic {
'bob':;
'sue':;
}
}
如果差异很小,您可能还想使用模板,而不是复制源文件。