Seite wählen

NETWAYS Blog

Ansible – should I use omit filter?

When we talk about Ansible, we more and more talk about AWX or Tower. This Tool comes in handy when you work with Ansible in a environment shared with colleagues or multiple teams.
In AWX we can reuse the playbooks we developed and share them with our colleagues on a GUI Platform.

Often we need a bit of understanding how a playbook is designed or if a variable need to be defined for the particular play. This can be much more tricky when sharing templates to people unaware of your work.

This is where the omit filter can be used. The easiest way to explain this, if the variable has no content or isn’t defined, omit the parameter.

The following example is an extract from the documentation:


- name: touch files with an optional mode
  file:
    dest: "{{ item.path }}"
    state: touch
    mode: "{{ item.mode | default(omit) }}"
  loop:
    - path: /tmp/foo
    - path: /tmp/bar
    - path: /tmp/baz
      mode: "0444"

In AWX we can create surveys, those are great to ask a few questions and provide a guide on how to use the underlying play. But often we need to choose between two variables whether one or another action should happen. Defined by the variable in use. If we leave one of both empty, Ansible will see those empty as defined but „None“ (Python null) as content.

With the omit filter we can remove the parameter from the play, so if the parameter is empty it won’t be used.

The following code is the usage of icinga2_downtimes module which can create downtimes for hosts or hostgroups but the parameters cannot be used at the same time. In this case I can show the variable for hostnames and hostgroups in the webinterface. The user will use one variable and the other variable will be removed and therefore no errors occur.


- name: schedule downtimes
  icinga2_downtimes:
    host: 
    username: icinga_downtime
    password: "{{ icinga_downtime_password }}"
    hostnames: "{{ icinga2_downtimes_hostnames | default(omit) }}"
    hostgroups: "{{ icinga2_downtimes_hostgroups | default(omit) }}"
    all_services: "{{ icinga2_downtimes_allservices | default(False) }}"

The variables shown in the AWX GUI on the template.

This filter can be used in various other locations to provide optional parameters to your users.

If you want to learn more about Ansible, checkout our Ansible Trainings or read more on our blogpost.

Thilo Wening
Thilo Wening
Manager Consulting

Thilo hat bei NETWAYS mit der Ausbildung zum Fachinformatiker, Schwerpunkt Systemadministration begonnen und unterstützt nun nach erfolgreich bestandener Prüfung tatkräftig die Kollegen im Consulting. In seiner Freizeit ist er athletisch in der Senkrechten unterwegs und stählt seine Muskeln beim Bouldern. Als richtiger Profi macht er das natürlich am liebsten in der Natur und geht nur noch in Ausnahmefällen in die Kletterhalle.

Parametrisierte Klassen mit Foreman

Wenn in den Einstellungen Parametrized_Classes_in_ENC für Puppet auf true gesetzt ist, unterstützt Foreman parametrisierte Klassen. Weitere Grundvoraussetzung ist außerdem das Foreman einen Puppetmaster als Smart Proxy angebunden hat und auf dessen Puppetmodule zugreifen kann.
Somit können die Puppet Klassen vom Puppetmaster importiert werden:
Bildschirmfoto vom 2014-04-28 07:23:03
Innerhalb einer Klasse kann Foreman sich bei den Parametern dann über die Klassenvorgabe hinwegsetzen (= „Override“). Wie im folgenden Beispiel anhand der Klasse ntp mit dem Parameter servers gezeigt, empfiehlt es sich entsprechende Standardvorgaben zu setzen:
Bildschirmfoto vom 2014-04-28 07:38:03
Ergänzend dazu können für einzelne Hosts über FQDN, Hostgruppe oder anderen Kriterien abweichende Werte festgelegt werden. Foreman bietet dazu an verschiedenen Stellen des Webinterfaces Möglichkeiten dies zu tun.
Bildschirmfoto vom 2014-04-28 07:45:41
Nebenan ein exemplarisches Beispiel für geänderte NTP-Server innerhalb der Puppet Klasse.
Hier werden für die Hostgruppen CentOS und Debian abweichende Werte hinterlegt. Bei Systemen die keine Zuordnung zu den beiden Hostgruppen haben, greift die zuvor gesetzte Standardvorgabe.
Wichtig ist zudem das die jeweilige Puppet Klasse den entsprechenden Hosts auch zugewiesen wird. Auch dies kann bei Foreman an verschiedenen Stellen, z.B. direkt im Host oder der Hostgruppe, erfolgen.
Mit parametrisierten Klassen über Foreman ist es somit möglich individuelle Konfigurationen unabhängig von site.pp & Co. zu definieren und diese an zentraler Stelle übersichtlich zu verwalten.

Markus Waldmüller
Markus Waldmüller
Head of Strategic Projects

Markus war bereits mehrere Jahre als Sysadmin in Neumarkt i.d.OPf. und Regensburg tätig. Nach Technikerschule und Selbständigkeit ist er nun Anfang 2013 bei NETWAYS als Senior Manager Services gelandet. Seit September 2023 kümmert er sich bei der NETWAYS Gruppe um strategische Projekte. Wenn er nicht gerade die Welt bereist, ist der sportbegeisterte Neumarkter mit an Sicherheit grenzender Wahrscheinlichkeit auf dem Mountainbike oder am Baggersee zu finden.

Puppet: Iteration um Defined Resources anzulegen

Was wohl jeder schon einmal mit Puppet getan hat, mehrere Resources oder auch Defined Resources mit einer Iteration über ein Array anzulegen, ist eine relativ leichte Übung:

define foo::bar($arg1, ..., $argN) {
   ...
}
foo::bar { ['one', 'two', 'three']:
   arg1 => value1,
   ...
   argN => valueN,
}

Ein nicht unerheblicher Nachteil ist hier natürlich, dass die Parameter arg1, …, argN für die anzulegenden Defined Resources gleich sind. Möchte man unterschiedliche Parameter verwenden, ist dies unter Zuhilfenahme der Funktion create_resources realisierbar.
Als Parameter erwartet die Funktion den Typ foo::bar und einen Hash of Hashes $hash, der jeweils den Titel der Defined Resource enthält und die jeweilige Parameterzuweisung.

define foo::bar($arg1, ..., $argN) {
   ...
}
$hash = {
   'one' => { arg1 => value1, ..., argN => valueN, },
   'two' => { arg1 => valueN+1, ..., argN => valueN+N, },
   ...
}
create_resources( foo::bar, $hash )
Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.

Jasper Reporting – Gruppierung von Daten

Jasper-ReportingDa endlose Listen von Informationen mit Host- und Service die evtl. notwendigen Schlussfolgerungen aus einem Report erschweren ist sowohl die optische Aufbereitung als auch Gruppierung der Daten sehr wichtig. Der oberste Grundsatz bei der Erstellung von Reports sollte immer Qualität vor Quantität sein. Wer auf den ersten Seiten keine nützlichen Informationen finden kann wird sich den Rest nicht antun, außer er hat keine andere Wahl. Mir ist zwar bewusst, dass gerade die ersten Beispielreports dieser Serie genau dieses Problem haben, aber wir müssen ja erstmal den Einstieg finden.
Die Gruppierung der Hostelemente aus der Datenbank starten wir mit einer Anpassung des Select-Statements:
[code lang=“sql“]
select c.alias,
a.host_object_id,
a.display_name,
a.address
from nagios_hosts a,
nagios_hostgroup_members b,
nagios_hostgroups c
where a.host_object_id = b.host_object_id
and b.hostgroup_id = c.hostgroup_id
and a.instance_id = 1
and b.instance_id = 1
and c.instance_id = 1
and display_name like $P{p_hostgroup}
[/code]
Anschließend müssen wir den vorhandenen Report-Parameter noch umbenennen, damit er zum verwendeten SQL-Parameter passt und das neue Feld c.alias in den Report einfügen.


Im Report Inspector ist dann im Menü „Add Report Group“ eine neue Gruppe zum Bericht hinzuzufügen. Der Name kann willkürlich vergeben werden, sollte aber den fachlichen Inhalt der Gruppe beschreiben, da er auch Grundlage für die daraus entstehenden Detailbänder ist. Als Group Expression verwenden wir c.alias, da dies das entsprechende Unterscheidungskriterium für den Gruppenwechsel darstellt.
Nach Anlage der Gruppe, kann dann in den neu entstandenen Detailbereichen noch die Positionierung von Überschriften, Beschreibungen oder Anzeige der neuen Gruppe erfolgen. Der ganze Report sieht dann so aus und kann wie immer auf dem Demo-System live gestestet werden. Auf netways.org gibt es wieder die Vorlage für die eigene Weiterentwicklung.
Natürlich kommt kein guter Bericht ohne Tortengrafik aus. Um das optische Feintuning fortzuführen, fügen wir im nächsten Post dieser Serie eine Torte hinzu. Hmmm lecker.

Bernd Erk
Bernd Erk
CEO

Bernd ist Geschäftsführer der NETWAYS Gruppe und verantwortet die Strategie und das Tagesgeschäft. Bei NETWAYS kümmert er sich eigentlich um alles, was andere nicht machen wollen oder können (meistens eher wollen). Darüber hinaus startete er früher das wöchentliche Lexware-Backup, welches er nun endlich automatisiert hat. So investiert er seine ganze Energie in den Rest der Truppe und versucht für kollektives Glück zu sorgen. In seiner Freizeit macht er mit sinnlosen Ideen seine Frau verrückt und verbündet sich dafür mit seinen beiden Söhnen und seiner Tochter.

Jasper Reporting – Parameter

Jasper-ReportingDie Erzeugung des Reports erfolgt meist ja für mehrere Rechner, Kunden, Abteilungen oder im Falle von Nagios für diverse Host- und Servicegruppen. Um entsprechende Parameter verarbeiten zu können, müssen diese erst im Report definiert und natürlich auch bei der Ermittlung der Daten im SQL-Statement berücksichtigt werden.
Wir starten mit der Anpassung des Select-Statements um die Daten auf den in diesem Beispiel verwendeten Host einzuschränken.
[code lang=“sql“]
select
host_object_id,
display_name,
address
from nagios_hosts
where instance_id = 1
and display_name like $P{p_host_name}
[/code]
Parameter werden immer in geschweifte Klammern mit einem $P gefasst. Eine Übersicht über die entsprechenden Typbezeichner gibt es im entsprechenden Property-Editor.
post6_screen1
Der Paramter muss natürlich im Report „bekannt“ gemacht werden, was über das Parameterfeld im Reports-Inspector erfolgt. Der Defaultwert für den Parameter sollte in unserem Beispiel „%“ sein, um bei fehlender Parametrisierung alle Hosts zu ermitteln.
post6_screen2
Damit der Benutzer bei der Ausführung des Reports zur Eingabe eines Hostnames aufgefordert wird, muss dieser auch auf dem Server erzeugt werden, was unterhalb der aktuellen Report-Unit im Folder Input controls via Kontextmenü erfolgen kann.
post6_screen4Im Eigenschaftsbereich des Webinterfaces wiederum kann der Anwender noch die Verwendung aktivieren bzw. deaktivieren und das Layout des Parameteraufrufs beeinflussen.
Das Parameterübergabe kann in der Live-Demo als Nagios_Host_3 getestet werden. Die verwendeten Daten basieren auf unserem Nagios-Demo-System, wodurch die vorhandenen Hosts dort eingesehen werden können.

Bernd Erk
Bernd Erk
CEO

Bernd ist Geschäftsführer der NETWAYS Gruppe und verantwortet die Strategie und das Tagesgeschäft. Bei NETWAYS kümmert er sich eigentlich um alles, was andere nicht machen wollen oder können (meistens eher wollen). Darüber hinaus startete er früher das wöchentliche Lexware-Backup, welches er nun endlich automatisiert hat. So investiert er seine ganze Energie in den Rest der Truppe und versucht für kollektives Glück zu sorgen. In seiner Freizeit macht er mit sinnlosen Ideen seine Frau verrückt und verbündet sich dafür mit seinen beiden Söhnen und seiner Tochter.