我想将/etc/default/grub
Puppet 中的一行改成这样:
GRUB_CMDLINE_LINUX="cgroup_enable=memory"
我尝试过使用 augeas,它似乎有这种魔力:
exec { "update_grub":
command => "update-grub",
refreshonly => true,
}
augeas { "grub-serial":
context => "/files/etc/default/grub",
changes => [
"set /files/etc/default/grub/GRUB_CMDLINE_LINUX[last()] cgroup_enable=memory",
],
notify => Exec['update_grub'],
}
它似乎有效,但结果字符串不在引号中,而且我想确保任何其他值都用空格分隔。
GRUB_CMDLINE_LINUX=cgroup_enable=memory
是否存在某种机制来附加值并摆脱整个事物?
GRUB_CMDLINE_LINUX="quiet splash cgroup_enable=memory"
答案1
对于引用部分,你可以使用augeasproviders
的shellvar
提供者并强制引用样式:
shellvar { 'GRUB_CMDLINE_LINUX':
ensure => present,
target => '/etc/default/grub',
value => 'cgroup_enable=memory',
quoted => 'double',
}
这将在代理上内部使用 Augeas(作为 Ruby 库),只是以更智能的方式。
至于附加到现有值,有两种选择:
- 使用事实获取当前值(例如使用
augeasfacter
来检索它),在清单中对其进行分析,并使用类型将其附加到其中shellvar
; - 改进
shellvar
提供程序,使其附加到值而不是替换它。
第一个选项
事实
以下文件可以在您的模块中分发${modulepath}/${modulename}/lib/facter/grub_cmdline_linux.rb
并使用进行部署pluginsync
。
require 'augeas'
Facter.add(:grub_cmdline_linux) do
setcode do
Augeas.open(nil, '/', Augeas::NO_MODL_AUTOLOAD) do |aug|
aug.transform(
:lens => 'Shellvars.lns',
:name => 'Grub',
:incl => '/etc/default/grub',
:excl => []
)
aug.load!
aug.get('/files/etc/default/grub/GRUB_CMDLINE_LINUX').gsub(/['"]/, '')
end
end
end
这将以字符串形式返回事实的当前值,并删除值周围的引号。它需要代理上的 Augeas Ruby 库,如果您已经使用该augeas
类型,我想您已经拥有该库。
傀儡代码
下一步是利用这个值来检查你的目标值是否包含在内。你可以拆分字符串并使用stlib
模块为此提供的功能:
$value = 'cgroup_enable=memory'
# Split string into an array
$grub_cmdline_linux_array = split($::grub_cmdline_linux, ' ')
# Check if $value is already there to determine new target value
$target = member($grub_cmdline_linux_array, $value) ? {
true => $grub_cmdline_linux_array,
false => flatten([$grub_cmdline_linux_array, $value]),
}
# Enforce new target value
# Use the array and force the 'string' array type
shellvar { 'GRUB_CMDLINE_LINUX':
ensure => present,
target => '/etc/default/grub',
value => $target,
array_type => string,
}
运行
Notice: /Stage[main]//Shellvar[GRUB_CMDLINE_LINUX]/value: value changed ['quiet splash usbcore.old_scheme_first=1'] to 'quiet splash usbcore.old_scheme_first=1 cgroup_enable=memory'
检查幂等性:
Notice: Finished catalog run in 0.17 seconds
第二种选择
如果您想尝试第二种选择,最好的方法可能是向augeasproviders
的shellvar
类型发送一个(好的) PR 并添加一个array_append
参数(或更好的名称):
shellvar { 'GRUB_CMDLINE_LINUX':
ensure => present,
target => '/etc/default/grub',
value => 'cgroup_enable=memory',
array_append => true,
array_type => 'double',
}
此参数会将值视为数组,如果尚未找到该值,则将其附加到现有值。这需要 Ruby 编码,但在许多其他情况下可以重复使用 ;-)
提示:这应该发生这里。
答案2
(仅适用于 Ubuntu 用户)
因为改变 /etc/default/grub 不是那么好..
只需部署 /etc/default/grub.d/memory.cfg
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX cgroup_enable=memory"
然后更新grub