我如何使用 Ansible 和 anacron 實現自動化
自動化是偉大的 IT 和 DevOps 理想,但根據我的經驗,可能根本不存在什麼不方便的東西。有很多次,我為某些任務想出了一個很好的解決方案,我甚至會編寫腳本,但我沒有讓它真正實現自動化,因為在我工作的機器上不存在易於自動化的基礎設施。
我最喜歡的簡易自動化工具曾經是 cron 系統,它古老、可靠、面向用戶,而且簡單(除了一個我永遠無法記住的調度語法之外)。然而,cron 的問題是,它假定一台電腦每天 24 小時都在工作。在錯過了太多預定的備份之後,我發現了 anacron,一個基於時間戳而非預定時間的 cron 系統。如果你的電腦在通常情況下運行時處於關閉狀態,anacron 會確保它在電腦重新開啟時運行。創建一個作業只需要簡單地把一個 shell 腳本放到三個目錄中:cron.day
、cron.weekly
或者 cron.monthly
(如果你想的話,你可以定義更多)。有了 anacron,我發現自己把腳本和 Ansible 劇本用在了各種瑣碎的任務中,包括彈出到期和事件提醒。
這是一個現代問題的簡單而明顯的解決方案,但如果 anacron 沒有安裝在電腦上,那它對我就沒有用。
用 Ansible 進行軟體設置
任何時候我設置一台新的計算機,無論是筆記本電腦、工作站還是伺服器,我都會安裝 anacron。這很簡單,但是 anacron 的安裝只提供了 anacron
命令。它並沒有設置 anacron 的用戶環境。所以我創建了一個 Ansible 劇本來設置用戶需要什麼來使用 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.buildin.file:
指令中為每個目錄迭代一次(目錄名填充了 {{ item }}
變數)。與 Ansible 中的一切一樣,如果目錄已經存在,不會有錯誤或衝突。
用 Ansible 複製文件
ansible.buildin.copy
模塊將文件從一個地方複製到另一個地方。為了讓它工作,我需要創建一個叫做 anacrontab
的文件。它不是 Ansible 劇本,所以我把它放在我的 ~/Ansible/data
目錄下,那裡是我的劇本的支持文件。
- 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.buildin.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.buildin.package
模塊提供了一個安裝軟體包的通用介面,所以我把它用在這個劇本上。幸運的是,我還沒有遇到一個名為 anacron
的倉庫不是 anacron
,所以現在,我不必考慮軟體包名稱的潛在差異。
這實際上是一個單獨的劇本,因為軟體包的安裝需要許可權升級,它由 becomes: true
指令提供。
- hosts: localhost
become: true
tasks:
- name: install anacron
ansible.builtin.package:
name: anacron
state: present
使用 anacron 和 Ansible 實現輕鬆自動化
為了用 Ansible 安裝 anacron,我運行該劇本:
$ ansible-playbook ~/Ansible/setup-anacron.yaml
從此,我就可以編寫 shell 腳本來執行一些瑣碎但重複的任務,然後把它複製到 ~/.local/etc/cron.daily
,讓它每天自動運行一次(或者大約如此)。我還為諸如 清理下載文件夾 之類的任務編寫了 Ansible 劇本。我把我的劇本放在 ~/Ansible
里,這是我保存 Ansible 劇本的地方,然後在 ~/.local/etc/cron.daily
里創建一個 shell 腳本來執行這個劇本。這很簡單,不費吹灰之力,而且很快成為習慣。
via: https://opensource.com/article/21/9/ansible-anacron-automation
作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive