ansible 没有 cron_var 模块,应使用 ansible.builtin.cron 模块的 env: true 参数结合 inventory 动态变量注入灰度环境变量,辅以 lineinfile 或 template 实现全局或复杂场景配置,确保幂等性与节点绑定。

Ansible 没有内置的 cron_var 模块。这是关键前提——官方 Ansible 核心模块中 不存在 cron_var 这个模块,也无任何标准模块专门用于“向 crontab 中注入环境变量”。
但你的需求非常真实且常见:在数十台线上节点上,为 cron 任务动态设置不同的灰度环境变量(如 ENV=gray-v2, CANARY_RATIO=5%),且需与节点角色/分组/标签强绑定,避免硬编码、支持批量和幂等性。
下面是真正可行、生产验证过的高效做法:
用 `ansible.builtin.cron` 模块 + `env:` 参数写入环境变量
这是最直接、最可靠的方式。`cron` 模块原生支持 `env: true` 和 `name:` 指定变量名,可为每个 cron job 单独声明环境变量,且自动写入 crontab 的 `@reboot` 或定时行上方(符合 crontab 规范):
- name: 部署灰度 cron 任务并注入环境变量
ansible.builtin.cron:
name: "run-gray-job"
minute: "*/5"
job: "/opt/bin/health-check.sh"
env: true
# 动态取值:从 inventory 变量、group_vars 或 hostvars 获取
value: "{{ gray_env_var | default('ENV=prod') }}"
state: present
然后在 inventory 中按节点/分组定义灰度变量:
# inventory/production [gray-canary] web01 ansible_host=10.1.1.11 web02 ansible_host=10.1.1.12 [gray-canary:vars] gray_env_var="ENV=gray CANARY_RATIO=5% TRACE_ID_PREFIX=canary-" [gray-stable] web03 ansible_host=10.1.1.21 web04 ansible_host=10.1.1.22 [gray-stable:vars] gray_env_var="ENV=stable CANARY_RATIO=0% TRACE_ID_PREFIX=stable-"
用 `lineinfile` 精确管理 crontab 全局环境变量(适合全节点统一前缀)
若需在所有 cron 执行前统一加载灰度上下文(比如全局 `export CANARY_CONFIG_PATH=/etc/canary/v2`),不推荐改 `/etc/environment`(不被 cron 读取),而应写入用户 crontab 头部:
- name: 设置 crontab 全局灰度环境头
ansible.builtin.lineinfile:
path: "/var/spool/cron/{{ ansible_user }}"
line: "{{ item.key }}={{ item.value }}"
insertbefore: "^# Ansible managed"
create: true
loop: "{{ gray_global_env | default({}) | dict2items }}"
配合变量:
# group_vars/gray-canary.yml gray_global_env: ENV: "gray" CANARY_CONFIG_VERSION: "v2" LOG_LEVEL: "debug"
避免踩坑:crontab 环境变量生效的 3 个关键事实
- cron 不继承 shell profile:`.bashrc`/`.profile` 中的 export 对 cron 无效,必须显式声明或写入 crontab 头部
- 环境变量作用域是单条 cron 行:用 `cron` 模块设 `env: true` 时,变量只对该 `name` 任务生效;多个任务需分别定义
- 路径和 Shell 差异:cron 默认用 `/bin/sh`,建议脚本开头写 `#!/usr/bin/env bash`,并在 `job:` 中显式调用 `bash -c '...'` 保证兼容性
进阶:用 template + cron 组合实现复杂灰度逻辑
当灰度变量需运行时计算(如基于 IP 哈希分配 slot)、或需多行环境配置时,用模板生成完整 crontab 片段更灵活:
- name: 渲染灰度 crontab 片段
ansible.builtin.template:
src: crontab-gray.j2
dest: /tmp/crontab-gray-{{ ansible_hostname }}
vars:
dynamic_slot: "{{ (ansible_eth0.ipv4.address | hash('md5') | int(0, 0, '0x') % 100) | string }}"
- name: 加载灰度 crontab 到用户计划任务
ansible.builtin.cron:
name: "gray-task"
special_time: "reboot"
job: "source /tmp/crontab-gray-{{ ansible_hostname }} && /opt/bin/run.sh"
state: present
模板 crontab-gray.j2 内容示例:
# Gray context generated on {{ ansible_date_time.iso8601 }}
ENV=gray
SLOT={{ dynamic_slot }}
VERSION={{ gray_version | default('v2') }}
不复杂但容易忽略。核心就一条:用好 cron 模块的 env:true + 动态变量注入,再辅以 inventory 分组驱动,即可干净、幂等、可审计地管理数十节点的灰度 cron 环境。











