'Add host during runtime execution w/o starting new play

Is it possible during Ansible execution to add another host in the play, without starting a new play?

I am aware of the add_host module, but that requires the start of a new play to add the host, which is undesired.



Solution 1:[1]

No. By design, it's not possible to add hosts to 'in-flight play'. Quoting from the Summary of Ansible bug #59401:

By design, the in-flight play will not start running tasks on newly-added hosts, but it will stop running tasks on hosts that have disappeared. Newly-created hosts from an inventory refresh are immediately visible in ansible_play_hosts, even though they're not executing.


Notes

  • The bug claims refresh_inventory and add_host should have the same effects.

  • One might expect that the option refresh_inventory of the module meta does the job. The scenario would be:

  1. Start a play
  2. Modify the source of the inventory
  3. Run - meta: refresh_inventory

Unfortunately, the example of the INI file below shows that this doesn't work. The host host03 is added to the inventory and to the list ansible_play_hosts_all as well. But, then, the following task debug doesn't run at this host. Play recap doesn't include this host either.

shell> cat hosts
[test]
host01
host02

The playbook below

shell> cat playbook.yml
- hosts: test
  gather_facts: false
  tasks:
    - debug:
        var: ansible_play_hosts_all
      run_once: true

    - community.general.ini_file:
        path: hosts
        section: test
        option: "{{ item.host }}"
        state: "{{ item.state }}"
        allow_no_value: true
      loop:
        - {host: host03, state: present}
      run_once: true
      delegate_to: localhost

    - meta: refresh_inventory

    - debug:
        var: ansible_play_hosts_all
      run_once: true

    - debug:
        var: inventory_hostname

gives

shell> ansible-playbook -i hosts playbook.yml

PLAY [test] **********************************************************************************

TASK [debug] *********************************************************************************
ok: [host01] => 
  ansible_play_hosts_all:
  - host01
  - host02

TASK [community.general.ini_file] ************************************************************
changed: [host01 -> localhost] => (item={'host': 'host03', 'state': 'present'})

TASK [meta] **********************************************************************************

TASK [debug] *********************************************************************************
ok: [host01] => 
  ansible_play_hosts_all:
  - host01
  - host02
  - host03

TASK [debug] *********************************************************************************
ok: [host01] => 
  inventory_hostname: host01
ok: [host02] => 
  inventory_hostname: host02

PLAY RECAP ***********************************************************************************
host01                     : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1