Ansible办公时间条件任务使用个位数整数值时被跳过问题排查
异常根因
异常本质是比较时两边值都是字符串类型,触发字典序比较而非数值比较:
ansible_date_time.hour是Ansible采集事实时返回的字符串类型值,在set_fact赋值时用双引号包裹模板,最终cur_time变量也是字符串类型。- 判断条件里的阈值
"9"、"19"也被引号标记为字符串,此时when语句不会按数值大小判断,而是逐位对比字符的ASCII码值:- 字符
1的ASCII码小于9,所以字符串比较下"9" > "19"、"9" > "10",当个位数阈值为9时,9点整的时间值会被判定为大于上限19,条件不成立,任务直接跳过。 - 阈值为两位数时,10~18点的时间字符串逐位对比的结果刚好和数值比较结果巧合一致,所以看起来运行正常,本质是逻辑错误下的偶现正确结果,比如9点和两位数阈值比较时依然会判定失败。
- 字符
另外提供的原始playbook存在YAML缩进错误,首个debug任务和后续任务缩进层级不一致,运行前需要将所有task对齐到同一缩进层级,否则会直接报语法错误。
修复方法
两种方案任选其一即可,核心是统一比较两边的类型为整数:
- 方案1:比较时临时转换类型,无需修改变量赋值逻辑,直接修改条件判断语句:
注意阈值不要加引号,直接写整数。when: cur_time | int >= 9 and cur_time | int <= 19 - 方案2:变量赋值时就存为整数类型,后续所有比较直接用数值即可:
对应条件语句去掉阈值的引号:- name: Set variables set_fact: cur_time: "{{ ansible_date_time.hour | int }}"when: cur_time >= 9 and cur_time <= 19
修复后完整可用Playbook示例
name: ansible date and time output hosts: localhost tasks: - name: define ansible variable debug: var: ansible_date_time - name: Print msg variable debug: msg: "{{ ansible_date_time.hour }}" - name: Set variables set_fact: cur_time: "{{ ansible_date_time.hour | int }}" - name: Print Current time debug: msg: "{{ cur_time }}" - name: Apply the condition for working office hours debug: msg: "Condition is successful" when: cur_time >= 9 and cur_time <= 19
内容的提问来源于stack exchange,提问作者Ansible Explorer
相关产品推荐
相关产品推荐

