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

用户输入含星号的crontab时间传递给Ansible cron模块报错问题

解决crontab带星号参数传递给Ansible的报错问题

问题根源

bash里的*是通配符,默认会被展开成当前目录下的所有文件名。你用read读取* 01 * * *这类输入时,变量crontab_duration实际存储的不是你输入的星号,而是当前目录的文件列表拼接后的内容,传给Ansible后自然不符合crontab的语法规则,导致bad hour错误。

解决方案

1. 修正bash读取逻辑,避免通配符展开

读取输入前临时关闭bash的glob功能,读完再恢复:

set -f  # 关闭通配符自动展开
read -p "Enter the time to run the script in the crontab (ex: * 01 * * *): " crontab_duration
set +f  # 恢复默认的glob功能

2. 传递变量给Ansible时用引号包裹

把变量传给Ansible playbook的时候,必须用双引号包裹,防止bash再次解析通配符:

ansible-playbook your_playbook.yml -e "crontab_time='$crontab_duration'"

3. Ansible Playbook中正确处理参数

推荐将crontab时间拆分成各个字段(分、时、日、月、周)传递给cron模块,避免解析歧义:

- name: 添加定时任务
  cron:
    name: "运行自定义脚本"
    minute: "{{ crontab_time.split()[0] }}"
    hour: "{{ crontab_time.split()[1] }}"
    day: "{{ crontab_time.split()[2] }}"
    month: "{{ crontab_time.split()[3] }}"
    weekday: "{{ crontab_time.split()[4] }}"
    job: "/path/to/your/script.sh"

如果要直接用time参数,确保变量被正确识别为字符串:

- name: 添加定时任务
  cron:
    name: "运行自定义脚本"
    time: "{{ crontab_time }}"
    job: "/path/to/your/script.sh"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:50:23