🕰️

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 を手動で設定する場合、一般的に以下の手順となります。

  1. service ファイルと timer ファイルを /etc/systemd/system/ ディレクトリに配置します。
  2. タイマーを起動します
    systemctl start <配置したファイル名>.timer
    
  3. 自動起動を設定します
    systemctl enable <配置したファイル名>.timer
    
  4. 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