自动化是伟大的 IT 和 DevOps 理想,但以我的经验来看,任何不立即方便的东西都可能形同虚设。很多时候,我都为某些任务提出了相当不错的解决方案,甚至编写了脚本,但我没有进一步实现真正的自动化,因为我正在使用的机器上不存在易于自动化的基础设施。
我最喜欢的简单自动化工具曾经是 cron 系统——古老、可靠、面向用户,而且(除了我永远记不住的调度语法)简单。然而,cron 的问题在于它假设计算机每天 24 小时、每天都开机。在错过太多次计划备份后,我发现了 anacron,这是一个基于时间戳而不是计划时间的 cron 系统。如果您的计算机在通常应该运行作业时处于关闭状态,anacron 会确保在计算机重新启动后运行该作业。创建作业就像将 shell 脚本放入以下三个目录之一一样简单:cron.daily
、cron.weekly
或 cron.monthly
(如果需要,您可以定义更多)。借助 anacron,我发现自己放置脚本和 Ansible playbook 来处理各种琐碎的任务,包括弹出即将到期日期或事件的提醒。
对于现代问题来说,这是一个简单而明显的解决方案,但如果计算机上未安装 anacron,则对我没有任何好处。
使用 Ansible 进行软件设置
每次我设置新计算机时,无论是笔记本电脑、工作站还是服务器,我都会安装 anacron。这很简单,但 anacron 安装仅提供 anacron 命令。它不设置 anacron 用户环境。因此,我创建了一个 Ansible playbook 来设置用户使用 anacron 所需的环境并安装 anacron 命令。
首先,是标准的 Ansible 样板代码
---
- hosts: localhost
tasks:
使用 Ansible 创建目录
接下来,我创建用于 anacron 的目录树。您可以将其视为一种透明的 crontab。
- 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'
此语法的结构可能看起来有点奇怪,但它实际上是一个循环。with_items:
指令定义了要创建的四个目录,Ansible 对每个目录迭代一次 ansible.builtin.file:
指令(目录名称填充 {{ item }}
变量)。与 Ansible 中的所有内容一样,如果目录已存在,则不会出现错误或冲突。
使用 Ansible 复制文件
ansible.builtin.copy
模块将文件从一个位置复制到另一个位置。为了使其工作,我需要创建一个名为 anacrontab
的文件。它不是 Ansible playbook,所以我将其保存在我的 ~/Ansible/data
目录中,我在其中保存 playbook 的支持文件。
- name: copy anacrontab into place
ansible.builtin.copy:
src: ~/Ansible/data/anacrontab
dest: ~/.local/etc/anacrontab
mode: '0755'
我的 anacrontab
文件很简单,并且模仿了一些发行版默认安装到 /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/
在登录时运行 anacron
大多数 Linux 发行版都配置 anacron 以从 /etc/anacron
读取作业。我主要将 anacron 用作普通用户,因此我从我的登录 ~/.profile
启动 anacron。我不想记住自己配置它,所以我让 Ansible 来完成。我使用 ansible.builtin.lineinfile
模块,如果 ~/.profile
尚不存在,则创建它并插入 anacron 启动行。
- 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
使用 Ansible 安装 anacron
对于我的大多数系统,dnf
模块适用于软件包安装,但我的工作站运行 Slackware(使用 slackpkg
),有时不同的 Linux 发行版会进入我的收藏。ansible.builtin.package
模块为软件包安装提供了通用接口,所以我将其用于此 playbook。幸运的是,我还没有遇到过将 anacron
命名为 anacron
以外名称的仓库,所以目前,我不必考虑软件包名称的潜在差异。
这实际上是一个单独的 play,因为软件包安装需要特权提升,由 becomes: true
指令提供。
- hosts: localhost
become: true
tasks:
- name: install anacron
ansible.builtin.package:
name: anacron
state: present
使用 anacron 和 Ansible 进行轻松自动化
要使用 Ansible 安装 anacron,我运行 playbook
$ ansible-playbook ~/Ansible/setup-anacron.yaml
从那时起,我可以编写 shell 脚本来执行一些琐碎但重复的任务,并将其复制到 ~/.local/etc/cron.daily
中,使其每天自动运行一次(或大约一次)。我还为诸如 清理我的下载文件夹 之类的任务编写 Ansible playbook。我将我的 playbook 放在 ~/Ansible
中,这是我保存 Ansible play 的位置,然后在 ~/.local/etc/cron.daily
中创建一个 shell 脚本来执行 play。它简单、轻松,并且很快就会成为第二天性。
评论已关闭。