如何跨Ansible Play使用vars_prompt定义的主机变量?
解决Ansible跨Play使用vars_prompt定义的主机变量问题
问题核心
你遇到的问题根源在于:Ansible会在整个Playbook执行前就解析每个Play的hosts字段,而vars_prompt默认是单个Play的局部变量,仅在当前Play上下文生效;set_fact设置的是主机级Facts,只能在目标主机的任务中访问,无法在hosts这种预解析字段中使用;之前的add_host用法有误,没有利用动态生成的主机组。
可行解决方案
方案1:将vars_prompt移到Playbook全局级别
把变量提示放在所有Play外面,Ansible会在Playbook启动时先触发提示,变量进入全局上下文,所有Play的hosts字段都能直接引用:
--- vars_prompt: - name: target1 prompt: "Specify deployment target1" private: false default: 'localhost' - name: Test1 hosts: "{{ target1 }}" gather_facts: false tasks: - name: Output 1 ansible.builtin.debug: msg: "{{ target1 }}" - name: Test2 hosts: "{{ target1 }}" tasks: - name: Output 2 ansible.builtin.debug: msg: "{{ target1 }}"
方案2:使用add_host创建动态主机组
先在本地Play中获取用户输入,再将目标主机加入动态组,后续Play直接针对该组执行:
--- - name: Test1 hosts: localhost gather_facts: false vars_prompt: - name: target1 prompt: "Specify deployment target1" private: false default: 'localhost' tasks: - name: 动态添加目标主机到组 ansible.builtin.add_host: hostname: "{{ target1 }}" groups: dynamically_created_hosts - name: Output 1 ansible.builtin.debug: msg: "{{ target1 }}" - name: Test2 hosts: dynamically_created_hosts tasks: - name: Output 2 ansible.builtin.debug: msg: "{{ inventory_hostname }}"
为什么之前的方法无效?
- set_fact失效:
hosts字段的解析早于Play任务执行,set_fact是在Test1的任务阶段才设置变量,此时Test2的hosts已经完成解析,自然拿不到变量。 - add_host用法错误:之前的Test2仍然尝试引用
{{ target1 }},但该变量仅在Test1的上下文中有效,正确做法是直接使用add_host创建的动态组名作为hosts目标。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

