Ansible取交集列表首个元素仅获首字符的解决方法
问题根因
核心问题是变量类型不符合预期:你定义的environment_vars_docmosis_hosts最终是字符串类型,不是你以为的主机列表。intersect过滤器处理inventory分组的返回值本来是列表格式,但你的写法让这个列表被渲染成了字符串。对字符串做[0]索引时,取到的自然是字符串的第一个字符,而不是列表里的第一个主机名。
另外你写的取值表达式还有逻辑漏洞:default过滤器放在了[0]索引操作之后,一旦原列表为空,索引会直接抛出越界错误,default的兜底逻辑根本不会执行。
正确写法
- 先修正变量定义,保证
environment_vars_docmosis_hosts是列表类型:
environment_vars_docmosis_hosts: "{{ groups['role_ccm_docmosis'] | intersect(groups['stack_' ~ stack]) }}"
不要在这个表达式外层额外拼接其他字符串内容,避免Jinja2把列表强制转成字符串渲染。
- 调整取值逻辑,先对整个列表做兜底判断,再取第一个元素拼接端口:
_docmosis_pool_config: "{{ (environment_vars_docmosis_hosts | default(['localhost']))[0] }}:2100"
临时兼容方案
如果你线上已经有其他逻辑依赖environment_vars_docmosis_hosts当前的字符串格式,没法直接修改原变量定义,可以在取值时先把字符串解析回列表再操作,注意这只是补丁方案,不建议长期保留:
_docmosis_pool_config: "{{ (environment_vars_docmosis_hosts | from_yaml | default(['localhost']))[0] }}:2100"
内容的提问来源于stack exchange,提问作者Joly
相关产品推荐
相关产品推荐

