如何将Ansible主剧本变量传递至关联子剧本?
嗨,这个问题Ansible里有几种很贴合你需求的解决方式,刚好对应你说的“函数调用传参”的思路,我给你一步步拆解:
方法1:显式传递变量(最像函数传参)
这种方式完全模拟你说的“函数调用传参”逻辑,在主剧本引用子剧本时,通过vars参数把指定变量传递过去,子剧本可以用你自定义的参数名接收。
比如你的主剧本可以这么写:
- hosts: all become: yes vars_prompt: - name: "sethostname" prompt: "What will be the machine's hostname?" private: no - name: "setipaddress" prompt: "What will be the machine's IP address?" private: no tasks: - name: 执行子剧本1并传递变量 include_tasks: playbook1.yml vars: target_hostname: "{{ sethostname }}" target_ip: "{{ setipaddress }}" - name: 执行子剧本2并传递变量 include_tasks: playbook2.yml vars: target_hostname: "{{ sethostname }}" target_ip: "{{ setipaddress }}"
对应的子剧本(比如playbook1.yml)里,就可以直接用你传递的参数名来使用变量值:
# playbook1.yml - name: 设置主机名 hostname: name: "{{ target_hostname }}" - name: 配置IP到hosts文件 lineinfile: path: /etc/hosts line: "{{ target_ip }} {{ target_hostname }}"
方法2:直接继承主剧本变量(更简洁)
如果子剧本不需要重命名变量,直接想用主剧本里的sethostname和setipaddress,那其实不用额外传参——默认情况下,通过include_tasks或import_tasks引入的子任务文件,是可以直接访问主剧本的play级变量、vars_prompt定义的变量的。
比如你的主剧本保持原有vars_prompt配置,子剧本直接使用原变量名即可:
# playbook3.yml - name: 打印主剧本传入的主机名 debug: msg: "即将设置的主机名是: {{ sethostname }}" - name: 打印主剧本传入的IP地址 debug: msg: "即将设置的IP地址是: {{ setipaddress }}"
这种方式更简洁,适合子剧本和主剧本耦合度较高的场景,相当于直接使用“全局变量”。
小提醒
- 如果你用的是较旧版本的Ansible(2.4之前),可能用的是
include而非include_tasks,但现在官方更推荐使用include_tasks(动态引入)或import_tasks(静态引入)。 - 要注意变量名冲突问题:如果子剧本里定义了和主剧本同名的变量,子剧本的变量会覆盖主剧本的,所以尽量避免重名。
内容的提问来源于stack exchange,提问作者murkywaters
相关产品推荐
相关产品推荐

