在运行时执行期间添加主机 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_inventory 和 add_host 应该具有相同的效果。
人们可能认为选项 refresh_inventory of the module meta 可以完成这项工作。场景将是:
- 开始播放
- 修改库存来源
- 运行
- 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
是否可以在 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_inventory 和 add_host 应该具有相同的效果。
人们可能认为选项 refresh_inventory of the module meta 可以完成这项工作。场景将是:
- 开始播放
- 修改库存来源
- 运行
- 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