2
votes

Comment manipuler chaque élément d'un tableau lors de l'utilisation d'Ansible

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"
]


0 commentaires

3 Réponses :


2
votes

Vous pouvez l'obtenir en utilisant le filtre split :

- debug:
    msg: "{{ item.split('.')[-1] }}"
  loop: "{{ ansible_role_names }}"


0 commentaires

2
votes

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.

  • Si le nom de votre rôle ne contient pas de point (assez courant pour les rôles locaux), vous obtiendrez une erreur avec une variable non définie => l'objet de liste n'a pas d'élément 1
  • Dans le cas (peu probable ...) de votre rôle comporte plusieurs points dans son nom, vous obtiendrez toujours le deuxième élément de la chaîne, pas le dernier

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


0 commentaires

4
votes

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

1 commentaires

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!