在Ansible/Jinja2中如何将分号分隔的key=value对字符串转换为字典?
分号分隔key=value字符串转字典的Ansible/Jinja2优化实现
核心精简逻辑
替代原有循环拼接列表、依赖items2dict转换的笨重写法,完全利用Jinja2内置过滤器完成全流程转换,无需多任务配合:
- set_fact: mariadb_wsrep_opts_dict: >- {{ dict( mariadb_wsrep_provider_options_output .split(';') | select('trim') | map('split', '=') | map('map', 'trim') ) }}
流程拆解
split(';'):将整段分号分隔的原始字符串拆分为字符串列表,天然兼容末尾带分号的输入格式select('trim'):过滤拆分后产生的空字符串、全空白字符的无效条目,避免转换报错- 第一层
map('split', '='):将每个有效键值对按等号拆分为[键文本, 值文本]的二元子列表 - 第二层
map('map', 'trim'):对每个子列表内的键、值文本分别去除首尾多余空格,匹配原始字符串中key = value的带空格格式 - 内置
dict()构造器:直接将嵌套的二元列表转换为结构化字典,无需额外调用items2dict过滤器
效果验证
转换后输出的字典结构与目标格式完全一致:
{ "mariadb_wsrep_opts_dict": { "base_dir": "/var/lib/mysql/", "base_host": "192.168.1.101", "base_port": "4567" } }
方案优势
- 仅需单条
set_fact任务即可完成转换,无需循环遍历追加临时列表,执行效率更高 - 自动适配输入格式的常见差异:包括键值对前后多余空格、字符串末尾的多余分号,不会触发格式解析错误
- 代码逻辑线性直观,无冗余临时变量,更易维护
内容的提问来源于stack exchange,提问作者haydenseitz
相关产品推荐
相关产品推荐

