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

Как `augtool` поддерживать файл` / etc / aliases`?

Я хочу убедиться, что у меня есть строчки ...

root: /dev/null
greenman: /dev/null

... в моем /etc/aliases файл, и я узнал о augtool. Я знаю, что могу сделать что-то подобное с помощью augtool ...

$ sudo augtool set /files/etc/aliases/15/name greenman

... но мне не нравится жесткое кодирование 15. Это вполне возможно в некоторых системах greenman: /dev/null может быть 10-й парой имя / значение. Есть ли способ избежать использования числа в /files/etc/aliases/15/name ?

Спасибо

Работаю с seq записи (пронумерованные записи, например 15 в вашем случае) в Augeas может быть немного сложнее.

С помощью augtool по-прежнему

Вы можете создать скрипт augtool, который выглядит так:

#!/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

Шебанг (#!/usr/bin/augtool -sf) использует -s для автоматического сохранения после внесения изменений, и -f чтобы взять файл с командами, сделав его самоисполняемым скриптом, чтобы вы могли просто сделать файл исполняемым и запустить его:

$ chmod +x greenman.augtool
$ sudo ./greenman.augtool
Saved 1 file(s)
$ sudo ./greenman.augtool # it should be idempotent, too

Если вы не хотите делать скрипт исполняемым, вы также можете передать его в augtool:

$ sudo augtool --autosave --file greenman.augtool
Saved 1 file(s)

И если вы не хотите использовать --autosave, можете добавить save как последняя строка сценария.

Использование «настоящего» языка программирования

Bash хорош, но преодоление его ограничений может привести к сложным решениям. У Авгия есть множество привязок на многих языках. Просто выберите один, и вам будет проще писать код, потому что вы сможете использовать постоянный обработчик Augeas. Вот пример с 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

Использование марионетки

В Puppet лучшее решение - полагаться на mailalias введите с augeas провайдер из augeasproviders. Он использует библиотеку Augeas Ruby для безопасного редактирования /etc/aliases:

mailalias { 'greenman':
  ensure    => present,
  recipient => '/dev/null',
  provider  => augeas,
}

Примечание: mailalias это стандартный марионеточный тип, но поставщик по умолчанию не использует Augeas.