Назад | Перейти на главную страницу

Как обновить grub с помощью марионетки?

Я хотел бы изменить строку в /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

(см. функцию /etc/default/grub.d/*.cfg )