Ansible playbook交互确认后仅单主机生效其余被跳过如何解决
问题原因
- 核心原因是Ansible的
pause模块默认隐式开启了run_once: true属性,只会在当前play匹配到的第一台主机上执行一次,你输入的确认内容只会被注册到第一台主机的confirm_delete变量中,其余主机的该变量处于未定义状态。 - 配套的
set_fact任务没有显式设置run_once: true,默认只会给有confirm_delete变量的第一台主机生成confirm_delete_fact事实变量,剩下两台主机完全没有该变量,第二个play的when: confirm_delete_fact条件判断时,未定义变量会被解析为false,因此被跳过。
解决方法
修改第一个play的两个任务,显式指定run_once: true即可。Ansible中run_once: true的set_fact任务生成的事实变量默认作用域是当前play的所有主机,而非仅执行任务的单台主机,刚好适配这种需要全局统一确认的场景:
- hosts: all become: false tasks: - pause: prompt: "Are you sure you want to delete \" EVERYTHING \"? Please confirm with \"yes\". Abort with \"no\" or Ctrl+c and then \"a\"" register: confirm_delete run_once: true # 显式声明单次运行,输入结果全局生效 - set_fact: confirm_delete_fact: "{{ confirm_delete.user_input | bool }}" run_once: true # 显式声明单次运行,变量会同步到当前play所有主机 - hosts: all become: false roles: - {role: destroy, when: confirm_delete_fact }
修改后再运行playbook,my_group内所有主机都会使用同一个确认值执行后续的destroy角色。
内容的提问来源于stack exchange,提问作者reisub83
相关产品推荐
相关产品推荐

