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
mapperle 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'
\ 2correspond 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!