Skip to content
Snippets Groups Projects
  • Mark Goddard's avatar
    56b4352f
    Fix fact gathering with --limit · 56b4352f
    Mark Goddard authored
    Prior to this change, when the --limit argument is used, each host in the
    limit gathers facts for every other host. This is clearly unnecessary, and
    can result in up to (N-1)^2 fact gathers.
    
    This change gathers facts for each host only once. Hosts that are not in
    the limit are divided between those that are in the limit, and facts are
    gathered via delegation.
    
    This change also factors out the fact gathering logic into a separate
    playbook that is imported where necessary.
    
    Change-Id: I923df5af41a7f1b7b0142d0da185a9a0979be543
    56b4352f
    History
    Fix fact gathering with --limit
    Mark Goddard authored
    Prior to this change, when the --limit argument is used, each host in the
    limit gathers facts for every other host. This is clearly unnecessary, and
    can result in up to (N-1)^2 fact gathers.
    
    This change gathers facts for each host only once. Hosts that are not in
    the limit are divided between those that are in the limit, and facts are
    gathered via delegation.
    
    This change also factors out the fact gathering logic into a separate
    playbook that is imported where necessary.
    
    Change-Id: I923df5af41a7f1b7b0142d0da185a9a0979be543
gather-facts.yml 1.69 KiB
---
# NOTE(awiddersheim): Gather facts for all hosts as a
# first step since several plays below require them when
# building their configurations. The below 'gather_facts'
# set to 'false' is a bit confusing but this is to avoid
# Ansible gathering facts twice.
- name: Gather facts for all hosts
  hosts: all
  serial: '{{ kolla_serial|default("0") }}'
  gather_facts: false
  tasks:
    - name: Gather facts
      setup:

    - name: Group hosts to determine when using --limit
      group_by:
        key: "all_using_limit_{{ (ansible_play_batch | length) != (groups['all'] | length) }}"
  tags: always

# NOTE(pbourke): This case covers deploying subsets of hosts using --limit. The
# limit arg will cause the first play to gather facts only about that node,
# meaning facts such as IP addresses for rabbitmq nodes etc. will be undefined
# in the case of adding a single compute node.
# NOTE(mgoddard): Divide all hosts to be queried between the hosts selected via
# the limit.
- name: Gather facts for all hosts (if using --limit)
  hosts: all_using_limit_True
  serial: '{{ kolla_serial|default("0") }}'
  gather_facts: false
  vars:
    batch_index: "{{ ansible_play_batch.index(inventory_hostname) }}"
    batch_size: "{{ ansible_play_batch | length }}"
    # Use a python list slice to divide the group up.
    # Syntax: [<start index>:<end index>:<step size>]
    delegate_hosts: "{{ groups['all'][batch_index | int::batch_size | int] }}"
  tasks:
    - name: Gather facts
      setup:
      delegate_facts: True
      delegate_to: "{{ item }}"
      with_items: "{{ delegate_hosts }}"
      # We gathered facts for all hosts in the batch during the first play.
      when: item not in ansible_play_batch
  tags: always