Ansible执行Playbook报错:未定义变量'entregas'排查求助
解决Ansible未定义变量'entregas'的错误
让我们一步步排查你遇到的问题:
1. 核心问题:变量名中的横杠被Jinja2误解析
你的错误提示是'entregas' is undefined,但你明明定义了entregas-web变量——这是因为Jinja2模板引擎会把变量名里的横杠-当成减法运算符,它会尝试计算entregas减去web,而entregas这个变量根本不存在,所以触发了报错。
解决方法(二选一):
- 推荐方案:改用下划线命名变量
修改defaults/main.yml里的变量名:
然后对应修改--- dest_path : /tmp/ansible/test ssh_key_path : /root/.ssh/id_rsa # 顺便修正第二个拼写错误,后面会提到 entregas_web : 'bit bucket ssh' # 把横杠改成下划线tasks/main.yml里的引用:--- - name : Clone and pull become : true ansible.builtin.git : repo : "{{ entregas_web }}" key_file : "{{ ssh_key_path }}" dest : "{{ dest_path }}" refspec : '+refs/pull/* :refs/heads/*' force : yes version : master - 保留横杠的方案:用变量字典引用
如果你坚持要保留横杠命名,需要用Jinja2的变量字典语法来引用:repo : "{{ vars['entregas-web'] }}"
2. 额外的拼写错误问题
我还发现你在defaults/main.yml里定义的是sh_key_path,但在tasks/main.yml里写的是ssh_key_path(多了一个s),这个拼写不一致也会导致后续出现变量未定义的错误,记得一起修正。
3. 目录结构确认
最后确认你的角色目录结构是否正确(从你描述的来看是对的,但再核对一下):
. ├── build.yml └── roles └── build ├── defaults │ └── main.yml └── tasks └── main.yml
只有这样,Ansible才会自动加载defaults/main.yml里的变量到角色的作用域中。
修正完这些问题后,重新执行你的playbook应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Gustavo Silva Costa
相关产品推荐
相关产品推荐

