Como atualizar o grub com o fantoche?

4

Eu gostaria de mudar uma linha em /etc/default/grub com fantoche para isso:

GRUB_CMDLINE_LINUX="cgroup_enable=memory"

Eu tentei usar augeas que parece fazer essa mágica:

   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 funcionar, mas a sequência de resultados não está entre aspas e também quero ter certeza de que quaisquer outros valores serão separados por espaço.

GRUB_CMDLINE_LINUX=cgroup_enable=memory

Existe algum mecanismo de como agregar valores e escapar da coisa toda?

GRUB_CMDLINE_LINUX="quiet splash cgroup_enable=memory"
    
por Tombart 11.11.2013 / 10:29

2 respostas

6

Para a parte de cotações, você pode usar augeasproviders 's shellvar provider e forçar o estilo de citação:

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

Isso usará o Augeas internaly (como uma biblioteca Ruby) no agente, apenas de uma maneira mais inteligente.

Quanto ao acréscimo aos valores existentes, há duas opções:

  • Obtenha o valor atual usando um fato (use, por exemplo, augeasfacter para recuperá-lo), analise-o em seu manifestar e anexar a ele usando o tipo shellvar ;
  • Aprimore o provedor shellvar para que ele seja anexado ao valor em vez de substituí-lo.

Primeira opção

O fato

O arquivo a seguir pode ser distribuído em seu módulo em ${modulepath}/${modulename}/lib/facter/grub_cmdline_linux.rb e implementado usando 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

Isso retornará o valor atual do fato como uma string e removerá as aspas ao redor do valor. Ele requer a biblioteca Augeas Ruby no agente, que eu suponho que você tenha se você já usa o tipo augeas .

Código do fantoche

O próximo passo é usar esse valor para verificar se seu valor de destino está incluído. Você pode dividir a string e usar as funções stlib module para isso:

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

Executar

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'

Verifique a idempotência:

Notice: Finished catalog run in 0.17 seconds

Segunda opção

Se você gostaria de experimentar a segunda opção, a melhor maneira seria enviar um (bom) PR para augeasproviders shellvar type adicionando um parâmetro array_append (ou um melhor nome):

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

Este parâmetro trataria o valor como uma matriz e acrescentaria aos valores existentes se o valor não for encontrado já. Isso exigiria codificação Ruby, mas seria reutilizável em muitos outros casos; -)

Dica: isso deve acontecer aqui .

    
por 23.11.2013 / 23:31
0

(somente para usuários do Ubuntu)

Como alterar / etc / default / grub não é tão bom ..

Basta implantar o /etc/default/grub.d/memory.cfg

GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX cgroup_enable=memory"

Em seguida, update-grub

( veja o recurso /etc/default/grub.d/*.cfg )

    
por 04.02.2016 / 00:52