web-dev-qa-db-ja.com

Augeasを使用して構成ファイルの行をコメントアウト/コメント解除する方法

/etc/syslog.confファイルに次のものが含まれていると仮定します。

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                         /dev/console

これをkern.* /var/log/kern.logに変更して、人間が読み取れるカーネルログのタイムスタンプを取得します。

人形はそれを行うことができます:

class syslog::config {
    file { "/etc/syslog.conf":
        ensure  => present,
        source  => "puppet:///modules/syslog/syslog.conf",
        require => Class["syslog::install"],
        notify  => Class["syslog::service"],
    }
}

または、sed -iを使用することもできます。

Augeas を使用すると、この行をファイルの最後に追加できます。

class syslog::config {
    augeas { "syslogkern":
        context => "/files/etc/syslog.conf",
        changes => [
            "set entry[last()+1]/selector/facility kern",
            "set entry[last()]/selector/level *",
            "set entry[last()]/action/file '/var/log/kern.log'",
        ],
    }
}

または宛先を変更します。

class syslog::config {
    augeas { "syslogkern":
        context => "/files/etc/syslog.conf",
        onlyif  => "get #comment[3] == 'kern.*\t\t\t\t\t\t\t/dev/console'",
        changes => [
            "set #comment[3] 'kern.*\t\t\t\t\t\t\t/var/log/kern.log'",
        ],
    }
}

しかし、どうすればこの行のコメントを解除できますか?


[〜#〜]更新[〜#〜]

#comment[3]の後に行を挿入しようとしているのは次のとおりです。

augtool> ins facle after /files/etc/syslog.conf/#comment[3]
augtool> set /files/etc/syslog.conf/facle/selector/facility kern
augtool> set /files/etc/syslog.conf/facle/selector/level *
augtool> set /files/etc/syslog.conf/facle/action/file /var/log/kern.log

または:

augtool> ins facle after /files/etc/syslog.conf/#comment[3]
augtool> set /files/etc/syslog.conf/facle[last()] kernlog
augtool> set /files/etc/syslog.conf/facle[. = 'kernlog']/selector/facility kern
augtool> set /files/etc/syslog.conf/facle[. = 'kernlog']/selector/level *
augtool> set /files/etc/syslog.conf/facle[. = 'kernlog']/action/file /var/log/kern.log

しかしそれはうまくいきませんでした:

augtool> save
error: Failed to execute command
error: saving failed (run 'print /augeas//error' for details)
augtool> print /augeas//error
/augeas/files/etc/syslog.conf/error = "put_failed"
/augeas/files/etc/syslog.conf/error/path = "/files/etc/syslog.conf"
/augeas/files/etc/syslog.conf/error/lens = "/usr/share/augeas/lenses/dist/syslog.aug:243.18-.51:"
/augeas/files/etc/syslog.conf/error/message = "Failed to match \n    ({ } | { /#comment/ = /[^\\001-\\004\\t\\n !+-][^\\001-\\004\\n]*[^\\001-\\004\\t\\n ]|[^\\001-\\004\\t\\n !+-]/ } | { /entry/ })*({ /program/ } | { /hostname/ })*\n  with tree\n    { \"#comment\" = \"Log all kernel messages to the console.\" } { \"#comment\" = \"Logging much else clutters up the screen.\" } { \"#comment\" = \"kern.*\t\t\t\t\t\t\t/var/log/kern.log\" } { \"facle\" = \"kernlog\" } { \"entry\" } {  } { \"#comment\" = \"Log anything (except mail) of level info or higher.\" } { \"#comment\" = \"Don't log private authentication messages!\" } { \"entry\" } {  } { \"#comment\" = \"The authpriv file has restricted access.\" } { \"entry\" } {  } { \"#comment\" = \"Log all the mail messages in one place.\" } { \"entry\" } {  } {  } { \"#comment\" = \"Log cron stuff\" } { \"entry\" } {  } { \"#comment\" = \"Everybody gets emergency messages\" } { \"entry\" } {  } { \"#comment\" = \"Save news errors of level crit and higher in a special file.\" } { \"entry\" } {  } { \"#comment\" = \"Save boot messages also to boot.log\" } { \"entry\" } {  } {  } { \"#comment\" = \"INN\" } {  } { \"entry\" } { \"entry\" } { \"entry\" }"
7
quanta

{、Un}コメントは、その性質上、Augeasでは複雑な問題です。簡単に言えば、Augeasは現在、ノードをコメントすることはできません。

理由(および提案された解決策)は このチケット で詳しく説明されています。

挿入が失敗する理由としては、facleノードではなくentryノードを作成したことが原因です。 faclesyslog.augの既知のノード名ではありません。

だからここにあなたが代わりにできることがある:

augtool> print /files/etc/syslog.conf/
/files/etc/syslog.conf
/files/etc/syslog.conf/#comment[1] = "titi"
/files/etc/syslog.conf/#comment[2] = "kern.*                         /dev/console"
/files/etc/syslog.conf/#comment[3] = "toto"
augtool> defvar kerncomment /files/etc/syslog.conf/#comment[. =~ regexp('kern.* +/dev/console')][count(/files/etc/syslog.conf/entry[selector/facility = "kern" and selector/level = "*" and action/file = "/var/log/kern.log"]) = 0]
augtool> ins entry after $kerncomment
augtool> defvar kernentry /files/etc/syslog.conf/entry[preceding-sibling::*[1][$kerncomment]]
augtool> set $kernentry/selector/facility kern
augtool> set $kernentry/selector/level *
augtool> set $kernentry/action/file /var/log/kern.log
augtool> rm $kerncomment
augtool> print /files/etc/syslog.conf/
/files/etc/syslog.conf
/files/etc/syslog.conf/#comment[1] = "titi"
/files/etc/syslog.conf/entry
/files/etc/syslog.conf/entry/selector
/files/etc/syslog.conf/entry/selector/facility = "kern"
/files/etc/syslog.conf/entry/selector/level = "*"
/files/etc/syslog.conf/entry/action
/files/etc/syslog.conf/entry/action/file = "/var/log/kern.log"
/files/etc/syslog.conf/#comment[3] = "toto"
augtool> save
Saved 1 file(s)
augtool> 

最初の行は、この変更がべき等であることを保証します。 Puppetを使用すると、これを簡略化できます。onlyifを使用すると、最初の行の複雑さを回避できます。

4
ℝaphink

Augeas AFAIKには単純な「この行のコメントを外す」機能はありません。 insを使用して既存のコメントを見つけ、setコマンドを使用して新しいエントリを挿入し、コメントを削除できます。

リクエストごとに、GRUBのシリアルコンソールに「シリアル」と「ターミナル」を設定する方法の例を次に示します。

augeas { "grub-serial-ttyS${portnum}":
   context => "/files/etc/grub.conf",
   changes => [
       'rm serial',
       'ins serial after timeout',
       "set serial/unit '${portnum}'",
       "set serial/speed '${portspeed}'",
       'rm terminal',
       'ins terminal after serial',
       "set terminal/timeout '5'",
       "clear terminal/console",
       "clear terminal/serial",
   ],
}

唯一の注意点は、timeoutが存在する必要があることです。

実際、これが本当に良い例かどうかはわかりませんが、とにかくここにあります。

2
Wil Cooley