utilisation de regex dans jinja 2 pour les livres de jeu accessibles

Salut je suis nouveau à jinja2 et j'essaie d'utiliser l'expression régulière comme montré ci-dessous

{% 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 %}

basé sur la valeur de "server" je voudrais évaluer comme Quels certificats utiliser. ie si le domaine contient le mot-clé" thinking "alors utilisez ces certificats et s'il contient le mot-clé" sleeping " alors utilisez ce certificat.

mais n'a pas trouvé de filtre jinja2 supportant ceci. S'il vous plaît aider moi.J'ai trouvé du code python et sûr qui peut fonctionner, mais comment utiliser python dans jinja2 modèles?

10
demandé sur thinkingmonster 2015-05-23 17:05:09

7 réponses

Jinja2 peut très facilement effectuer des contrôles substr avec une simple comparaison 'in', par exemple

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

ainsi votre filtre de regex de soustraction n'est pas nécessaire. Cependant, si vous voulez une correspondance regex plus avancée, alors il y a en fait les filtres disponibles dans ansible-voir les filtres regex dans http://docs.ansible.com/playbooks_filters.html#other-useful-filters - assez curieusement, votre syntaxe de correspondance ci-dessus est presque exactement correcte.

+1 pour Bereal de l' répondre à si, il donne une belle alternative sous la forme d'une carte.

12
répondu Halberom 2017-05-23 12:00:31

il y a un filtre" regex_replace " disponible dans Ansible>1.6

Autres Filtres Utiles Faites défiler vers le bas et vous verrez ceci:

Nouveau dans la version 1.6.

pour remplacer le texte d'une chaîne par regex, utilisez le filtre "regex_replace":

# 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>') }}

cela dit, regex est surmené pour trouver une solution à ce problème particulier.

3
répondu saranicole 2016-08-16 18:23:30

merci à Steve E. hint, j'ai trouvé un moyen d'ajouter regex dans un template condition:

{% if server | regex_search('thinking') %}
....
{% endif %}
3
répondu Alexander Svetkin 2017-02-07 10:52:57

donc après avoir cherché sur Google pendant longtemps et avec l'aide de quelques blogueurs voici la solution finale à mon problème: -

1. Jinja2 n'a pas de filtre pour trouver la sous-chaîne ou regexp, donc la seule solution était de créer un filtre personnalisé. J'ai suivi les étapes ci-dessous pour résoudre mon problème.

2. dans le répertoire racine de mon playbook, j'ai créé un répertoire "filter_plugins" et a écrit une coutume module en python et placé le fichier dans ce répertoire. Le nom du fichier python peut être n'importe quoi. Mon code python se présente comme suit:

 __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. une fois ce fichier créé notre tout nouveau filtre "substr" est prêt à utiliser et peut être utilisé à l'intérieur des modèles comme indiqué ci-dessous:

{% if 5==5 %}
 {% set server = 'www.thinkingmonster.com' %}
{% endif %}
{% if 'thinking' | substr(server) %}
   {% set ssl_cert = 'abc.crt'%}
{% endif %}
3
répondu thinkingmonster 2018-08-08 01:00:57

Il y a quelques (actuellement) sans-papiers filtres dans Ansible 2.1 qui peut faire ce que vous avez besoin de:

Ansible plugins/filter.core.py

regex_search filter effectuera un regex sur la chaîne et retournera la correspondance résultante. Quelque chose de semblable fonctionnerait et serait contenu dans un rôle possible:

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

Il y a aussi un regex_findall filtre qui effectue une recherche Python findall au lieu de regex.

examiner la demande originale de renseignements supplémentaires

2
répondu Steve E. 2016-10-10 23:51:01

a ma connaissance, il n'y a pas de filtre intégré pour cela dans Jinja2 ni parmi les filtres supplémentaires, mais ce n'est pas une grosse affaire à faire votre propre:

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

alors vous devrez ajouter un filtre plugin pour Ansible, de sorte qu'il va utiliser la fonction ci-dessus dans les templates (comme {{server|ssl_cert}} si vous nommez le filtre