如何使用 puppet 为 sshd 配置文件中的各个匹配部分动态更新值
How to update values dynamically for the individual match sections within sshd config file using puppet
我能够通过传递索引将值更新到“User foo”和“Host *.example.net”部分。如果我传递索引 1 或 2,相应的值就会更新。
我的代码:
$sections = ['Host *.example.net', 'User foo']
$sections.each |String $section| {
sshd_config_match { "${section}":
ensure => present,
}
}
$settings = [['User foo', 'X11Forwarding yes', 'banner none'],['Host *.example.net', 'X11Forwarding no', 'banner none']]
$settings.each |Array $setting| {
$setting_array = split($setting[1],/ /)
sshd_config { "${setting_array[0]} ${setting[0]}":
ensure => present,
key => "${setting_array[0]}",
condition => "${setting[0]}",
value => "${setting_array[1]}",
}
}
当前结果:
Match Host *.example.net
# Created by Puppet
X11Forwarding no
Match User foo
# Created by Puppet
X11Forwarding yes
预期结果:
Match Host *.example.net
# Created by Puppet
X11Forwarding no
Banner none
Match User foo
# Created by Puppet
X11Forwarding yes
Banner none
我只能更新索引中提到的一个值,但我正在寻找一种方法来更新列表中提到的更多或所有值。
不清楚哪个模块正在提供您的 sshd_config_match
和 sshd_config
资源类型,因此也不清楚它们的作用。然而,如果我们考虑这段代码...
$settings = [['User foo', 'X11Forwarding yes', 'banner none'],['Host *.example.net', 'X11Forwarding no', 'banner none']]
$settings.each |Array $setting| {
$setting_array = split($setting[1],/ /)
sshd_config { "${setting_array[0]} ${setting[0]}":
ensure => present,
key => "${setting_array[0]}",
condition => "${setting[0]}",
value => "${setting_array[1]}",
}
}
...我们可以看到 $settings
的每个元素都是一个 three-element 数组,其中 each
调用仅访问索引为 0 和 1 的元素。这似乎与您看到的结果相匹配,该结果不包含与索引 2 处元素的数据对应的任何内容。
您 可以 迭代内部 $setting
元素,从索引 1 开始,而不是只考虑该元素,但我建议更自然地重构数据,并编写适合重组数据的代码。您的数组中有混合意义的数据,并且您将键和值不必要地塞在一起,以至于您需要花费精力将它们分开。将数据结构化为哈希的哈希而不是数组的数组可能是一个好的开始:
$settings = {
'User foo' => { 'X11Forwarding' => 'yes', 'banner' => 'none'},
'Host *.example.net' => { 'X11Forwarding' => 'no', 'banner' => 'none'},
}
这不仅大大提高了 可读性 (主要来自格式化),而且还提供了更大的 可用性 。也就是说,虽然我在这里有点猜测,但您应该能够执行类似于以下操作的操作:
$settings.each |String $condition, Hash $properties| {
$properties.each |String $key, String $value| {
sshd_config { "${condition} ${key}":
ensure => 'present',
condition => $condition,
key => $key,
value => $value,
}
}
}
同样,可读性更高,这一次主要来自有用的名称选择,并且更清晰地表明这样的东西实际上是代码的正确结构(假设我已经正确地推断出足够的类型你正在使用)。
我能够通过传递索引将值更新到“User foo”和“Host *.example.net”部分。如果我传递索引 1 或 2,相应的值就会更新。
我的代码:
$sections = ['Host *.example.net', 'User foo']
$sections.each |String $section| {
sshd_config_match { "${section}":
ensure => present,
}
}
$settings = [['User foo', 'X11Forwarding yes', 'banner none'],['Host *.example.net', 'X11Forwarding no', 'banner none']]
$settings.each |Array $setting| {
$setting_array = split($setting[1],/ /)
sshd_config { "${setting_array[0]} ${setting[0]}":
ensure => present,
key => "${setting_array[0]}",
condition => "${setting[0]}",
value => "${setting_array[1]}",
}
}
当前结果:
Match Host *.example.net
# Created by Puppet
X11Forwarding no
Match User foo
# Created by Puppet
X11Forwarding yes
预期结果:
Match Host *.example.net
# Created by Puppet
X11Forwarding no
Banner none
Match User foo
# Created by Puppet
X11Forwarding yes
Banner none
我只能更新索引中提到的一个值,但我正在寻找一种方法来更新列表中提到的更多或所有值。
不清楚哪个模块正在提供您的 sshd_config_match
和 sshd_config
资源类型,因此也不清楚它们的作用。然而,如果我们考虑这段代码...
$settings = [['User foo', 'X11Forwarding yes', 'banner none'],['Host *.example.net', 'X11Forwarding no', 'banner none']] $settings.each |Array $setting| { $setting_array = split($setting[1],/ /) sshd_config { "${setting_array[0]} ${setting[0]}": ensure => present, key => "${setting_array[0]}", condition => "${setting[0]}", value => "${setting_array[1]}", } }
...我们可以看到 $settings
的每个元素都是一个 three-element 数组,其中 each
调用仅访问索引为 0 和 1 的元素。这似乎与您看到的结果相匹配,该结果不包含与索引 2 处元素的数据对应的任何内容。
您 可以 迭代内部 $setting
元素,从索引 1 开始,而不是只考虑该元素,但我建议更自然地重构数据,并编写适合重组数据的代码。您的数组中有混合意义的数据,并且您将键和值不必要地塞在一起,以至于您需要花费精力将它们分开。将数据结构化为哈希的哈希而不是数组的数组可能是一个好的开始:
$settings = {
'User foo' => { 'X11Forwarding' => 'yes', 'banner' => 'none'},
'Host *.example.net' => { 'X11Forwarding' => 'no', 'banner' => 'none'},
}
这不仅大大提高了 可读性 (主要来自格式化),而且还提供了更大的 可用性 。也就是说,虽然我在这里有点猜测,但您应该能够执行类似于以下操作的操作:
$settings.each |String $condition, Hash $properties| {
$properties.each |String $key, String $value| {
sshd_config { "${condition} ${key}":
ensure => 'present',
condition => $condition,
key => $key,
value => $value,
}
}
}
同样,可读性更高,这一次主要来自有用的名称选择,并且更清晰地表明这样的东西实际上是代码的正确结构(假设我已经正确地推断出足够的类型你正在使用)。