web-dev-qa-db-fra.com

Syntaxe ansible pour regex_search utilisant une variable pour correspondre

Quelle est la syntaxe dans regex_search () pour correspondre à une variable?

Pour ci-dessous, vcsourcekit = 10, je veux faire correspondre regex ^ 10. Il n'évalue pas la variable, interprète plutôt littéralement.

- name: Do something awesome
  vmware_guest:
  hostname: "{{ vcenterhostname }}"
  ...

 when:
      - item.key | regex_search('^(vcsourcekit)')
 with_dict: "{{ vmfacts.virtual_machines }}"

Merci!

4
jacksonp

Pas la plus belle chose mais ça marche:

- item.key | regex_search('^' + vcsourcekit | string)

Sans la conversion en chaîne, j'obtiens un cannot concatenate 'str' and 'int' objects sur ansible 2.2.0.0 et je n'ai pas le temps de mettre à jour tout de suite.

3
jscott

Cette concaténation fonctionne sans casting:

when:
      - item.key | regex_search('^(' ~ vcsourcekit ~ ')')
 with_dict: "{{ vmfacts.virtual_machines }}"

(Testé dans Ansible 2.5.6)

2
Timm

Ce code:

tasks:
- set_fact: 
    keytype: ed25519

- set_fact: 
    matchstring: ".*_{{ keytype }}_.*"

- debug:
    var: item
  with_fileglob: "/etc/ssh/ssh_Host_*_key"
  when: not item is match(matchstring)

sélectionne juste/etc/ssh/ssh_Host_ed25519_key qui semble analogue à l'exigence de l'OP. Il semble que "match" nécessite un modèle qui corresponde à la chaîne entière, d'où le *. avant et après cette chaîne à faire correspondre.

Deux strophes "set_fact" distinctes sont nécessaires pour que "keytype" soit défini avant d'être utilisé.

Le code fonctionne dans Ansible 2.4.3.0 fonctionnant sur Debian 9 (Raspbian "Stretch").

Ma demande exigeait "pas" dans la déclaration "quand" mais elle ne serait pas nécessaire pour répondre à la question d'origine.

Pour le PO, l'énoncé critique semble être:

matchstring: "^vcsourcekit.*"

Clairement trop tard pour aider le PO, mais l'approche pourrait aider quelqu'un d'autre.

1
user8150417

Personnellement, j'utiliserais quelque chose comme

- item.key | regex_search('^%d' % vcsourcekit)

Ceci n'est pas testé BTW. Je ne suis pas sûr non plus qu'il soit compatible avec les meilleures pratiques Ansible/Jinja2.

EDIT: Un de ceux-ci (également non testé) pourrait être plus correct.

- item.key | regex_search('^{0}'.format(vcsourcekit))

- item.key | regex_search('^%d' | format(vcsourcekit))
0
Rory Browne