2014-07-07 81 views
7

我有一個劇本,它將設置一個redis羣集,nutcracker作爲代理。哪些主機扮演每個組的角色。我想在運行任務前添加理智檢查,即:運行完整的劇本之前的完整性檢查 - >統計主機

  • 是否只有一個代理? (A組1個主機)
  • 有至少一個Redis的節點(> = B組1個主機)

我已經有一個解決方案,但我認爲這是非常醜陋的,並認爲必須有更好的東西,但我無法找到它。我目前使用--list-hosts參數再次運行一個調用劇本的本地任務並檢查輸出。

- 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 

這有效,但沒有一種簡單的方法來檢查組中的主機數量沒有這個額外的電話?

回答

21

(聲明:我覺得我有類似的問題,並想出來的,我應該糾正這裏給出對方的回答後。)

伍德姆提到怎麼樣使用Jinja2的過濾器是正確的,但使用不正確。他們可以在劇本被使用,但你應該以這種方式使用它們:

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

這樣輕鬆正如你可以看到,我們可以鏈接過濾器,稍後我們會對這個變量的檢查:

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

你應該可以使用魔術變量來做到這一點。 (請參閱此處的Ansible文檔:http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts

要獲取組中的主機數,可以使用groups['group_name']獲取組。然後,您可以使用Jinja2文件夾lengthhttp://jinja.pocoo.org/docs/templates/#length)獲取該組的長度。

E.g. (在劇本)

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