2015-05-23 18 views
9

HALLO ich bin neu in jinja2 verwenden und versuchen, reguläre Ausdrücke zu verwenden, wie untenregex in Jinja 2 für ansible Playbooks

{% if ansible_hostname == 'uat' %} 
    {% set server = 'thinkingmonster.com' %} 

{% else %} 
    {% set server = 'define yourself' %} 
{% endif %} 

{% if {{ server }} match('*thinking*') %} 
    {% set ssl_certificate = 'akash' %} 

{% elif {{ server }} match('*sleeping*')%} 
    {% set ssl_certificate = 'akashthakur' %} 
{% endif %} 

auf den Wert von „Server“ basierte gezeigt Ich möchte als die Bescheinigungen bewerten, benutzen. dh, wenn die Domäne ein "denkendes" Schlüsselwort enthält, dann benutze diese Zertifikate und wenn es ein "schlafendes" Schlüsselwort enthält, benutze dieses Zertifikat.

Aber fand keinen jinja2 Filter, der dies unterstützt. Bitte helfen Sie mir.Ich fand etwas Python-Code und sicher, dass das funktionieren kann, aber wie python in jinja2-Vorlagen zu verwenden?

+0

Nur um sicher zu machen, dass ich richtig verstehen: Sie wollen einen Filter haben das einen Wert abbildet, nach welchem ​​Regex es übereinstimmt? – bereal

+0

@bere ja, dass was ich alle will.Aber nicht möglich – thinkingmonster

+0

{% if {{server}} entspricht ('* thinking *')%} {% set ssl_certificate = 'akash'%} wenn Wert von dienen enthält Denken Schlüsselwort dann Wert von ssl_certificate sollte 'akash' sein – thinkingmonster

Antwort

3

So nach für lange Zeit googeln und mit der Hilfe von einigen hier Blogger ist die endgültige Lösung zu meinem Problem: -

1. Jinja2 wird jeden Filter nicht mit für die Suche nach Unterkette oder regexp so nur Lösung war, einen benutzerdefinierten Filter zu erstellen Ich habe die folgenden Schritte ausgeführt, um mein Problem zu beheben.

2. Innenstammverzeichnis meines Textbuch, habe ich ein Verzeichnis „filter_plugins“ und schrieb benutzerdefinierten Modul in Python und platziert die Datei in diesem Verzeichnis. Der Name der Python-Datei kann alles sein. Mein Python-Code sieht wie folgt:

__author__ = 'akthakur' 
class FilterModule(object): 
    ''' Custom filters are loaded by FilterModule objects ''' 

    def filters(self): 
     ''' Filter Module objects return a dict mapping filter names to filter functions. ''' 
     return { 
      'substr': self.substr, 
     } 

     ''' def substr(self, check,checkin): 
     return value1+value2''' 
    def substr(self,check,checkin): 
     if check in checkin: 
      return True 
     else: 
      return False 

3. nun einmal diese Datei unsere neue Filter erstellt wird „substr“ bereit ist, verwendet werden und kann innerhalb Vorlage verwendet werden, wie unten dargestellt:

{% if 5==5 %} 
{% set server = 'www.thinkingmonster.com' %} 
{% endif %} 
{% if 'thinking' | substr(server) %} 
    {% set ssl_cert = 'abc.crt'%} 
{% endif %} 
+1

Bitte beachten Sie, dass diese Antwort ziemlich veraltet ist, gibt es Regex Filter in Ansible jetzt: http://docs.ansible.com/ansible/latest/playbooks_filters.html#regular-expression-filters – Dominik

1

Meines Wissens gibt es keinen eingebauten Filter für das in Jinja2 weder unter ansible der extra filters, aber es ist keine große Sache, Ihre eigenen zu machen:

certs = {'.*thinking.*': 'akash', '.*sleeping.*': 'akashthakur'} 
def map_regex(value, mapping=certs): 
    for k, v in mapping.items(): 
     if re.match(k, value): 
      return v 

Dann werden Sie hinzufügen müssen, um eine filter plugin zu Ansible, so dass es die obige Funktion in Templates verwenden wird (wie {{server|ssl_cert}}, wenn Sie den Filter ssl_cert benennen).

Das heißt, eine einfache alte Funktion oder ein einfaches altes Wörterbuch, das an die Vorlagen übergeben und dort explizit verwendet wird, könnte dieser Aufgabe besser entsprechen.

10

Jinja2 kann ganz einfach Subtr Checks mit einem einfachen 'in' Vergleich, z

{% set server = 'www.thinkingmonster.com' %} 
{% if 'thinking' in server %} 
    do something... 
{% endif %} 

So ist Ihr Teilstring Regex-Filter nicht erforderlich. Allerdings, wenn Sie erweiterte Regex Matching wollen, dann sind in der Tat Filter in ansible verfügbar - sehen Sie die Regex-Filter in http://docs.ansible.com/playbooks_filters.html#other-useful-filters - komischerweise, Ihre Match-Syntax oben ist fast genau richtig.

+1 für Bereal's answer obwohl es eine schöne Alternative in Form einer Karte gibt.

2

In Ansible> 1 ist ein "regex_replace" -Filter verfügbar.6

Other Useful Filters Scroll down und Sie werden sehen:

Neu in der Version 1.6.

Um Text in einer Zeichenfolge mit Regex zu ersetzen, verwenden Sie die „regex_replace“ Filter:

# convert "ansible" to "able" 
{{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }} 

# convert "foobar" to "bar" 
{{ 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }} 

# convert "localhost:80" to "localhost, 80" using named groups 
{{ 'localhost:80' | regex_replace('^(?P<host>.+):(?P<port>\\d+)$', '\\g<host>, \\g<port>') }} 

aber sagt, dass regex ist übertrieben für eine Lösung für dieses besondere Problem zu finden.

2

Es gibt einige (derzeit) nicht dokumentiert Filter in ansible 2.1, die tun können, was Sie brauchen:
Ansible plugins/filter.core.py

Der regex_search Filter wird eine Regex auf der Saite und die daraus gewonnenen Ergebnisse Spiel durchzuführen. Etwas ähnliches wie dies funktionieren würde und innerhalb einer ansible Rolle enthalten sein:

{% set server = 'www.thinkingmonster.com' %} 
{% if regexp_search(server, 'thinking') %} 
    do something... 
{% endif %} 

Es gibt auch ein regex_findall Filter, der ein Python führt findAll statt regex suchen.

Review the original pull request for further information

+0

Wenn Sie versuchen, diese Technik mit Ansible 2 zu verwenden.2 Ich bekomme 'AnsibleUndefinedVariable: 'regex_search' ist undefined' –

+0

Mein schlechtes. Ich benutzte Ansible 2.1 und 'regex_search' ist verfügbar von 2.2 –

+0

regex_search wurde in der [2.1.0.0 build] veröffentlicht (https://github.com/ansible/ansible/blob/v2.1.0.0-1/lib/ ansible/plugins/filter/core.py) –

1

Das ist ziemlich hässlich, aber es funktioniert wie 1.6.

{% if server|regex_replace('.*thinking.*','matched') == 'matched' %} 
    {% set ssl_certificate = 'akash' %} 

{% elif server|regex_replace('.*sleeping.*','matched') == 'matched' %} 
    {% set ssl_certificate = 'akashthakur' %} 
{% endif %} 
1

Dank Steve E. Hinweis, ich habe einen Weg gefunden, regex in einer Vorlage Bedingung hinzuzufügen:

{% if server | regex_search('thinking') %} 
.... 
{% endif %} 
Verwandte Themen