La variable spéciale ansible_role_names
contient un tableau avec des noms de rôles dans mon jeu. Par exemple
"roles": [ "nfs", "openssh", "bootstrap", "squid" ]
Cette liste à laquelle je veux accéder est cependant cette liste avec tout ce qui est avant le point supprimé.
"ansible_role_names": [ "geerlingguy.nfs", "ANXS.openssh", "robertdebock.bootstrap", "robertdebock.squid" ]
3 Réponses :
Vous pouvez l'obtenir en utilisant le filtre split
:
- debug: msg: "{{ item.split('.')[-1] }}" loop: "{{ ansible_role_names }}"
Construire sur la réponse @Arbab Nazar: diviser les chaînes sur des points et utiliser l'index 1
sur la liste résultante peut casser à certaines occasions.
l'objet de liste n'a pas d'élément 1
L'utilisation de -1
comme index (par exemple le premier élément à partir de la fin) résoudra ces deux problèmes potentiels comme dans l'exemple suivant:
TASK [debug] ************************************************************************************************************************************************************************************************************************************************************ ok: [localhost] => (item=simplerole) => { "msg": "simplerole" } ok: [localhost] => (item=classic.galaxyrole) => { "msg": "galaxyrole" } ok: [localhost] => (item=non.standard.customrole) => { "msg": "customrole" }
Ce qui donne le résultat suivant:
- debug: msg: "{{ item.split('.')[-1] }}" loop: - simplerole - classic.galaxyrole - non.standard.customrole
Q: "Comment manipuler chaque élément d'un tableau lors de l'utilisation d'Ansible?"
R: Il est possible de
mapper
le filtre regex_replace . Par exemple, le jeu"my_list": [ "nfs", "openssh", "bootstrap", "squid" ]donne
- set_fact: my_list: "{{ ansible_role_names| map('regex_replace', regex, replace)| list }}" vars: regex: '^(.*)\.(.*)$' replace: '\2' - debug: var: my_list
regex: '^ ( . *) \. (. *) $ '
^
correspond au début de la chaîne(. *)
correspond à n'importe quel caractère du groupe de capture n ° 1\.
correspond à.
(. *)
correspond à n'importe quel caractère du groupe de capture n ° 2$
correspond à la fin de la chaîne
remplacer: '\ 2'
\ 2
correspond au groupe de capture n ° 2 précédemment défini
Je passe juste 4 heures à trouver une solution au même problème. Jamais entendu parler de regex + replace args. Cela a également résolu mon problème, merci!