Ansibleでsystemd.timerを設定する
Ansibleでsystemd.timerを設定する
Amazon Linux 2023 (AL2023) では、従来の cron がデフォルトでインストールされておらず、定期的なタスクの管理には systemd.timer への移行が推奨されています。
Ansible を使用してこの systemd.timer を設定してみました。
参考:systemd timers replace cron
(systemd.timer の詳細な説明は本記事では割愛します。)
事前準備
systemd.timer の設定には、以下のファイルが必要です。
- service ファイル: 実行するコマンドの内容を定義します。
- timer ファイル: 実行するスケジュール (頻度やタイミング) を定義します。
- 実行スクリプト: service ファイルから呼び出されるコマンドのスクリプトファイル (今回はサーバーにすでにあるものを利用する前提とします)。
systemd.timer の基本的な設定の流れ
systemd.timer を手動で設定する場合、一般的に以下の手順となります。
- service ファイルと timer ファイルを /etc/systemd/system/ ディレクトリに配置します。
- タイマーを起動します
systemctl start <配置したファイル名>.timer
- 自動起動を設定します
systemctl enable <配置したファイル名>.timer
- systemd の設定を再読み込みし、変更を反映させます
systemctl daemon-reload
Ansible で systemd.timer を設定する
ここでは、service ファイルで指定する実行スクリプトはすでにターゲットサーバーに存在していることを前提として、Ansible で systemd.timer を設定する Playbook の例を示します。
Playbook
- name: systemd.timer の設定
hosts: your_target_servers # ターゲットとなるサーバーのグループ名やホスト名
become: true # root 権限で実行
tasks:
- name: service ファイルの配置
copy:
src: roles/common/files/ansible_test.service
dest: /etc/systemd/system/ansible_test.service
owner: root
group: root
mode: 0644
notify: Reload systemd daemon # ハンドラーをトリガー
- name: timer ファイルの配置
copy:
src: roles/common/files/ansible_test.timer
dest: /etc/systemd/system/ansible_test.timer
owner: root
group: root
mode: 0644
notify: Reload systemd daemon # ハンドラーをトリガー
- name: systemd.timer の起動と自動起動
systemd:
name: ansible_test.timer
state: started
enabled: yes
daemon_reload: no # copy モジュールで notify を使用しているため不要
handlers:
- name: Reload systemd daemon
systemd:
daemon_reload: yes
Playbook の解説
serviceファイル、timerファイルの配置 タスク
copy モジュールを使用して、ローカルの ansible_test.service、ansible_test.timer ファイルをターゲットサーバーの /etc/systemd/system/ 以下にコピーします。
ファイルの所有者 (owner)、グループ (group)、パーミッション (mode) を適切に設定します。
notify: Reload systemd daemon を指定することで、このタスクが完了したら Reload systemd daemon という名前のハンドラーをトリガーします。
systemd.timer の起動と自動起動 タスク
systemd モジュールを使用して、ansible_test.timer サービスを操作します。
state: started により、タイマーを起動します。
enabled: yes により、システム起動時にタイマーが自動的に起動するように設定します。
daemon_reload: no を指定しているのは、前の copy モジュールでハンドラー (Reload systemd daemon) を使用して設定の再読み込みを行うため、ここでは不要となるからです。
Reload systemd daemon ハンドラー
systemd モジュールで daemon_reload: yes
を指定することで、systemd の設定を再読み込みします。これにより、配置した service ファイルと timer ファイルが systemd に認識されます。
設定後の確認
Ansible で systemd.timer を設定した後、正しく登録され、実行されているかを確認するためのコマンドを紹介します。
登録されたタイマーの確認
ターゲットサーバー上で以下のコマンドを実行すると、登録されている systemd タイマーの一覧が表示されます。
systemctl list-timers
このコマンドの出力には、各タイマーの次の実行予定時間、前回の実行時間、状態などが表示されます。設定したタイマー (ansible_test.timer など) がリストに表示されていることを確認してください。
実行ログの確認
特定のタイマーの実行ログを確認するには、journalctl コマンドを使用します。<タイマー名> の部分には、設定したタイマーのファイル名 (拡張子 .timer を除く) を指定します。
sudo journalctl -u <タイマー名>
例えば、ansible_test.timer の実行ログを確認する場合は、以下のコマンドを実行します。
sudo journalctl -u ansible_test
このコマンドを実行すると、ansible_test.service によって実行されたコマンドの出力やエラーメッセージなどを確認することができます。
タイマーが意図した通りに実行されているかを確認する際に役立ちます。
Discussion