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 tiposhellvar
; - 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 .