在运行时执行期间添加主机 w/o 开始新游戏

Add host during runtime execution w/o starting new play

是否可以在 Ansible 执行期间添加另一台主机而不开始新的播放?

我知道 add_host 模块,但这需要开始新的游戏才能添加主机,这是不受欢迎的。

没有。按照设计,无法将主机添加到 'in-flight play'。引用 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.


备注

  • 错误声称 refresh_inventoryadd_host 应该具有相同的效果。

  • 人们可能认为选项 refresh_inventory of the module meta 可以完成这项工作。场景将是:

  1. 开始播放
  2. 修改库存来源
  3. 运行 - meta: refresh_inventory

不幸的是,下面的 INI 文件示例表明这不起作用。主机 host03 被添加到清单和列表 ansible_play_hosts_all 中。但是,接下来的任务 debug 不会 运行 在此主机上。 Play recap也不包括这个主机。

shell> cat hosts
[test]
host01
host02

下面的剧本

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

给予

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