Проверка работоспособности перед запуском ansible playbook -> количество хостов

У меня есть playbook, который настроит кластер Redis и щелкунчик в качестве прокси. Какие хосты играют какие роли определяются для каждой группы. Я хотел бы добавить проверку работоспособности перед запуском задач, то есть:

  • Там точно один прокси? (1 хозяин в группе А)
  • Есть ли хотя бы один узел redis (>=1 узел в группе B)

У меня уже есть решение, хотя я думаю, что оно довольно уродливое, и я думал, что должно быть что-то лучше, но я просто не могу его найти. В настоящее время я запускаю локальную задачу, снова вызывающую playbook с параметром --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

Это работает, но нет ли простого способа проверить количество хостов в группе без этого дополнительного вызова?


person udondan    schedule 07.07.2014    source источник


Ответы (2)


(Отказ от ответственности: я почувствовал, что после того, как у меня возникла аналогичная проблема и я ее понял, я должен исправить другой ответ, данный здесь.)

То, что Вудхэм упомянул об использовании фильтров 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
person wazy    schedule 15.09.2014

Вы сможете сделать это, используя магические переменные. (См. документацию Ansible здесь: 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'])
person Woodham    schedule 07.07.2014