Ansible模板模块使用HOME变量报错求助
解决Ansible Template模块中变量路径的语法错误与路径问题
首先,咱们先看你遇到的YAML语法错误——这是导致报错的直接原因。在YAML里,如果一个值以{{开头(也就是嵌入Jinja2变量),你必须把整个字符串用引号包裹起来,否则YAML解析器会把{{当成语法的一部分,从而抛出"did not find expected key"的错误。
第一步:修复语法错误
你原来的任务代码里,src和dest的值没有加引号,这是问题根源。修改成这样:
--- - include_vars: vars/main/input.yml - name: Generate templates template: src: "{{ home }}/roles/my_role/templates/DIR1/PATH1/file1" dest: "{{ home }}/roles/my_role/templates/DIR1/PATH1/file2"
这样YAML解析器就能正确识别这是一个包含变量的字符串了。
第二步:利用Ansible角色的自动路径查找(更优雅的写法)
其实你完全不需要用home变量来指定templates的完整路径——Ansible在执行角色内的任务时,会自动在当前角色的templates目录下查找文件。所以你可以直接用相对路径,代码会更简洁,也符合角色独立性的要求:
--- - include_vars: vars/main/input.yml - name: Generate templates template: src: "DIR1/PATH1/file1" dest: "{{ home }}/roles/my_role/templates/DIR1/PATH1/file2"
这里src直接写templates目录下的相对路径即可,Ansible会自动帮你定位到roles/my_role/templates/目录下的对应文件。
为什么之前用相对路径无效?
你提到尝试templates/DIR1/PATH1/file1无效,那是因为你多写了templates/前缀——Ansible已经默认在templates目录下查找,所以你只需要写目录下的子路径就行,不需要加上templates/本身。
验证一下
如果用上面的第二种写法,既避免了YAML语法错误,又不需要依赖home变量来定位源模板文件,完美符合你想要的角色独立性要求。
内容的提问来源于stack exchange,提问作者Sheldon
相关产品推荐
相关产品推荐

