Ansible任务中校验输入密码符合指定规则的正确写法
Ansible 命令行传入密码的校验实现方案
需求背景
编写Ansible任务时,需要对命令行传入的password变量做两项合规校验:
- 密码长度大于8位
- 密码仅包含可打印ASCII字符
原先编写的基于fail模块的校验逻辑运行异常,错误写法如下:
- fail: msg="Password validation failed" when: password | default('') | length <= 0 | chars = ascii_letters
原写法错误点
- 过滤器链式调用逻辑错误:Jinja2中
|优先级高于比较运算符,原写法会把length <=0的布尔结果传给后续过滤器,字符校验完全不生效 - 校验规则不符合需求:
chars = ascii_letters不是Ansible合法的过滤器语法,且仅匹配大小写字母,没有覆盖数字、英文符号这类可打印ASCII字符 - 长度判断阈值错误:需求要求长度大于8位,原写法仅判断了密码非空,没有做长度校验
正确校验写法
使用Ansible内置的regex_search正则过滤器做字符范围匹配,可打印ASCII字符(不含空格)的编码范围是\x21-\x7E(对应ASCII码33-126,包含大小写字母、数字、半角英文符号),完整可运行的校验任务如下:
- name: 校验密码参数合规性 fail: msg: "密码校验不通过:密码长度需大于8位,且仅支持输入字母、数字、半角符号类可打印ASCII字符" when: - (password | default('') | length <= 8) or (not (password | default('') | regex_search('^[\\x21-\\x7E]+$')))
规则调整说明
- 如果需要允许密码中包含空格(空格ASCII码为32,属于可打印字符),将正则部分替换为
^[\\x20-\\x7E]+$即可 - 如果需要交互式输入密码避免明文留在命令历史,可以搭配
vars_prompt实现,示例配置:
vars_prompt: - name: password prompt: "请输入用户密码" private: yes # 输入时不显示明文 confirm: yes # 要求二次确认输入
内容的提问来源于stack exchange,提问作者Poojitha
相关产品推荐
相关产品推荐

