Angenommen, wir wollen nicht jedesmal "cd /var/cfengine/masterfiles/MyPromises" tippen, um zu unserem Promise-Verzeichnis zu gelangen. Daher möchten wir uns einen Alias "cdmp" anlegen, um nur noch cdmp tippen zu müssen. Aliase legt man, für root, in /root/.profile an. Wir müssen für unsere Absicht folgende Zeile in die Datei einfügen:
alias cdmp="cd /var/cfengine/masterfiles/MyPromises"
Für die, die es direkt ausprobieren: Nach dem Speichern der Datei funktioniert der Alias noch nicht. Die Datei muss neu eingelesen werden; das passiert mit jedem neuen Öffnen einer Shell.
#body common control
#{
# bundlesequence => { "regline" };
# inputs => {"/var/cfengine/inputs/lib/3.7/stdlib.cf"};
#}
Zunächst definieren wir die Variable oben im bundle:
bundle agent alias
{
vars:
"alias" string => "alias cdmp=\"cd /var/cfengine/masterfiles/MyPromises\""
Die Anführungszeichen im alias-Kommando sind hier gequoted/escaped, damit der CFEngine-Parser nicht durcheinanderkommt. Der Backslash vor dem Anführungszeichen zeigt dem Parser an, dass das nächste Zeichen kein Sonderzeichen, sondern als gewöhnliches Zeichen behandelt werden soll; sonst würde der Parser das zweite Anführungszeichen als Ende der Zeichenkette interpretieren, mit dem Rest nichts mehr anzufangen wissen und Fehlermeldungen produzieren.
Jetzt geht es an die Datei bzw, in CFEngine-Sprache: "an das Versprechen der Datei", das files-promise: (Die Datei ist das versprechende Element, "der Promiser", sie/es verspricht, im mittels der Attribute definiertem Zustand zu existieren.)
files:
"/root/.profile"
create => "true",
edit_line => append_if_no_line("$(alias)");
Mit create => "true" stellen wir sicher, dass die Datei erstellt wird, falls es sie nicht bereits gibt. Die edit_line-Funktion append_if_no_line vermeidet, dass unsere gewünschte Zeile nicht mehrmals in der Datei vorkommt; existiert sie bereits, wird sie nicht nochmals hinzugefügt. Das war es auch schon und wir können das bundle mit
}
schliessen.
Wir wollen aber Bescheid wissen, wenn die Zeile eingefügt wurde. Dazu verwenden wir eine Class. Das Setzen der Class muss im files-Promise angefügt werden:
files:
"/root/.profile"
create => "true",
edit_line => append_if_no_line("$(alias)"),
classes => if_else("alias_set","alias_set_error");
Es gibt verschiedene Methoden, "Return-Classes" zu definieren, hier verwende ich "if_else": Wenn die append_if_no_line Funktion erfolgreich war (die Zeile wurde eingefügt), wird die Class "alias_set" gesetzt; gab es einen Fehler, wird die Class "alias_set_error" gesetzt. Gehen wir davon aus, das Einfügen funktioniert und "alias_set" wird gesetzt, dann wird mit dem folgenden reports-promise "Der Alias "cdmp="cd /var/cfengine/masterfiles/MyPromises" wurde in /root/.profile definiert." als Report-Zeile (im Syslog) ausgegeben.
reports:
alias_set::
"Der Alias: $(alias) wurde in $(edit.filename) definiert.";
}
$(edit.filename) ist eine CFEngine-interne Variable, welche die Datei enthält, die aktuell vom Promise editiert wird.