Ansible - à l'aide de with_items et quand conditionnelle à
J'ai un tas de serveurs qui ont quatre disques physiques sur eux (/dev/sda, sdb, sdc et sdd). la sda a l'OS installé dessus.
J'ai besoin de formater chaque lecteur à l'exception de la sda. J'ai besoin de vérifier si chaque disque contient des données. Si c'est le cas, je ne devrais pas le formater.
# This will get all physical disks (sda, sdb, sdc, etc) and assign them to disk_var
- name: Get disks
set_fact: disk_var="{{hostvars[inventory_hostname]["ansible_devices"].keys()|list}}"
- name: Check if the disk is partitioned and also ignore sda
stat: path=/dev/{{item}}1
with_items: disk_var
when: item != 'sda'
register: base_secondary_partition_{{item}}
- name: Create GPT partition table
command: /sbin/parted -s /dev/{{item}} mklabel gpt
with_items: disk_var
when: item != 'sda' and base_secondary_partition_{{item}}.stat.exists == false
Il y a clairement des étapes impliquées dans la mise en forme de ces disques, mais il échoue à la dernière tâche lors de la création de la table de partition GPT.
Voici à quoi il ressemble quand il s'exécute. Vous verrez que il échoue à la dernière tâche:
TASK: [role | Get disks] ******************************************************
ok: [server1.com]
TASK: [role | Check if the disk is partitioned] *******************************
skipping: [server1.com] => (item=sda)
ok: [server1.com] => (item=sdd)
ok: [server1.com] => (item=sdb)
ok: [server1.com] => (item=sdc)
TASK: [role | Create GPT partition table] *************************************
fatal: [server1.com] => error while evaluating conditional: base_secondary_partition_sdd.stat.exists == false
FATAL: all hosts have already failed -- aborting
Une idée de comment je peux vérifier le conditionnel base_secondary_partition_{{item}}.stat.exists
? J'ai besoin de s'assurer que, s'il y a des données sur le disque dur, il ne sera pas le formater.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'enregistrer votre résultat avec la
item
sel. Lorsque vous vous inscrivez le résultat d'une boucle (par exemple,with_items
) la valeur enregistrée contiendra une cléresults
qui contient une liste de tous les résultats de la boucle. (Voir docs)Au lieu de boucler sur votre appareil d'origine de la liste, vous pouvez faire une boucle sur le régime enregistré d'résultats de la première tâche:
La condition
not item | skipped
prend en charge que les éléments qui ont filtré dans la boucle d'origine (sda) ne seront pas traitées.Tandis que peut-être une solution à votre problème, votre question est très intéressante. Il semble y avoir aucune
eval
fonctionnalité dans Jinja2. Alors que vous pouvez concaténer des chaînes de caractères que vous ne pouvez pas utiliser cette chaîne comme un nom de variable pour se rendre à sa valeur...{{item.item}}
pour la seconde tâche.not item | skipped
donne des erreurs dans les versions plus récentes de l'ansible. Je ne sais pas si vous pouvez exécuter des fonctions comme pas sur un filtrée expression et sauté est défini uniquement si si elle a effectivement sauté. De toute façon j'ai fini par faireitem.skipped is not defined or item.skipped == false
with_items: "{{ device_stat.results }}"
pour que cela fonctionne.not item | skipped
donne cet avertissement "[WARNING de DÉPRÉCIATION]: à l'Aide de tests comme des filtres est obsolète. Au lieu d'utiliserresult|skipped
utilisationresult is skipped
. Cette fonctionnalité sera supprimée dans la version 2.9. La dépréciation des avertissements peut être désactivée par le paramètre deprecation_warnings=False dans ansible.cfg." Cela devrait être beaucoup plus lisibleitem is not skipped
Vos tâches peut être aussi simple que cela...