使用go-ini解析Ansible-playbook文件时遇key-value delimiter not found错误
解决go-ini解析Ansible Inventory时的"key-value delimiter not found"错误
这个问题的核心原因是:go-ini默认遵循严格的标准INI格式,要求每一行必须是key=value的键值对结构,但Ansible的Inventory文件是INI格式的扩展——它允许在section下直接列出主机(比如你的[vm_master]下的172.16.1.2),这种行没有键值分隔符=,所以go-ini会报错。
快速解决方案:开启go-ini的无值键支持
你只需要在加载文件时配置AllowNoValue: true,让go-ini允许没有值的键(也就是把那些主机IP当作键,值为空),修改后的代码如下:
import "gopkg.in/ini.v1" // ... opts := ini.LoadOptions{ AllowNoValue: true, } conf, err := ini.LoadOptions(opts, inventoryFilePath) if err != nil { return errors.New("Unable to read file: " + err.Error()) } nodeSection, err := conf.GetSection("vm_master") if err != nil { return errors.New("Unable to get section: " + err.Error()) } // 获取section下的所有主机IP(也就是所有无值的键) hosts := nodeSection.KeyStrings() // 现在hosts里就包含了["172.16.1.2"]
补充说明
Ansible的Inventory文件并不是严格的标准INI,它额外支持了:
- 直接在section下列出主机
- 分组变量(比如
[all:vars]这种带后缀的section) - 通配符、范围表达式等
如果后续你需要处理更多Ansible特有的Inventory语法,可能需要考虑使用专门针对Ansible Inventory的Go库,不过对于基础的主机列表解析,开启AllowNoValue就足够解决你的问题了。
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

