You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何断言字符串符合指定规则?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

新增逻辑说明

  1. 长度校验:直接通过vm_name | length <=15明确限制长度,修复原代码切片逻辑无法完全拦截超长字符的问题
  2. 连字符数量校验:用regex_findall('-')统计连字符个数,确保最多出现一次
  3. 位置校验:通过逻辑判断覆盖两种合法场景——要么没有连字符,要么连字符恰好处于第6位(对应字符串索引5)

内容的提问来源于stack exchange,提问作者southwind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:32:09