Ansible: Logparser

Ich musste mal Ansible Zweck entfremden: Auslesen von Log Dateien und Anzeige nur bestimmter Einträge.

---
- hosts: hal52b
  gather_facts: no
  vars:
   nummer: [
            " 500",
            " 404"
           ]

  tasks:
   - name: Suche Error in Access LOG
     shell:
       chdir: /var/log/apache2
       cmd: "grep -ari -e '^halsec.de' other_vhosts_access.log | cat"
     changed_when: false
     ignore_errors: true
     become: true
     register: grep_cmd

   - debug:
       msg: "{{item| regex_findall('\\s\\d{3,5}')}} gefunden"
     when: "item| regex_findall('\\s\\d{3,5}')|intersect(nummer)|length != 0"
     loop: "{{ grep_cmd.stdout_lines }}"

Beim Aufruf des Playbooks lese ich eine Apache Log Datei aus. Mit grep findet die erste grobe Selektion statt. In dem Debug Loop nehmen wir uns Zeile für Zeile und vergleichen 3-5 stellige gefundene Errorcodes mit einer definierten Liste. Kommt der Errorcode in der Liste vor, wird er „OK“ – alle nicht vorkommenden Errorcode werden „skipped“ ausgegeben.

Die Ausgabe kann über Konfiguration der ansible.cfg beeinflusst werden. Bei langen Debug Ausgaben kann es sinnvoll sein, „skipped“ Nachrichten auszublenden. Auch farblich kann die Ausgabe angepasst werden.

Angepasste Farben in der ansible.cfg
[defaults]
display_skipped_hosts = yes
[colors]
ok = purple
skip = dark gray

„display_skipped_hosts = no“ unterdrückt alle skipped Nachrichten. Da kann/muss mit gespielt werden. Viel Spaß!

EDV Service Gemeinschaft

Noch in diesem Jahr stehen viele Änderungen an.

Für die GfUD – der EDV Service Gemeinschaft in Bergisch Gladbach – habe ich eine Datensicherung konstruiert. Ohne Software auf den Clients!

Wie läuft bei Euch eine Datensicherung ab? Ich lege Wert auf Eure Meinung und Erfahrung! Schaut mal hier vorbei.

Tipp: Multidimensionale Arrays PHP für UI5 Views

So etwas, sollte man vermeiden: Mehrfaches laden von Datensätzen in einem Kontext

Das mag im Schulungsumfeld „OK“ sein – Produktiv bedeutet das aber Umstand, Unübersichtlichkeit und Zeit. Schöner ist das bilden eines JSON Datensatzes. Das geht ganz einfach:

Einen Satz laden und durch den JSON Tree selektieren.

UI5: Attribute PL/pgSQL vs JScript

Da scheiden sich die Geister: Datenaggregation und das setzen der Properties eines UI5 Elements nach oder mit der SQL Abfrage? Eine Frage der Sicherheit und des Komforts. Beispiel unsere KPI Seite https://halsec.de

Die Daten für die Kurs Kacheln habe ich aus Basis von PL/pgSQL als Funktion realisiert. Postgresql übernimmt die Selektion der Daten und die Findung der Properties.

Der JSON Datensatz beinhaltet so alle nötigen Daten zur Darstellung der Kurs Kachel im UI5. So gestaltet sich das JavaScript im UI5 sehr einfach:

(Controller)
var anzeige1 = new sap.ui.model.json.JSONModel();
anzeige1.loadData(„https://halsec.de/fetch/ui5_eins.php?wo=USD“);
this.byId(„gt2“).setModel(anzeige1, „rates„);

(View)

<GenericTile id="gt2" class="sapUiTinyMarginBegin sapUiTinyMarginTop tileLayout" header="€ / US-Dollar" subheader="EZB Tagekurs" press="kltabelle2()">
<TileContent id="tc2" unit="USD 20d AVG" footer="">
<NumericContent id="nc1" value="{rates>/v_rate}" scale="Eu" valueColor="{rates>/v_stat}" indicator="{rates>/v_indi}" withMargin="false" />
</TileContent></GenericTile>

Die Kacheln, die die Temperatur anzeigen, sind JavaScript generiert. Der JSON Datensatz liefert eine Datenmenge, die innerhalb UI5 bewertet wird.

Das pro cedere im JavaScript stellt sich wie folgt dar:

(Controller)
var ui5ang2 = {anzeige: [{indi:“None“, status:“Neutral“}]};
oModel3.loadData(„https://halsec.de/fetch/tempBRI.php“);
anzeige5.setData(ui5ang2);

oModel3.attachRequestCompleted(function() {
var a = oModel3.getProperty(„/0/temo“);
var b = oModel3.getProperty(„/2/temo“);
a = parseInt(a);
b = parseInt(b);
if (a > b) {
anzeige5.setProperty(„/anzeige/0/indi“ , „Up“);
};
if(a < b) { anzeige5.setProperty(„/anzeige/0/indi“ , „Down“); }; if(a > 25 || a <= 0) { anzeige5.setProperty(„/anzeige/0/status“ , „Error“); }; if(a > 5 && a < 10) { anzeige5.setProperty(„/anzeige/0/status“ , „Critical“); }; if(a >= 10 && a <= 25) {
anzeige5.setProperty(„/anzeige/0/status“ , „Good“);
};
});

(View)

<GenericTile id="21" class="sapUiTinyMarginBegin sapUiTinyMarginTop tileLayout" header="Brilon" subheader="{bri>/0/abfrage}" press="kltabelle1()"> <TileContent id="tc21" unit="Temperatur" footer="DWD"> <NumericContent id="nc21" scale="C" value="{bri>/0/temo}" icon="sap-icon://temperature" valueColor="{brianzeige>/anzeige/0/status}" indicator="{brianzeige>/ </TileContent> </GenericTile>"

CLI: mySQL pgsql Spickzettel

Ich kann es mir nicht merken 😉

Zur Zeit arbeiten wir im Team an der Programmierung mit zwei unterschiedlichen Datenbank Backend’s: mySQL und Postgres. „Mal eben“ die Struktur einer Tabelle aufrufen, läuft über die Bash CLI unterschiedlich.

schnelle CLI Befehle

BeschreibungmySQLpgsql
einfaches Loginmysql -u user -h IP -p -D db
psql -U user -h IP -d db
Befehlsausführung
ohne Login
mysql -u user -h IP -p -D db -e "select * from tabelle;"psql -U user -h IP -d db -c "select * from schema.tabelle;"
Auflistung Datenbankenshow databases;\l+
Auflistung Tabellenshow tables;\dt+
Kontext Datenbankuse database;\c db
Beschreibung Tabelledescribe table;\d+ table
Auflistung Schemasshow schemas;\dn+
Postgresql: Tabellen werden mit \dt in Bezug auf Schema und Suchpfad aufgelistet. Als Standard ist nur der Suchpfad "public" eingestellt. Der Suchpfad kann temp. mit "SET search_path TO schema1,schema2,public" oder dauerhaft durch "alter database db set search_path = schema1,schema2, public;" eingestellt werden.

Obacht mit Großschreibung im Schema! Ein Schema mit Großschreibung im Suchpfad, wird in Kleinbuchstaben gespeichert. Das Schema ist als String zu maskieren!

Die Zukunft ist rosig!

Wenn ich von der Digitalisierung in der Presse lese und die Realität betrachte, bin ich geradezu berauscht.

Was bedeutet eigentlich Digitalisierung? Damit ist nicht gemeint, einen Brief mit WORD zu verfassen oder die Kaffeekasse mit EXCEL zu verwalten.

Digitalisierung ist die Umsetzung von Arbeitsprozessen mit Hilfe der Digitaltechnik. Oft einhergehend mit enormer Effektivitätssteigerung und höherer Kosteneffizienz.

Darüber diskutieren heute, im 21ten Jahrhundert in Deutschland, lediglich die „Falschen“. IT Berater wird man schon mit MBA Titel, also als Betriebswirt der einen Computer einschalten kann, ohne sich die Fingernägel abzubrechen- aus Sicht eines IT’lers, also mit völliger Ahnungslosigkeit. Diese Berater sitzen dann, wohlmöglich mit Beamten und Ministern, tagelang an hochglanz gelackten Tischen, bekommen Kaffee und Cremetörtchen gereicht, und „erdenken“ sich Konstrukte die fernab der Realität und völlig am Thema vorbei sind. Liegt dann das Gewölle in Form eines „Konzeptes“ ( oft für sechs bis sieben stellige Kosten ) vor, kam bisher selten etwas Gutes dabei herum. Jüngst denken wir nur einmal über die Gesundheitsakte, dem Personalausweis, der Impfkampagne , dem eGovernment oder Zensus2022 nach. Völliges Versagen auf ganzer Linie.

Wie im Großen, geht es auch auf kommunaler Ebene. Einfaches Beispiel: Terminvereinbarung beim Einwohnermeldeamt.

Wuppertal und Bergisch Gladbach sind keine Ausnahmen – Berlin ist da negatives Aushängeschild. Die einfachste Dinge, sind schlicht nicht möglich.

Die Kollegen bei der Stadt Bergisch Gladbach kenne ich persönlich – fachlich wäre diese sehr einfache Aufgabe kein Problem. Es ist schlich die fehlende Kompetenz bei der Planung und der Wille. Papua Neuguinea oder Simbabwe machen es uns vor – da geht das.

So lange das so ist, brauchen sich Generationen von IT’lern keine Sorge machen – Arbeit ist genug da

Tipp: Anpassung Script nach StableNet Update

Nach dem Update von StableNet von Version 10 auf 11 kann es zu Problemen mit sh Agent Scripts kommen.

Die Agent Scripts werden im neuen StableNet vor Aufruf (genauer) geprüft – sh Scripte wohl bemerkt. Der Parameter „Name“ darf nicht fehlen!

sh Script für StableNet Agent

Im StableNet 10 reichte es aus, wenn das sh Script als <parameters> lediglich <version> mitteilte. Jetzt ist auf einen belibigen <name> zu achten.

Grundsätzlich sind Änderungen im XML Schema bzgl. Business Process Scripts ergangen – unter Umständen erscheinen bei JAR Agent Scripts die Fehlermeldung „Attribute default is not allowed“ was dann in jedem AgentScript anzupassen ist.

Die MariaDB nicht auf die höchst mögliche Version updaten. Maximal Version 10.5.13. NICHT 10.5.16

Abgesehen davon läuft das Update einwandfrei.

Datei Säuberungsaktion

Eine Unart ist es, Sonderzeichen in Datei- oder Ordnernamen zu vereinbaren.

Der Grund ist mir nicht klar. User, eben.

Sonderzeichen sind häufig ein Grund für seltsame Fehler, wenn es um die
Verarbeitung von Dateien geht. Dateinamen mit Sonderzeichen oder Umlauten
lassen sich auf Anwenderebene problemlos vereinbaren – mit Einschränkungen.
Linux mag keine Komma oder Semikolon, Windows verträgt keine | im Namen.

Kurz: Vor der Verarbeitung, insbesondere Datenarchivierung, sollte das
entfernt werden.

Mittels find /dir -type f *[üÜöÖäÄß]* -exec sed.. usw. kann man alle Fehler
nach eigenem Gusto beheben.

Tipp: Einfacher, schneller und fehlerfrei ist detox. Leider nicht in jeder
Distribution enthalten. Debian ist kein Problem – RedHat verwaist auf RPM aus
Fremdquellen.

Hat jemand schönere Lösungen?

tar: Archive anlegen

Den Tape Archiver nutze ich ständig – für alles mögliche. Zahlreiche Möglichkeiten der Anwendung gibt es.

Vor geraumer Zeit war das auch Thema im CCGL (Link) – wie nutze ich TAR um Archive verschlüsselt auf einem öffentlichen Laufwerk zu sichern.

Zahlreiche Varianten neben TAR/aespipe/split nutze ich. Eine weitere und sicherere Art ist es, TAR in Kombination mit OpenSSL zu nutzen. Zunächst aber das Handling.

Im CCGL haben wir TAR als Stream durch „split“ in kleinere Pakete zerteilt. Das kann TAR auch alleine:

tar -cvML 1945600 -V Testlauf  –files-from=tarliste.txt -F ‚echo sicherung/${TAR_ARCHIVE}-${TAR_VOLUME} >&${TAR_FD}‘ -f test.tar

Wir sehen, analog zum Beispiel im Link, ein Multi-Volume (M), begrenzt auf eine Bandlänge (L) von 1.9GB. Ohne das Script (F) würde der Befehl zum Wechseln des Mediums auffordern, wenn eine Menge von 1.9GB geschrieben wurde. Die Datei, die wir anstatt Band mit (f) konfiguriert haben, wird zur Laufzeit im Parameter TAR_FD (File Descriptor) gehalten und mit dem Script bei jedem „Bandwechsel“ neu gesetzt. Coole Sache! Aus test.tar wird nach den ersten 1.9GB dann 2-test.tar. Mit „V“ setzte ich gerne Label – vergleichbar mit dem Aufkleber den wir früher auf die Band Rollen oder Disketten geklebt haben.

Versuchen wir den Inhalt darzustellen, ohne zu Wissen das es sich um ein Multi Volume Archiv handelt:

Man erkennt die Problematik? Sicherlich wenn man das ganze mit dem Multi Volume Script sieht:

Das Archiv wird nahtlos und vollständig aufgelistet. Es wird nur das Label des ersten Archivs aufgeführt.

Wenn ich Zeit finde, zeige ich wie ich das in meinem jetzigen Projekt gelöst habe und wie man das Archiv verschlüßelt ablegt.

fstab: auf richtige UID/GID achten

Kleiner Tipp am Rande:

Es ist gute Sitte, beim mounten von Freigaben eine UID nebst GID zu konfigurieren. Die Distributionen halten dazu eine kleine Falle bereit: Debian und RedHat vergeben im Standard >= 1000 für GID’s und >= 1000 für UID’s.

OpenSuse (Leap) oder SLES beginnen bei der Vergabe der GID bei 100!

Versucht man dann zB. ein WebDAV Laufwerk mit der GID 1000 zu mounten, kommt es zum Fehler: getuid() –> exit_group(1) , da die Gruppe in SLES >= 100 bekommen hat.