如何断言字符串符合指定规则?Ansible中vm_name变量验证
Ansible VM名称校验逻辑补充
校验规则
- 名称长度最多15个字符
- 仅允许包含字母(大小写)、数字和最多一个连字符
-,禁止下划线及@#$%等特殊字符 - 连字符只能出现在第6位(从1开始计数),无连字符也合法,超过一个或位置不对均判定无效
原校验代码
- name: Validate VM Name hosts: localhost vars: vm_name: abcde-123456789 tasks: - name: Validate vm_name ansible.builtin.assert: that: "( vm_name | regex_findall('[A-Za-z0-9-]'))[:15] | join | length == vm_name | length" fail_msg: "incorrect vm_name:{{ vm_name }} ,valid options are: max 15 characters, [0-9], [a-z], [A-Z],-, no special characters like #$%*&" success_msg: "vm_name: {{ vm_name }} has been successfully validated" register: validate_vm_name_out
补充完整后的校验代码
- name: Validate VM Name hosts: localhost vars: vm_name: abcde-123456789 tasks: - name: Validate vm_name ansible.builtin.assert: that: # 校验无非法字符 - "(vm_name | regex_findall('[A-Za-z0-9-]')) | join | length == vm_name | length" # 校验长度不超过15字符 - "vm_name | length <= 15" # 校验连字符数量最多1个 - "(vm_name | regex_findall('-')) | length <= 1" # 校验连字符位置:无连字符 或 连字符在第6位(索引从0开始为第5位) - "('-' not in vm_name) or (vm_name[5] == '-')" fail_msg: >- 无效的vm_name: {{ vm_name }},合法规则: 1. 长度不超过15个字符 2. 仅允许字母、数字和最多一个连字符 3. 连字符只能出现在第6位 success_msg: "vm_name: {{ vm_name }} 校验通过" register: validate_vm_name_out
新增逻辑说明
- 长度校验:直接通过
vm_name | length <=15明确限制长度,修复原代码切片逻辑无法完全拦截超长字符的问题 - 连字符数量校验:用
regex_findall('-')统计连字符个数,确保最多出现一次 - 位置校验:通过逻辑判断覆盖两种合法场景——要么没有连字符,要么连字符恰好处于第6位(对应字符串索引5)
内容的提问来源于stack exchange,提问作者southwind
相关产品推荐
相关产品推荐

