2014-07-07 1 views
7

J'ai un playbook qui va configurer un cluster redis et nutcracker comme proxy. Quels hôtes jouent quels rôles sont définis par groupes. Je voudrais ajouter une vérification de santé mentale devant l'exécution des tâches, c'est-à-dire:Vérification de l'état de santé avant l'exécution de la lisibilité ansible -> comptes hôtes

  • Existe-t-il exactement un proxy? (1 hôte dans le groupe A)
  • Y at-il au moins un noeud de Redis (> = 1 hôte dans le groupe B)

J'ai déjà une solution, mais je pense qu'il est assez laid et pensé qu'il doit y avoir quelque chose de mieux, mais je ne peux pas le trouver. J'exécute actuellement une tâche locale appelant à nouveau le playbook avec le paramètre --list-hosts et vérifie la sortie.

- name: Make sure there is only one proxy defined 
    shell: ansible-playbook -i {{ inventory_file }} redis-cluster.yml --tags "redis-proxy" --list-hosts 
    register: test 
    failed_when: test.stdout.find("host count=1\n") == -1 
    changed_when: 1 == 2 

Cela fonctionne mais n'existe pas un moyen simple de vérifier le nombre d'hôtes dans un groupe sans cet appel supplémentaire?

Répondre

21

(Disclaimer: Je sentais que je après avoir eu un problème similaire et trouver ce que je corriger l'autre réponse donnée ici.)

Que Woodham mentionné sur l'utilisation de filtres jinja2 est correct mais a été mal utilisé. Ils peuvent être utilisés dans Playbooks mais vous devez les utiliser de cette façon:

vars: 
    num_hosts: "{{ groups['redis-proxy'] | length }}" 

Comme vous pouvez le voir nous pouvons les filtres à chaîne ainsi facilement et plus tard, nous pouvons avoir un contrôle sur cette variable:

- name: Validate Number of Nodes 
    fail: msg="The number of nodes must be exactly 1!" 
    when: num_hosts | int != 1 
1

Vous devriez être en mesure de le faire en utilisant variables magiques. (Voir la documentation Ansible ici: http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts)

Pour obtenir le nombre d'hôtes dans un groupe, vous pouvez obtenir le groupe en utilisant groups['group_name']. Ensuite, vous pouvez utiliser le filimètre Jinja2 length (http://jinja.pocoo.org/docs/templates/#length) pour obtenir la longueur de ce groupe.

E.g. (Dans un livre de jeu)

vars: 
    num_redis_proxy_hosts: length(groups['redis-proxy']) 
Questions connexes