Ansible中AnsibleUnsafeText转int返回0的问题排查
问题原因分析
从你的debug输出能明确看到:myvar的实际值是带单引号的字符串'5002',而非纯数字字符串5002。Ansible的int过滤器在处理包含非数字字符(此处为单引号)的字符串时,无法解析出有效数字,就会返回默认值0——这就是你得到myvar ---> 0的核心原因。
至于myvar为何带单引号,大概率是你的源文件file.txt中,number行的格式是类似number = '5002'(值被单引号包裹),而你当前的正则表达式regex_replace('.*= *(.*)$', '\\\\1')会把等号后的所有内容(包括单引号)全部提取出来,最终得到带引号的字符串。
解决办法
可以通过以下两种方式修复:
方式一:修改正则表达式,直接提取纯数字
调整regex_replace的匹配规则,忽略值前后的单/双引号,只提取中间的数字部分:
- name: set regex for myvar ansible.builtin.set_fact: myvar: "{{ config.stdout | regex_search('^number *= *.*', multiline=True) | regex_replace('.*= *[\'"]?(.*?)[\'"]?$', '\\1') }}"
方式二:转换为整数前先移除单引号
在使用int过滤器前,先用replace去掉字符串里的单引号:
- name: debug myvar ansible.builtin.debug: msg: - myvar ---> {{ myvar | replace("'", "") | int }}
额外优化:简化set_fact写法
你原来的set_fact用了块字符串|-,其实可以直接写成单行,避免不必要的格式问题:
- name: set regex for myvar ansible.builtin.set_fact: myvar: "{{ config.stdout | regex_search('^number *= *.*', multiline=True) | regex_replace('.*= *[\'"]?(.*?)[\'"]?$', '\\1') }}"
内容的提问来源于stack exchange,提问作者ferdinand
相关产品推荐
相关产品推荐

