You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:37:37