2014-07-07 1 views
7

플레이스 북에 리디스 클러스터와 nutcracker을 프록시로 설정했습니다. 어느 호스트가 어떤 역할을하는지는 그룹별로 정의됩니다. 작업을 실행하기 전에 정상 체크를 추가하고 싶습니다. 즉,가능성있는 플레이 북을 실행하기 전에 온전한 체크 -> 카운트 호스트

  • 정확히 하나의 프록시가 있습니까? (A 군 1 개 호스트)
  • 적어도 하나의 레디 스 노드가 있는가 (> = 그룹 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

(각본에서) (면책 조항 : 나는 비슷한 문제가 내가 여기에 주어진 다른 대답을 수정해야한다는을 파악 한 후 그 I를 느꼈다.)

은 우드 햄은 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 documentation here : http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts)

그룹의 호스트 수를 확인하려면 groups['group_name']을 사용하여 그룹을 가져올 수 있습니다. 그런 다음 Jinja2 파일러 length (http://jinja.pocoo.org/docs/templates/#length)을 사용하여 해당 그룹의 길이를 가져올 수 있습니다.

예.

vars: 
    num_redis_proxy_hosts: length(groups['redis-proxy']) 
관련 문제