parent
309a686aec
commit
52f0e5b35d
7 changed files with 173 additions and 1 deletions
@ -0,0 +1,21 @@ |
||||
# timers |
||||
|
||||
This roles manage systemd timers, to execute commands at regular interval. |
||||
Just define the timers you want at the host, or group level, like : |
||||
|
||||
``` |
||||
system_timers: |
||||
- id: db-janitor # Just an identifier for the task |
||||
calendar: '*:0/30' # See man systemd.timer for examples |
||||
max_duration: 1h # Max duration of the task. Will be terminated if it takes longer |
||||
command: | |
||||
#!/bin/bash |
||||
psql -U postgres -d reports -w << _EOF |
||||
delete from audit where time < now()-'7 day'::interval; |
||||
_EOF |
||||
- id: logrotate |
||||
calendar: daily |
||||
command: logrotate -f /etc/logrotate.d/myservice.conf |
||||
``` |
||||
|
||||
Look at the defaults/main.yml file for more info |
@ -0,0 +1,4 @@ |
||||
--- |
||||
|
||||
dependencies: |
||||
- role: mkdir |
@ -0,0 +1,12 @@ |
||||
--- |
||||
|
||||
- name: Merge timer settings with defaults |
||||
set_fact: system_timers_conf={{ system_timers_conf | default([]) + [ system_timer_defaults | combine(item, recursive=True) ] }} |
||||
loop: "{{ system_timers }}" |
||||
tags: system,cron |
||||
- set_fact: system_timers={{ system_timers_conf | default([]) }} |
||||
tags: system,cron |
||||
|
||||
- name: Build a list of managed timers |
||||
set_fact: system_timers_managed={{ system_timers | map(attribute='id') | list }} |
||||
tags: system,cron |
@ -0,0 +1,94 @@ |
||||
--- |
||||
|
||||
- name: Create script dir |
||||
file: path=/opt/ansible/timers state=directory |
||||
tags: system,cron |
||||
|
||||
- name: List unmanaged scripts |
||||
shell: find /opt/ansible/timers -maxdepth 1 -mindepth 1 -type f -exec basename "{}" \; |
||||
changed_when: False |
||||
register: system_timers_current_scripts |
||||
tags: system,cron |
||||
|
||||
- name: Remove unmanaged timer's scripts |
||||
file: path=/opt/ansible/timers/{{ item }} state=absent |
||||
when: item not in system_timers_managed |
||||
loop: "{{ system_timers_current_scripts.stdout_lines }}" |
||||
tags: system,cron |
||||
|
||||
- name: List unmanaged timers service unit |
||||
shell: find /etc/systemd/system -maxdepth 1 -mindepth 1 -type f -name timer-ansible-*.service -exec basename "{}" \; | perl -pe 's/timer\-ansible\-([\w\-_]+)\.service/$1/g' |
||||
changed_when: False |
||||
register: system_timers_current_service |
||||
tags: system,cron |
||||
|
||||
- name: Disable unmanaged timers |
||||
systemd: name=timer-ansible-{{ item }}.timer state=stopped enabled=False |
||||
when: item not in system_timers_managed |
||||
loop: "{{ system_timers_current_service.stdout_lines }}" |
||||
tags: system,cron |
||||
|
||||
- name: Remove unmanaged timers service unit |
||||
file: path=/etc/systemd/system/timer-ansible-{{ item.0 }}.{{ item.1 }} state=absent |
||||
when: item.0 not in system_timers_managed |
||||
with_nested: |
||||
- "{{ system_timers_current_service.stdout_lines }}" |
||||
- - service |
||||
- timer |
||||
tags: system,cron |
||||
|
||||
- name: Deploy scripts |
||||
copy: |
||||
content: | |
||||
{% if not item.command is search('^#!') %} |
||||
#!/bin/bash -e |
||||
{% endif %} |
||||
{{ item.command }} |
||||
dest: /opt/ansible/timers/{{ item.id }} |
||||
mode: 0700 |
||||
owner: "{{ item.user }}" |
||||
loop: "{{ system_timers }}" |
||||
tags: system,cron |
||||
|
||||
- name: Deploy service units |
||||
copy: |
||||
content: | |
||||
[Unit] |
||||
Description={{ item.description }} |
||||
|
||||
[Service] |
||||
Type=oneshot |
||||
PrivateTmp=yes |
||||
ExecStart=/opt/ansible/timers/{{ item.id }} |
||||
User={{ item.user }} |
||||
TimeoutSec={{ item.max_duration }} |
||||
StandardOutput=journal |
||||
StandardError=journal |
||||
dest: /etc/systemd/system/timer-ansible-{{ item.id }}.service |
||||
loop: "{{ system_timers }}" |
||||
tags: system,cron |
||||
|
||||
- name: Deploy timer units |
||||
copy: |
||||
content: | |
||||
[Unit] |
||||
Description={{ item.description }} |
||||
|
||||
[Timer] |
||||
OnCalendar={{ item.calendar }} |
||||
Persistent={{ item.persistent | ternary('True','False') }} |
||||
|
||||
[Install] |
||||
WantedBy=timers.target |
||||
dest: /etc/systemd/system/timer-ansible-{{ item.id }}.timer |
||||
loop: "{{ system_timers }}" |
||||
tags: system,cron |
||||
|
||||
- name: Reload systemd |
||||
systemd: daemon_reload=True |
||||
tags: system,cron |
||||
|
||||
- name: Enable timers |
||||
systemd: name=timer-ansible-{{ item.id }}.timer state={{ item.enabled | ternary('started','stopped') }} enabled={{ item.enabled }} |
||||
loop: "{{ system_timers }}" |
||||
tags: system,cron |
@ -0,0 +1,4 @@ |
||||
--- |
||||
|
||||
- include: facts.yml |
||||
- include: install.yml |
Loading…
Reference in new issue