我如何使用 Ansible 和 anacron 进行自动化

借助 anacron,我可以放置脚本和 Ansible playbook 来处理各种琐碎的任务。
38 位读者喜欢这篇文章。
Woman programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

自动化是伟大的 IT 和 DevOps 理想,但以我的经验来看,任何不立即方便的东西都可能形同虚设。很多时候,我都为某些任务提出了相当不错的解决方案,甚至编写了脚本,但我没有进一步实现真正的自动化,因为我正在使用的机器上不存在易于自动化的基础设施。

我最喜欢的简单自动化工具曾经是 cron 系统——古老、可靠、面向用户,而且(除了我永远记不住的调度语法)简单。然而,cron 的问题在于它假设计算机每天 24 小时、每天都开机。在错过太多次计划备份后,我发现了 anacron,这是一个基于时间戳而不是计划时间的 cron 系统。如果您的计算机在通常应该运行作业时处于关闭状态,anacron 会确保在计算机重新启动后运行该作业。创建作业就像将 shell 脚本放入以下三个目录之一一样简单:cron.dailycron.weeklycron.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。它简单、轻松,并且很快就会成为第二天性。

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算行业工作,而且经常同时进行。

评论已关闭。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.