web-dev-qa-db-fra.com

Filtrer une sous-chaîne correspondant à un motif d'une variable ansible et affecter une sous-chaîne correspondante à une autre variable

Disons que nous avons une longue variable de chaîne ansible mystr. Nous avons un modèle d'expression régulière dire substr_pattern et une sous-chaîne correspondant à ce modèle doit être filtrée de mystr et être affectée à une autre variable substr. Il ne semble pas y avoir de moyen évident de le faire en ansible à partir des documents sur playbook_filters bien qu'il soit simple de le faire avec le module re dans python lui-même.

Il existe 3 méthodes données dans la documentation ansible et aucune ne semble résoudre mon problème:

  1. match: ce filtre renvoie vrai/faux selon que le motif entier correspond à la chaîne entière mais ne renvoie pas le groupe/sous-chaîne correspondant.

  2. search: utilisé pour filtrer les substr dans une chaîne plus grande. Mais comme match, retourne uniquement vrai/faux et non groupe/sous-chaîne correspondant qui est nécessaire ici.

  3. regex_replace: Ceci est utilisé pour remplacer un modèle correspondant dans une chaîne par une autre chaîne. Mais il n'est pas clair comment enregistrer la sous-chaîne/le groupe correspondant au modèle correspondant dans une nouvelle variable.

Y a-t-il quelque chose qui me manque? Ou est-ce une fonctionnalité manquante dans ansible?

Version Ansible: 2.1

Exemple:

mystr: "This is the long string. With a url. http://example.org/12345"
pattern: "http:\/\/example.org\/(\d+)"
substr: 12345   # First matched group i.e. \\1

Résumé: Comment obtenir la sous-chaîne correspondant au pattern de mystr et l'enregistrer dans une variable ansible substr?

10
Pranjal Mittal

Si vous pouvez modifier le modèle, vous pouvez utiliser le regex_replace filtre et remplace toute la chaîne par les seuls chiffres correspondants.

mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')

Pour affecter le résultat à une nouvelle variable, vous pouvez utiliser le set_fact module.

- set_fact:
    substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"
18
udondan