如何修正Ansible正则提取vault_sealed布尔值为正确true?
问题原因及修复方案
问题根源
你的正则匹配返回的是列表类型(例如['true']),但你直接将其与字符串'true'做相等比较,两者类型不匹配,因此判断结果为False。另外,表达式末尾多余的空格会导致最终结果带空格(比如"False "),这也是需要修正的细节。
修复方案
方案一:修正正则匹配结果的类型判断
调整set_fact的表达式,从匹配到的列表中取出第一个元素再做比较,同时去掉末尾空格:
- ansible.builtin.set_fact: vault_sealed: "{{ (vault_status.stdout | regex_search(regexp, '\\1') | first) == 'true' }}" vars: regexp: "Sealed\\s+(.+)\\n"
或者直接通过索引取值:
- ansible.builtin.set_fact: vault_sealed: "{{ (vault_status.stdout | regex_search(regexp, '\\1'))[0] == 'true' }}" vars: regexp: "Sealed\\s+(.+)\\n"
方案二:简化正则匹配逻辑
不用捕获组,直接匹配Sealed行并提取值:
- ansible.builtin.set_fact: vault_sealed: "{{ vault_status.stdout | regex_search('Sealed\\s+(true|false)') | split() | last == 'true' }}"
方案三:直接解析键值行(推荐)
利用stdout_lines筛选Sealed开头的行,拆分后取对应值,这种方式更稳定,不受换行或空格数量影响:
- ansible.builtin.set_fact: vault_sealed: "{{ (vault_status.stdout_lines | select('match', '^Sealed') | first).split() | last == 'true' }}"
验证效果
修改后,当stdout中Sealed的值为true时,vault_sealed会被正确设置为布尔值True;反之则为False,且不会带有多余空格。
内容的提问来源于stack exchange,提问作者Wurzelseppi
相关产品推荐
相关产品推荐

