Wie kann ich eine Zeile in einer Konfigurationsdatei mit Augeas auskommentieren / auskommentieren?

7

Angenommen, ich habe Folgendes in der /etc/syslog.confDatei:

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

Ich möchte es ändern kern.* /var/log/kern.log, um den für Menschen lesbaren Zeitstempel für das Kernel-Protokoll zu erhalten.

Puppe kann es tun:

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

oder ich kann auch das benutzen sed -i.

Mit Augeas kann ich diese Zeile an das Ende der Datei anhängen:

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'",
        ],
    }
}

oder ändern Sie das Ziel:

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'",
        ],
    }
}

Aber wie kommentiere ich diese Zeile aus?


AKTUALISIEREN

Folgendes habe ich versucht, eine Zeile danach einzufügen #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

oder:

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

aber es hat nicht funktioniert:

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\" }"
Quanten
quelle

Antworten:

4

{, Un} Kommentare sind bei Augeas aufgrund ihrer Natur eine komplexe Angelegenheit. Die kurze Antwort lautet, dass Augeas derzeit keine Kommentarknoten {, un} kommentieren kann.

Der Grund (und die vorgeschlagenen Lösungen) sind in diesem Ticket aufgeführt .

Der Grund, warum Ihre Einfügung fehlschlägt, liegt darin, dass Sie facleanstelle eines entryKnotens einen Knoten erstellt haben. facleist kein bekannter Knotenname in syslog.aug.

Hier ist also etwas, das Sie stattdessen tun könnten:

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> 

Die erste Zeile stellt sicher, dass diese Änderung idempotent ist. Dies kann vereinfacht werden, wenn Sie Puppet verwenden: Sie können die Komplexität der ersten Zeile vermeiden, indem Sie verwenden onlyif.

ℝaphink
quelle
Noch eine Frage: Wie kann ich die vertikale Ausrichtung beibehalten, indem ich zuvor einige Registerkarten einfüge /var/log/kern.log? \that nicht funktioniert.
Quanten
Das kannst du nicht. Leerzeichen und Zeilenumbrüche werden von Augeas entfernt, um den Baum zu erstellen, und es gibt keine Möglichkeit, sie über die API zu steuern. Wenn Sie einen vorhandenen Eintrag ändern, bleiben diese unverändert. Wenn Sie einen neuen Eintrag erstellen, wird das Standardtrennzeichen verwendet.
inkaphink
2

In Augeas AFAIK gibt es keine einfache Einrichtung zum Kommentieren dieser Linie. Sie können insden vorhandenen Kommentar suchen, den neuen Eintrag mit den setBefehlen wie gewünscht einfügen und dann den Kommentar entfernen.

Auf Anfrage sehen Sie hier ein Beispiel, wie ich "serial" und "terminal" für eine serielle Konsole für GRUB eingerichtet habe:

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",
   ],
}

Die einzige Einschränkung ist, dass timeoutes existieren muss.

Eigentlich bin ich mir nicht sicher, ob dies wirklich ein gutes Beispiel ist, aber hier ist es trotzdem.

Wil Cooley
quelle
Könnten Sie mir bitte ein Beispiel geben? Schauen Sie sich meine aktualisierte Frage an, um zu sehen, was ich versucht habe.
Quanten