Some checks failed
PR Checklist / pr-checklist (pull_request) Failing after 1m27s
Implements the Ansible Infrastructure as Code story from KT 2026-04-08. One canonical Ansible playbook defines: - Deadman switch (snapshot good config on health, rollback+restart on death) - Golden state config deployment (Anthropic BANNED, Kimi→Gemini→Ollama) - Cron schedule (source-controlled, no manual crontab edits) - Agent startup sequence (pull→validate→start→verify) - request_log telemetry table (every inference call logged) - Thin config pattern (immutable local pointer to upstream) - Gitea webhook handler (deploy on merge) - Config validator (rejects banned providers) Fleet inventory: Timmy (Mac), Allegro (VPS), Bezalel (VPS), Ezra (VPS) Roles: wizard_base, golden_state, deadman_switch, request_log, cron_manager Addresses: timmy-config #442, #443, #444, #445, #446 References: KT Final 2026-04-08 P2, KT Bezalel 2026-04-08 #1-#5
56 lines
1.9 KiB
YAML
56 lines
1.9 KiB
YAML
---
|
|
# =============================================================================
|
|
# cron_manager/tasks — Source-Controlled Cron Jobs
|
|
# =============================================================================
|
|
# All cron jobs are defined in group_vars/wizards.yml.
|
|
# No manual crontab edits. This is the only way to manage cron.
|
|
# =============================================================================
|
|
|
|
- name: "Deploy managed cron jobs"
|
|
cron:
|
|
name: "{{ item.name }}"
|
|
job: "{{ item.job }}"
|
|
minute: "{{ item.minute | default('*') }}"
|
|
hour: "{{ item.hour | default('*') }}"
|
|
day: "{{ item.day | default('*') }}"
|
|
month: "{{ item.month | default('*') }}"
|
|
weekday: "{{ item.weekday | default('*') }}"
|
|
state: "{{ 'present' if item.enabled else 'absent' }}"
|
|
user: "{{ ansible_user | default('root') }}"
|
|
loop: "{{ cron_jobs }}"
|
|
when: cron_jobs is defined
|
|
|
|
- name: "Deploy deadman switch cron (fallback if systemd timer unavailable)"
|
|
cron:
|
|
name: "Deadman switch — {{ wizard_name }}"
|
|
job: "{{ wizard_home }}/deadman_action.sh >> {{ timmy_log_dir }}/deadman-{{ wizard_name }}.log 2>&1"
|
|
minute: "*/5"
|
|
hour: "*"
|
|
state: present
|
|
user: "{{ ansible_user | default('root') }}"
|
|
when: deadman_enabled and machine_type != 'vps'
|
|
# VPS machines use systemd timers instead
|
|
|
|
- name: "Remove legacy cron jobs (cleanup)"
|
|
cron:
|
|
name: "{{ item }}"
|
|
state: absent
|
|
user: "{{ ansible_user | default('root') }}"
|
|
loop:
|
|
- "legacy-deadman-watch"
|
|
- "old-health-check"
|
|
- "backup-deadman"
|
|
ignore_errors: true
|
|
|
|
- name: "List active cron jobs"
|
|
shell: "crontab -l 2>/dev/null | grep -v '^#' | grep -v '^$' || echo 'No cron jobs found.'"
|
|
register: active_crons
|
|
changed_when: false
|
|
|
|
- name: "Report cron status"
|
|
debug:
|
|
msg: |
|
|
{{ wizard_name }} cron jobs deployed.
|
|
Active:
|
|
{{ active_crons.stdout }}
|