Trabalhar com seq
entradas (essas entradas numeradas, como 15
no seu caso) em Augeas pode ser um pouco complicado.
Usando augtool
ainda
Você pode criar um script de augtool semelhante a este:
#!/usr/bin/augtool -sf
# First, match /etc/aliases, only if there's no "greenman" entry yet
# This will define a '$yellowwoman' variable which will contain '/etc/aliases',
# but only if there is no "greenman" entry yet (i.e. the count of the
# "greenman" entries is 0)
defvar yellowwoman /files/etc/aliases[count(*[name="greenman"])=0]
# Add the greenman entry at the end
# (using '01', which is never used automatically in 'seq' entries)
set $yellowwoman/01/name greenman
# Now set the value for the "greenman" entry,
# which you can be sure exists.
# Don't reuse the '$yellowwoman' variable, otherwise you'll
# only set the value when "greeman" wasn't there yet
# By selecting the "greenman" entry, you will always set the value
# even if the entry already existed in the file
set /files/etc/aliases/*[name="greenman"]/value /dev/null
O shebang ( #!/usr/bin/augtool -sf
) usa -s
para salvar automaticamente depois de fazer as alterações e -f
para obter um arquivo com comandos, tornando-o um script auto-executável, para que você possa tornar o arquivo executável e execute:
$ chmod +x greenman.augtool
$ sudo ./greenman.augtool
Saved 1 file(s)
$ sudo ./greenman.augtool # it should be idempotent, too
Se você não quiser tornar o script executável, também poderá passá-lo para augtool
:
$ sudo augtool --autosave --file greenman.augtool
Saved 1 file(s)
E se você não quiser usar --autosave
, poderá adicionar save
como a última linha do script.
Usando uma linguagem de programação "real"
O Bash é legal, mas lidar com seus limites pode levar a soluções complexas. Augeas tem muitas ligações em vários idiomas. Basta escolher um e ficará mais fácil escrever seu código, porque você poderá usar um manipulador de Augeas persistente. Aqui está um exemplo com o Ruby:
#!/usr/bin/env ruby
require 'augeas'
Augeas.open do |aug|
if aug.match('/files/etc/aliases/*[name="greenman"]').empty?
# Create a new "greeman" entry
aug.set('/files/etc/aliases/01/name', 'greenman')
end
# Set the value
aug.set('/files/etc/aliases/*[name="greenman"]/value', '/dev/null')
# Commit your changes
aug.save!
end
Usando Puppet
No Puppet, a melhor solução é confiar no tipo mailalias
com o augeas
provider de augeasproviders . Ele usa a biblioteca Augeas Ruby para editar com segurança o /etc/aliases
:
mailalias { 'greenman':
ensure => present,
recipient => '/dev/null',
provider => augeas,
}
Observação: mailalias
é um tipo de marionete padrão , mas o provedor padrão não faz isso t use Augeas.