2014-07-07 14 views
7

Ho un playbook che configurerà un cluster redis e nutcracker come proxy. Quali host giocano quali ruoli sono definiti per gruppi. Vorrei aggiungere un controllo di integrità prima dell'esecuzione delle attività, ovvero:Controllo di integrità prima di eseguire il playbook ansible -> contare gli host

  • Esiste esattamente un proxy? (1 host nel gruppo A)
  • C'è almeno un nodo Redis (> = 1 host nel gruppo B)

ho già una soluzione, anche se penso che sia abbastanza brutto e pensato che ci deve essere qualcosa di meglio, ma proprio non riesco a trovarlo. Attualmente eseguo un'attività locale richiamando di nuovo il libro di gioco con il parametro --list-hosts e controllando l'output.

- 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 

che funziona, ma non c'è un solo modo per verificare il numero di host in un gruppo senza questa chiamata in più?

risposta

21

(Disclaimer: ho sentito che dopo aver avuto un problema simile e capire che fuori che dovrei correggere l'altra risposta data qui.)

Cosa Woodham accennato circa l'utilizzo di filtri Jinja2 è corretto ma è stato usato in modo errato. Essi possono essere utilizzati in Playbook, ma si consiglia di utilizzarle in questo modo:

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

Come potete vedere possiamo filtri a catena in questo modo facilmente e più tardi siamo in grado di avere un controllo su questa variabile:

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

Si dovrebbe essere in grado di farlo utilizzando variabili magiche. (Vedere la documentazione Ansible qui: http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts)

Per ottenere il numero di host in un gruppo, è possibile ottenere il gruppo utilizzando groups['group_name']. Quindi puoi usare il filetore Jinja2 length (http://jinja.pocoo.org/docs/templates/#length) per ottenere la lunghezza di quel gruppo.

E.g. (In un playbook)

vars: 
    num_redis_proxy_hosts: length(groups['redis-proxy']) 
Problemi correlati