Я хотел бы изменить строку в /etc/default/grub
с марионеткой к этому:
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"
Для цитирования вы можете использовать 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
Если вы хотите попробовать второй вариант, лучшим способом, вероятно, будет отправить (приятный) PR на augeasproviders
с shellvar
введите добавление array_append
параметр (или лучшее название):
shellvar { 'GRUB_CMDLINE_LINUX':
ensure => present,
target => '/etc/default/grub',
value => 'cgroup_enable=memory',
array_append => true,
array_type => 'double',
}
Этот параметр обрабатывает значение как массив и добавляется к существующим значениям, если значение еще не найдено. Для этого потребуется кодирование Ruby, но его можно будет повторно использовать во многих других случаях ;-)
Подсказка: это должно произойти Вот.
(только для пользователей ubuntu)
Поскольку изменять / etc / default / grub не очень приятно ..
Просто разверните /etc/default/grub.d/memory.cfg
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX cgroup_enable=memory"
Затем update-grub