4 votos

Cómo actualizar el grub con títeres?

Me gustaría cambiar una línea en /etc/default/grub con títeres a este:

GRUB_CMDLINE_LINUX="cgroup_enable=memory"

He tratado de utilizar augias que parece hacer esta magia:

   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'],
  }

Parece que funciona, pero la cadena de resultado no está entre comillas y también quiero asegurarme de que cualquier otro de los valores se separan por un espacio.

GRUB_CMDLINE_LINUX=cgroup_enable=memory

¿Existe algún mecanismo de cómo añadir valores y escapar de todo el asunto?

GRUB_CMDLINE_LINUX="quiet splash cgroup_enable=memory"

7voto

ℝaphink Puntos 5295

Para citar parte, usted podría utilizar augeasproviders's shellvar proveedor y la fuerza de las citando estilo:

shellvar { 'GRUB_CMDLINE_LINUX':
  ensure   => present,
  target   => '/etc/default/grub',
  value    => 'cgroup_enable=memory',
  quoted   => 'double',
}

Esto hará uso de Augias internaly (como un Rubí de la biblioteca) en el agente, sólo en una forma más inteligente.

Como para anexar a los valores existentes, hay dos opciones:

  • Obtener el valor actual utilizando un hecho (usa por ejemplo augeasfacter a recuperarlo), lo analizamos en el manifiesto y anexar el uso de la shellvar tipo;
  • Mejorar la shellvar proveedor, a fin de que se anexa a la de valor en lugar de reemplazarlo.

Primera opción

El hecho de

Los siguientes archivos pueden ser distribuidos en su módulo en ${modulepath}/${modulename}/lib/facter/grub_cmdline_linux.rb e implementan mediante 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

Esto devolverá el valor actual de la realidad como una cadena, y quitar las comillas alrededor de el valor. Se requiere la Augias Ruby biblioteca en el agente, que supongo que usted tiene si usted usa el augeas tipo ya.

Puppet de código

El siguiente paso es hacer uso de este valor para comprobar si su valor está incluido. Se puede dividir la cadena y el uso de la stlib módulo de funciones para este:

$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,
}

Ejecutar

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'

Compruebe idempotence:

Notice: Finished catalog run in 0.17 seconds

Segunda opción

Si quieres ir a por la segunda opción, la mejor manera sería enviar una (agradable) PR augeasproviders's shellvar tipo de la adición de un array_append parámetro (o un nombre mejor):

shellvar { 'GRUB_CMDLINE_LINUX':
  ensure       => present,
  target       => '/etc/default/grub',
  value        => 'cgroup_enable=memory',
  array_append => true,
  array_type   => 'double',
}

Este parámetro podría tratar el valor como una matriz, y anexar a los valores existentes si el valor no se encuentra ya. Esto requeriría de Rubí de codificación, pero sería reutilizable en muchos otros casos ;-)

Sugerencia: esto debe suceder aquí.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: