Ansible问题:prompt选择变量无法在全部主机中定义
解决Ansible多主机场景下用户输入变量仅在单主机注册的问题
问题原因
原剧本中pause任务默认在所有目标主机上执行,但Ansible按顺序处理主机时,仅第一台主机执行时会触发用户输入,其他主机的pause任务并未实际获取到输入内容,最终只有第一台主机注册了selected_installers变量,后续任务在其他主机运行时就会出现变量未定义的报错。
解决方案
将用户输入的任务仅在localhost执行一次,再让所有目标主机共享这个变量,以下是两种可行实现方式:
方式一:委托任务到localhost并同步变量
给pause任务添加委托配置,确保只执行一次用户输入,再通过set_fact把变量同步到所有主机:
- name: AppLauncher Installation gather_facts: false hosts: all tasks: - name: 获取用户选择的安装器 pause: prompt: "Select Installer {{ item|basename }} [y/n]" register: selected_installers loop: "{{ installer_types }}" loop_control: label: "{{ item|basename }}" delegate_to: localhost run_once: true - name: 将选择结果同步到所有主机 set_fact: selected_installers: "{{ hostvars['localhost']['selected_installers'] }}" delegate_facts: true - name: Run Install roles include_role: name: "{{ item.item|lower }}" loop: "{{ selected_installers.results }}" loop_control: label: "{{ item.item|basename }}" when: item.user_input == 'y'
方式二:拆分Play分别处理输入与安装
把剧本拆分为两个Play,第一个在localhost收集用户输入,第二个在所有目标主机复用该变量:
- name: 收集用户安装选择 hosts: localhost gather_facts: false tasks: - name: 获取用户选择的安装器 pause: prompt: "Select Installer {{ item|basename }} [y/n]" register: selected_installers loop: "{{ installer_types }}" loop_control: label: "{{ item.item|basename }}" - name: AppLauncher Installation gather_facts: false hosts: all vars: selected_installers: "{{ hostvars['localhost']['selected_installers'] }}" tasks: - name: Run Install roles include_role: name: "{{ item.item|lower }}" loop: "{{ selected_installers.results }}" loop_control: label: "{{ item.item|basename }}" when: item.user_input == 'y'
补充说明
run_once: true用于确保pause任务只执行一次,避免重复询问用户- 原剧本中
item.item == ( item.item|basename)的判断属于冗余条件,可直接删除
内容的提问来源于stack exchange,提问作者Derek Edwards
相关产品推荐
相关产品推荐

