Augeas

如何使用 augtool 來維護 /etc/aliases 文件?

  • November 25, 2013

我想確保我有線條……

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

謝謝

在 Augeas 中使用seq條目(這些編號的條目,例如15在您的情況下)可能有點棘手。

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

shebang ( #!/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 有很多語言的綁定。只需選擇一個,編寫程式碼就會變得更容易,因為您將能夠使用持久的 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 中,最好的解決方案是依賴來自augeasproviders的提供者mailalias的類型。它使用 Augeas Ruby 庫來安全地編輯:augeas/etc/aliases

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

注意:mailalias標準的 Puppet 類型,但預設提供程序不使用 Augeas。

引用自:https://serverfault.com/questions/557378