如何用Ansible正则提取配置文件中item对应的数字值?
从配置文件提取item的数字值到Ansible变量
需求说明
配置文件myfile.conf中item行存在多种格式:
- 等号前后空格任意,如
item = 1000 - 值带双引号/单引号,如
item = "1000"、item='1000' - 值引号不匹配,如
item = "1000' - 行尾带注释,如
item='1000' #blalala
需要通过Ansible的set_fact模块提取item对应的数字值,赋值给变量mynumber,最终结果为mynumber = 1000。
原代码问题分析
原代码存在以下问题:
- 使用
shell模块执行cat命令读取文件,不符合Ansible最佳实践,建议用slurp模块更安全高效 regex_search的正则^item *=*.*未准确匹配等号前后的任意空格,也未处理行尾注释regex_replace的正则仅覆盖带引号的场景,无法匹配无引号的值,同时未过滤注释内容
修正后的解决方案
- name: 读取配置文件 ansible.builtin.slurp: src: ./myfile.conf register: config_content - name: 提取item对应的数字值 ansible.builtin.set_fact: mynumber: |- {{ (config_content.content | b64decode) | regex_search('^item\s*=\s*(.*?)(?:\s*#.*)?$', multiline=True) | regex_replace('^item\s*=\s*(["\']?)(\d+)\1?.*$', '\2') }}
代码解释
- 读取文件:用
slurp模块读取文件,返回的Base64编码内容通过b64decode解码为文本 - 匹配目标行:
regex_search的正则^item\s*=\s*(.*?)(?:\s*#.*)?$实现:^item:匹配以item开头的行\s*=\s*:匹配等号前后任意数量的空格(.*?):非贪婪匹配值部分(直到注释或行尾)(?:\s*#.*)?:可选匹配行尾的注释部分(非捕获组,不参与结果提取)
- 提取数字值:
regex_replace的正则^item\s*=\s*(["\']?)(\d+)\1?.*$实现:(["\']?):匹配可选的单/双引号(允许无引号)(\d+):捕获核心数字值部分\1?:匹配可选的闭合引号(允许引号不匹配的情况)- 替换为
\2,即最终提取的数字部分
内容的提问来源于stack exchange,提问作者ferdinand
相关产品推荐
相关产品推荐

