Ansible 2.13:host_vars中列表变量无法读取的问题及正确写法
尝试自动化单主机配置操作,需使用列表类型变量(如为每个数据库主机创建对应数据库)。
清单文件位于./inventory/hosts,内容如下:
[dbservers] intweb
该清单未关联group_vars,对应的host_vars文件路径为./inventory/host_vars/intweb.yml,内容:
--- testvalue: test anothertestvalue: - value1 - value2 - value3 yetanothervalue: test
在剧本中执行以下任务:
[...其他行...] - name: Test list variables debug: msg: "List item is {{ item }}" with_items: "{{ anothertestvalue }}" - name: Test list variable as string debug: msg: "{{ anothertestvalue }}" - name: Test simple variables debug: msg: "{{ testvalue }}"
通过命令ansible-playbook plays/default.yml --limit dbservers --start-at-task="Test list variables"运行剧本后,列表变量anothertestvalue输出为空,但简单变量testvalue显示正常。询问在host_vars中定义此类列表的正确语法。
你当前在host_vars中定义列表的语法完全正确,YAML格式的列表就是通过-开头的条目来定义的。出现列表变量为空的情况,并非语法错误,常见排查方向如下:
路径验证
确认host_vars的路径是否符合Ansible要求:host_vars需与清单文件同目录,或位于项目根目录的host_vars文件夹下。比如你的清单在./inventory/hosts,则intweb.yml必须在./inventory/host_vars/下,同时文件名要和清单中的主机名完全一致(注意大小写敏感)。变量覆盖排查
检查是否有其他层级的变量覆盖了anothertestvalue:比如剧本内部定义的变量、意外存在的group_vars同名变量、命令行通过-e传入的变量,或是Ansible配置中的默认变量。
可直接执行以下命令查看主机上该变量的实际值,确认是否被正确加载:ansible intweb -i ./inventory/hosts -m debug -a "var=anothertestvalue"清理Ansible缓存
若之前修改过变量文件,Ansible可能缓存了旧值。执行以下命令清理缓存后重新运行剧本:rm -rf ~/.ansible/cacheYAML格式校验
检查intweb.yml是否存在缩进错误(YAML要求用空格缩进,不能用制表符)或特殊字符导致解析异常,可使用yamllint工具校验文件格式合规性。
内容的提问来源于stack exchange,提问作者Nick Andriopoulos

