--- - name: Test host layout hosts: localhost become: true vars: storage_node_count: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] expected_masters: [1, 1, 3, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 11] tasks: # the elasticserch cluster elects one master from all those which are marked as master-eligible # 1 node cluster can only have one master # 2 node clusters have 1 master-eligable nodes to avoid split-brain # 3 node clusters have 3 master-eligable nodes # >3 node clusters have (nodes // 2) eligable masters rounded up to the next odd number - name: Master node count fact set_fact: master_node_count: |- {% set masters = 0 %} {% if (item | int) < 3 %} {% set masters = 1 %} {% elif (item | int) == 3 %} {% set masters = 3 %} {% else %} {% set masters = (item | int ) // 2 %} {% if ((masters | int) % 2 == 0) %} {% set masters = (masters | int) + 1 %} {% endif %} {% endif %} {{ masters }} with_items: "{{ storage_node_count }}" register: computed_masters - name: Gather results set_fact: masters: "{{ masters|default([]) + [ { 'nodes': item.item, 'masters': (item.ansible_facts.master_node_count|int) } ] }}" with_items: "{{ computed_masters.results }}" - name: Check results assert: that: item.0 == item.1.masters with_together: - "{{ expected_masters }}" - "{{ masters }}"