Ansible跨主机用set_fact遇未定义变量错误,debug却可正常打印
Ansible跨主机变量引用错误解决:hostvars未定义问题
问题现象
在host1节点通过set_fact存储kubeadm_join_token变量后,host2节点用debug模块能正常打印该变量,但执行加入K8s集群的shell任务时,提示"hostvars['{{ host1_ip }}']" is undefined。
错误原因
debug模块的var参数是特殊处理的:它会自动解析参数字符串中的Jinja2模板语法。但shell模块的参数是直接在Jinja2渲染环境中处理,嵌套的{{ }}会被当作字符串而非变量解析——外层的{{ }}已经在执行渲染,内层的{{ host1_ip }}不会被解析为对应IP,而是保留成字符串{{ host1_ip }},最终变成hostvars['{{ host1_ip }}'],自然找不到对应的主机变量。
解决方案
去掉内层的{{ }},直接在Jinja2表达式中引用变量即可:
修改后的Host2任务
- debug: var=hostvars[host1_ip]['kubeadm_join_token'] run_once: true - name: Join the cluster shell: "{{ hostvars[host1_ip]['kubeadm_join_token'] }} --control-plane"
可选优化:先赋值为本地变量
如果觉得跨主机变量引用可读性差,可以先将其赋值为host2的本地变量,再引用:
- name: 将host1的join token赋值到本地 set_fact: local_join_token: "{{ hostvars[host1_ip]['kubeadm_join_token'] }}" - name: Join the cluster shell: "{{ local_join_token }} --control-plane"
验证说明
修改后,shell模块会正确解析host1_ip变量为IP地址,从而从hostvars中获取到host1节点存储的kubeadm_join_token,顺利执行集群加入命令。
内容的提问来源于stack exchange,提问作者Slyke
相关产品推荐
相关产品推荐

