web-dev-qa-db-ja.com

`/ etc / alias`ファイルを維持するために` augtool`する方法は?

私は私がラインを持っていることを確認したいです...

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で数字を使用しないようにする方法はありますか?

ありがとう

3
Red Cricket

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の使用

Puppetでの最善の解決策は、 augeasproviders から mailalias provider を使用してaugeas型に依存することです。 Augeas Rubyライブラリを使用して、/etc/aliasesを安全に編集します:

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

注:mailalias標準のPuppetタイプ ですが、デフォルトのプロバイダーはAugeasを使用しません。

4
ℝaphink