木偶。以最有效的方式更改任何 config/text 文件
Puppet. Change any config/text file in most efficient way
我正在学习如何使用 Puppet。现在我正在尝试更改 nscd 的配置文件。我需要更改这些行:
server-user nscd
paranoia yes
让我们假设完整配置如下所示:
$猫/etc/nscd/nscd.conf
logfile /var/log/nscd.log
threads 4
max-threads 32
server-user nobody
stat-user somebody
debug-level 0
reload-count 5
paranoia no
restart-interval 3600
之前我写过这样的模块来替换需要的行,它看起来如下:
include nscd
class nscd {
define line_replace ($match) {
file_line { $name:
path => '/etc/nscd/nscd.conf',
line => $name,
match => $match,
notify => Service["nscd"]
}
}
anchor{'nscd::begin':}
->
package { 'nscd':
ensure => installed,
}
->
line_replace {
"1" : name => "server-user nscd", match => "^\s*server-user.*$";
"2" : name => "paranoia yes", match => "^\s*paranoia.*$";
}
->
service { 'nscd':
ensure => running,
enable => "true",
}
->
anchor{'nscd::end':}
}
有没有可能以更有效的方式制作同样的东西?用数组之类的?
我推荐你使用inifile puppet module to easy manage INI-style files like this, but also you can take advantage of the create_resources
函数:
include nscd
class nscd {
$server_user_line = 'server-user nscd'
$paranoia_line = 'paranoia yes'
$defaults = {
'path' => '/etc/nscd/nscd.conf',
'notify' => Service["nscd"],
}
$lines = {
$server_user_line => {
line => $server_user_line,
match => "^\s*server-user.*$",
},
$paranoia_line => {
line => $paranoia_line,
match => "^\s*paranoia.*$",
}
}
anchor{'nscd::begin':}
->
package { 'nscd':
ensure => installed,
}
->
create_resources(file_line, $lines, $defaults)
->
service { 'nscd':
ensure => running,
enable => "true",
}
->
anchor{'nscd::end':}
}
所以我写了这样的代码:
class nscd($parameters) {
define change_parameters() {
file_line { $name:
path => '/etc/nscd.conf',
line => $name,
# @name.split[0..-2] will remove last element,
# does not matter how many elements in line
match => inline_template('<%="^\s*"+(@name.split[0..-2]).join("\s*")+".*$" %>'),
}
}
anchor{'nscd::begin':}
->
package { 'nscd':
ensure => installed,
}
->
change_parameters { $parameters: }
->
service { 'nscd':
ensure => 'running',
enable => true,
hasrestart => true
}
->
anchor{'nscd::end':}
}
和class可以通过将list/array传递给class来启动:
class { 'nscd':
parameters =>
[' server-user nscd',
' paranoia yes',
' enable-cache hosts yes smth',
' shared hosts yes']
}
然后数组中的每个元素都进入 change_parameters 作为 $name 参数 inline_template 模块将使用 ruby 一行代码生成正则表达式。
list/array 中的每个元素都相同。
但无论如何我认为最好使用 erb 模板进行此类更改。
我正在学习如何使用 Puppet。现在我正在尝试更改 nscd 的配置文件。我需要更改这些行:
server-user nscd
paranoia yes
让我们假设完整配置如下所示:
$猫/etc/nscd/nscd.conf
logfile /var/log/nscd.log
threads 4
max-threads 32
server-user nobody
stat-user somebody
debug-level 0
reload-count 5
paranoia no
restart-interval 3600
之前我写过这样的模块来替换需要的行,它看起来如下:
include nscd
class nscd {
define line_replace ($match) {
file_line { $name:
path => '/etc/nscd/nscd.conf',
line => $name,
match => $match,
notify => Service["nscd"]
}
}
anchor{'nscd::begin':}
->
package { 'nscd':
ensure => installed,
}
->
line_replace {
"1" : name => "server-user nscd", match => "^\s*server-user.*$";
"2" : name => "paranoia yes", match => "^\s*paranoia.*$";
}
->
service { 'nscd':
ensure => running,
enable => "true",
}
->
anchor{'nscd::end':}
}
有没有可能以更有效的方式制作同样的东西?用数组之类的?
我推荐你使用inifile puppet module to easy manage INI-style files like this, but also you can take advantage of the create_resources
函数:
include nscd
class nscd {
$server_user_line = 'server-user nscd'
$paranoia_line = 'paranoia yes'
$defaults = {
'path' => '/etc/nscd/nscd.conf',
'notify' => Service["nscd"],
}
$lines = {
$server_user_line => {
line => $server_user_line,
match => "^\s*server-user.*$",
},
$paranoia_line => {
line => $paranoia_line,
match => "^\s*paranoia.*$",
}
}
anchor{'nscd::begin':}
->
package { 'nscd':
ensure => installed,
}
->
create_resources(file_line, $lines, $defaults)
->
service { 'nscd':
ensure => running,
enable => "true",
}
->
anchor{'nscd::end':}
}
所以我写了这样的代码:
class nscd($parameters) {
define change_parameters() {
file_line { $name:
path => '/etc/nscd.conf',
line => $name,
# @name.split[0..-2] will remove last element,
# does not matter how many elements in line
match => inline_template('<%="^\s*"+(@name.split[0..-2]).join("\s*")+".*$" %>'),
}
}
anchor{'nscd::begin':}
->
package { 'nscd':
ensure => installed,
}
->
change_parameters { $parameters: }
->
service { 'nscd':
ensure => 'running',
enable => true,
hasrestart => true
}
->
anchor{'nscd::end':}
}
和class可以通过将list/array传递给class来启动:
class { 'nscd':
parameters =>
[' server-user nscd',
' paranoia yes',
' enable-cache hosts yes smth',
' shared hosts yes']
}
然后数组中的每个元素都进入 change_parameters 作为 $name 参数 inline_template 模块将使用 ruby 一行代码生成正则表达式。
list/array 中的每个元素都相同。
但无论如何我认为最好使用 erb 模板进行此类更改。