Augeas如何使用
如何使用 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
?謝謝
在 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。