第一个选项

第一个选项

我想将/etc/default/grubPuppet 中的一行改成这样:

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

对于引用部分,你可以使用augeasprovidersshellvar提供者并强制引用样式:

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

第二种选择

如果您想尝试第二种选择,最好的方法可能是向augeasprovidersshellvar类型发送一个(好的) 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

查看 /etc/default/grub.d/*.cfg 功能

相关内容