如何在Ansible中实现仅触发一次的全局用户提示输入
解决方案
问题原因
默认情况下,你写在节点tasks中的pause任务会随每台节点的执行流程独立触发,结合serial分批执行配置时,每一批次也会重复触发提示,才会出现N个节点要确认N次的问题。
方案1:给pause任务添加run_once: true参数(最简便)
这个参数是Ansible原生提供的配置,作用是让标记的任务仅在当前play的第一个执行节点上运行一次,运行结果和注册的变量会自动同步给当前play的所有节点,哪怕配置了分批执行也只会触发一次提示。
修改后的对应任务代码如下:
- pause: prompt: "Reboot server(s) to make sure things are working during setup? (Y/n)" echo: true register: confirm_reboot run_once: true tags: [ untagged, hostname, netplan, firewalld ]
其余原有代码无需改动,即可实现只确认一次、所有节点共享输入结果的需求。
方案2:抽离交互逻辑到独立本地play(适合复杂交互场景)
如果后续有多个前置交互需求,可以把用户输入部分单独放到第一个仅在本地执行的play中,生成的变量存在本地主机的变量池,所有后续节点play都可以直接调用,示例代码如下:
# 第一个play仅在本地执行,负责收集用户输入 - name: Get user reboot confirm hosts: localhost gather_facts: no tasks: - pause: prompt: "Reboot server(s) to make sure things are working during setup? (Y/n)" echo: true register: confirm_reboot - set_fact: reboot: "{{ (confirm_reboot.user_input == '' or confirm_reboot.user_input == 'Y' or confirm_reboot.user_input == 'y' ) | ternary('True', 'False') }}" # 原有节点执行play - name: Prepare worker nodes hosts: "{{ hosts }}" serial: - 1 - 3 remote_user: root any_errors_fatal: true vars: hosts: nodes # 直接调用本地play生成的变量 reboot: "{{ hostvars.localhost.reboot }}" tasks: - debug: msg: "{{ reboot }}" tags: [ untagged, hostname, netplan, firewalld, firewalld-install, firewalld-config ]
注意事项
如果执行play时使用了--skip-tags参数,要确保不要跳过包含pause任务的标签,否则会出现变量未定义的报错。
内容的提问来源于stack exchange,提问作者tftd
相关产品推荐
相关产品推荐

