Bonne façon de créer des listes dynamiques dans Ansible
Je suis à la recherche pour obtenir des conseils. J'ai le code suivant qui permet de créer une liste dynamiquement que je peux ensuite l'utiliser plus tard dans un modèle.
C'est une copie du code de test j'ai mis en place - pour le rôle réel j'ai juste ajouté les admins|regex_replace variable dans le j2 modèle.
---
- hosts: localhost
gather_facts: false
vars:
# define empty admins var first so ansible doesn't complain
admins:
admin_accounts:
- name: john
uid: 1000
group: sysadmin
shell: /bin/bash
comment: "Unix Administrator"
- name: paul
uid: 1001
group: sysadmin
shell: /bin/bash
comment: "Unix Administrator"
- name: george
uid: 1002
group: sysadmin
shell: /bin/bash
comment: "Unix Administrator"
- name: ringo
uid: 1003
group: sysadmin
shell: /bin/bash
comment: "Unix Administrator"
tasks:
- name: build array of admin user names
set_fact: admins="{{ admins}} {{ item.name }}"
with_items: "{{ admin_accounts }}"
# print out the fact piping through two jinja2 filters
# careful with word wrapping
- debug: msg={{ admins | regex_replace( '\s+',', ' ) | regex_replace`(',\s(.*)','\') }}`
Cela me donne la suivante:
PLAY [localhost] ***************************************************************
TASK [build array of admin user names] *****************************************
ok: [localhost] => (item={u'comment': u'Unix Administrator', u'shell': u'/bin/bash', u'group': u'sysadmin', u'name': u'john', u'uid': 1000})
ok: [localhost] => (item={u'comment': u'Unix Administrator', u'shell': u'/bin/bash', u'group': u'sysadmin', u'name': u'paul', u'uid': 1001})
ok: [localhost] => (item={u'comment': u'Unix Administrator', u'shell': u'/bin/bash', u'group': u'sysadmin', u'name': u'george', u'uid': 1002})
ok: [localhost] => (item={u'comment': u'Unix Administrator', u'shell': u'/bin/bash', u'group': u'sysadmin', u'name': u'ringo', u'uid': 1003})
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "john, paul, george, ringo"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
Donc...j'ai ce dont j'ai besoin, mais je suis aller sur le droit chemin?
Ansible version est 2.0.2.0 en cours d'exécution sur Centos 7.2.
Merci d'avance.
Edit: La résultante filtre fini par ressembler à ceci:
- name: build list of admin user names
set_fact:
admin_list: "{{ admin_accounts | selectattr('state', 'equalto', 'present') | map(attribute='name') | join(', ') }}"
- debug: msg={{ admin_list }}
Avoir ajouté un autre paramètre à la yaml:
state: absent
Ringo a laissé de côté, comme souhaité.
OriginalL'auteur Rowley | 2016-06-07
Vous devez vous connecter pour publier un commentaire.
Filtres fonctionnent sur des listes, de sorte que le with_items est vraiment du gaspillage, et l'expression rationnelle des choses est assez obtus pour ce que vous faites. Voulez-vous vraiment une chaîne séparée par des virgules, ou voulez-vous simplement une liste de noms d'utilisateur extrait de la
admin_accounts
liste?Si vous voulez juste la liste, pourquoi pas:
... et si vraiment vous voulez la liste séparée par des virgules, comme un plat de chaîne, il suffit d'ajouter un filtre de jointure:
Si votre objectif ultime est d'un modèle, si, je vous suggère de faire cela à l'intérieur du modèle, puisque cela semble assez formatage liés par opposition à la logique (sauf si vous êtes juste la simplification de Débordement de Pile fins)...
Désolé de vous demander, mais qu'en arrière de cela, il y a un filtre qui me permettrait de conditionnelle de la carte? Je suis le référencement des json qui est utilisé pour la création de comptes utilisateur et de l'utilisation de "l'état" de l'attribut de comprendre des alias de compte pour sudoers. À l'aide de with_items et quand ensemble atteint l'effet désiré. Je ne vois pas dans l'ansible filtres doc comment je pourrais faire cela sans écrire mon propre filtre. Je suis un peu en off que tout à l'heure...
Juste trouvé une bonne page sur les filtres ici et découvert selectattr et rejectattr. Malheureusement, il ressemble à ma version actuelle de ansible utilise jinja2.7, pas de 2.8 donc j'ai "pas de test nommé "equalto'.
Vous pouvez mettre à jour jinja à l'extérieur Ansible - il doit être parfaitement heureux avec 2,8
Génial, ça fonctionne. Merci encore!
OriginalL'auteur nitzmahone
Lorsqu'il est nécessaire d'ajouter à la fois le préfixe et le suffixe (et de faire tout d'une liste), regardez:
Ce qui est fait: la liste de toutes les machines du groupe etcd, extraits de l'adresse ipv4, ajoute le préfixe "https://"et le suffixe": 2379'.
À la fin, tout se transforme à une liste.
OriginalL'auteur ReSearchIT Eng