Automatisierung ist das ideale IT- und DevOps-Ideal, aber meiner Erfahrung nach kann alles, was nicht sofort bequem ist, auch gar nicht existieren. Es gab viele Male, in denen ich eine ziemlich gute Lösung für eine Aufgabe gefunden habe, und ich werde sie sogar skripten, aber ich höre auf, sie buchstäblich zu automatisieren, weil die Infrastruktur für eine einfache Automatisierung auf der Maschine nicht vorhanden ist Ich arbeite an.
Mein bevorzugtes einfaches Automatisierungstool war früher das Cron-System – alt, zuverlässig, benutzerorientiert und (abgesehen von einer Planungssyntax, die ich nie in den Speicher festlegen kann) einfach. Das Problem mit cron besteht jedoch darin, dass davon ausgegangen wird, dass ein Computer jeden Tag 24 Stunden am Tag eingeschaltet ist. Nachdem ich zu viele geplante Backups verpasst hatte, entdeckte ich anacron, das Cron-System, das auf Zeitstempeln und nicht auf geplanten Zeiten basiert. Wenn Ihr Computer ausgeschaltet ist, während ein Job normalerweise ausgeführt worden wäre, stellt anacron sicher, dass er ausgeführt wird, wenn der Computer wieder eingeschaltet ist. Das Erstellen eines Jobs ist so einfach wie das Ablegen eines Shell-Skripts in eines von drei Verzeichnissen: cron.daily
, cron.weekly
, oder cron.monthly
(Sie können mehr definieren, wenn Sie möchten). Mit anacron setze ich Skripte und Ansible-Playbooks für alle möglichen trivialen Aufgaben ein, einschließlich Pop-up-Erinnerungen an bevorstehende Fälligkeitstermine oder Ereignisse.
Es ist eine einfache und offensichtliche Lösung für ein modernes Problem, aber es nützt mir nichts, wenn Anacron nicht auf dem Computer installiert ist.
Software-Setup mit Ansible
Jedes Mal, wenn ich einen neuen Computer einrichte, sei es ein Laptop, eine Workstation oder ein Server, installiere ich anacron. Das ist einfach, aber eine anacron-Installation bietet nur den anacron-Befehl. Es richtet nicht die anacron-Benutzerumgebung ein. Also habe ich ein Ansible-Playbook erstellt, um einzurichten, was der Benutzer benötigt, um anacron zu verwenden und den anacron-Befehl zu installieren.
Zuerst die Standard-Ansible-Boilerplate:
---
- hosts: localhost
tasks:
Verzeichnisse erstellen mit Ansible
Als nächstes erstelle ich den Verzeichnisbaum, den ich für Anacron verwende. Sie können sich dies als eine Art transparente Crontab vorstellen.
- name: create directory tree
ansible.builtin.file:
path: "{{ item }}"
state: directory
with_items:
- '~/.local/etc/cron.daily'
- '~/.local/etc/cron.weekly'
- '~/.local/etc/cron.monthly'
- '~/.var/spool/anacron'
Die Syntax davon mag etwas seltsam erscheinen, aber es ist eigentlich eine Schleife. Die with_items:
Direktive definiert vier zu erstellende Verzeichnisse und Ansible iteriert über die ansible.builtin.file:
-Anweisung einmal für jedes Verzeichnis (der Verzeichnisname füllt die {{ item }}
Variable). Wie bei allem in Ansible gibt es keinen Fehler oder Konflikt, wenn das Verzeichnis bereits existiert.
Kopieren von Dateien mit Ansible
Die ansible.builtin.copy
-Modul kopiert Dateien von einem Ort zum anderen. Damit dies funktioniert, musste ich eine Datei namens . erstellen anacrontab
. Es ist kein Ansible-Playbook, also behalte ich es in meinem ~/Ansible/data
Verzeichnis, in dem ich Support-Dateien für meine Playbooks aufbewahre.
- name: copy anacrontab into place
ansible.builtin.copy:
src: ~/Ansible/data/anacrontab
dest: ~/.local/etc/anacrontab
mode: '0755'
Mein anacrontab
Datei ist einfach und ahmt die Datei nach, in der einige Distributionen standardmäßig installiert sind /etc/anacron
:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1 0 cron.day run-parts $HOME/.local/etc/cron.daily/
7 0 cron.wek run-parts $HOME/.local/etc/cron.weekly/
30 0 cron.mon run-parts $HOME/.local/etc/cron.monthly/
Ausführen von Anacron bei der Anmeldung
Die meisten Linux-Distributionen konfigurieren anacron zum Lesen von Jobs aus /etc/anacron
. Ich benutze Anacron meistens als normaler Benutzer, also starte ich Anacron von meinem Login aus ~/.profile
. Ich möchte nicht daran denken müssen, das selbst zu konfigurieren, also lasse ich Ansible es tun. Ich verwende das ansible.builtin.lineinfile
Modul, das erstellt ~/.profile
falls noch nicht vorhanden, und fügt die Anacron-Startzeile ein.
- name: add local anacrontab to .profile
ansible.builtin.lineinfile:
path: ~/.profile
regexp: '^/usr/sbin/anacron'
line: '/usr/sbin/anacron -t ~/.local/etc/anacrontab'
create: true
Anacron mit Ansible installieren
Für die meisten meiner Systeme ist die dnf
Modul würde für die Paketinstallation funktionieren, aber meine Workstation führt Slackware aus (die verwendet slackpkg
) und manchmal kommt eine andere Linux-Distribution in meine Sammlung. Die ansible.builtin.package
Das Modul bietet eine generische Schnittstelle zur Paketinstallation, daher verwende ich es für dieses Playbook. Zum Glück habe ich kein Repo mit Namen gefunden anacron
alles andere als anacron
, also muss ich vorerst keine potenziellen Unterschiede in den Paketnamen berücksichtigen.
Dies ist eigentlich ein separates Spiel, da die Paketinstallation eine Rechteeskalation erfordert, die von der . bereitgestellt wird becomes: true
Richtlinie.
- hosts: localhost
become: true
tasks:
- name: install anacron
ansible.builtin.package:
name: anacron
state: present
Verwendung von Anacron und Ansible für eine einfache Automatisierung
Um Anacron mit Ansible zu installieren, führe ich das Playbook aus:
$ ansible-playbook ~/Ansible/setup-anacron.yaml
Von da an kann ich Shell-Skripte schreiben, um eine triviale, aber sich wiederholende Aufgabe auszuführen, und sie in kopieren ~/.local/etc/cron.daily
um es einmal täglich (oder ungefähr) automatisch ausführen zu lassen. Ich schreibe auch Ansible-Playbooks für Aufgaben wie das Aufräumen meines Download-Ordners. Ich lege meine Playbooks in ~/Ansible
, dort bewahre ich meine Ansible-Spiele auf und erstelle dann ein Shell-Skript in ~/.local/etc/cron.daily
das Stück auszuführen. Es ist einfach, schmerzlos und wird schnell zur zweiten Natur.