Ansible Cron モジュール

AnsibleBeginner
オンラインで実践に進む

はじめに

Ansible Cron モジュールの実験(Lab)へようこそ!この実験では、Ansible Cron モジュールを使用してタスクのスケジューリングを自動化する方法を学びます。cron システムは、Unix 系オペレーティングシステムにおける時間ベースのジョブスケジューラで、ユーザーが指定された時間または間隔でコマンドやスクリプトを自動的に実行するようにスケジュールすることができます。

この実験を通じて、Ansible を使用して cron ジョブを作成、管理、および削除する方法を学びます。演習は簡単な構成からより複雑な構成へと進み、Ansible Cron モジュールを使ったスキルを段階的に身につけることができます。この実験の終わりまでに、Ansible を使用して一貫した自動化された方法でタスクをスケジュールする実践的な経験を積むことができます。

単純な cron ジョブを作成する

このステップでは、Ansible Cron モジュールを使用して最初の cron ジョブを作成します。この cron ジョブは、定期的にシンプルなシェルスクリプトを実行します。

cron の理解

始める前に、cron が何であるかを理解しましょう。cron は、Unix 系オペレーティングシステムにおける時間ベースのジョブスケジューラで、ユーザーが指定された時間または間隔でコマンドやスクリプトを自動的に実行するようにスケジュールすることができます。cron ジョブは、システムメンテナンスタスク、バックアップ、または定期的なタスクの自動化に役立ちます。

Ansible プレイブックの作成

まず、cron ジョブを設定する Ansible プレイブックを作成する必要があります。WebIDE で、ファイルエクスプローラーパネルの「New File」ボタンをクリックして、パス /home/labex/project/cron_module_playbook.yaml に新しいファイルを作成します。

New File

ファイルに以下の内容を入力します。

- hosts: localhost
  tasks:
    - name: Create a simple cron job
      cron:
        name: my_cron_job
        minute: "*/5"
        job: /home/labex/project/script.sh

このプレイブックの各部分を見てみましょう。

  • hosts: localhost - これは、プレイブックがローカルマシンで実行されることを指定します。
  • tasks - このセクションには、実行するタスクのリストが含まれています。
  • cron - これは、cron ジョブを管理するために使用される Ansible モジュールです。
  • name: my_cron_job - これは、cron ジョブに説明的な名前を設定し、crontab で識別しやすくします。
  • minute: "*/5" - これは、ジョブを 5 分ごとに実行するようにスケジュールします。*/5 構文は「5 で割り切れるすべての分」(0、5、10、15 など)を意味します。
  • job: /home/labex/project/script.sh - これは、cron ジョブによって実行されるコマンドまたはスクリプトを指定します。

シェルスクリプトの作成

次に、cron ジョブが実行するシェルスクリプトを作成する必要があります。WebIDE でパス /home/labex/project/script.sh に新しいファイルを作成します。

スクリプトファイルに以下の内容を入力します。

#!/bin/bash
echo "This is a simple script." >> /home/labex/project/cron_output.log
date >> /home/labex/project/cron_output.log

このシンプルなスクリプトは、実行されるたびにメッセージと現在の日付をログファイルに追加します。

スクリプトを実行可能にする

プレイブックを実行する前に、スクリプトを実行可能にする必要があります。WebIDE でターミナルを開き、以下のコマンドを実行します。

chmod +x /home/labex/project/script.sh

Ansible プレイブックの実行

これで、cron ジョブを作成するために Ansible プレイブックを実行します。ターミナルで以下のコマンドを実行します。

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

以下のような出力が表示されるはずです。

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple cron job] ************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

changed: [localhost] の行は、cron ジョブが正常に作成されたことを示しています。

cron ジョブの確認

cron ジョブが作成されたことを確認するには、以下のコマンドでシステムの crontab を確認します。

crontab -l

以下のような出力が表示されるはずです。

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh

#Ansible: my_cron_job の行は、Ansible によって追加されたコメントで、cron ジョブを識別するためのものです。*/5 * * * * の部分はスケジュール(5 分ごと)を表し、/home/labex/project/script.sh は実行されるコマンドです。

おめでとうございます!Ansible Cron モジュールを使用して cron ジョブを正常に作成しました。このジョブは、スクリプトを 5 分ごとに実行します。

カスタム時間でタスクをスケジュールする

このステップでは、定期的な間隔ではなく、特定の時間に cron ジョブを実行するようにスケジュールする方法を学びます。これは、バックアップ、データ処理、またはレポート生成など、一日の特定の時間に実行する必要があるタスクに役立ちます。

cron 時間フォーマットの理解

cron 時間フォーマットは 5 つのフィールドで構成され、それぞれ以下を表します。

  1. 分 (0 - 59)
  2. 時 (0 - 23)
  3. 日 (1 - 31)
  4. 月 (1 - 12)
  5. 曜日 (0 - 7、0 と 7 はどちらも日曜日を表す)

各フィールドに値を指定すると、すべての条件が一致したときに cron ジョブが実行されます。たとえば、0 9 * * * は「毎日午前 9:00 に実行」を意味します(9 時の 0 分、月のどの日でも、どの月でも、曜日は問わない)。

Ansible プレイブックの修正

では、既存のプレイブックを修正して、特定の時間に実行される新しい cron ジョブを作成しましょう。WebIDE でファイル /home/labex/project/cron_module_playbook.yaml を開き、その内容を以下のように置き換えます。

- hosts: localhost
  tasks:
    - name: Schedule a task with custom time
      cron:
        name: custom_cron_job
        minute: "0"
        hour: "9"
        job: /home/labex/project/script.sh

このプレイブックの変更点は以下の通りです。

  • name: custom_cron_job - 異なる名前の新しい cron ジョブを作成しています。
  • minute: "0" - これは、ジョブを 0 分(正時)に実行するように設定します。
  • hour: "9" - これは、ジョブを午前 9 時に実行するように設定します。

残りのフィールド(日、月、曜日)は指定されていないため、デフォルトで *(任意の値)になります。したがって、このジョブは毎日午前 9:00 に実行されます。

修正後のプレイブックの実行

では、修正した Ansible プレイブックを実行して、新しい cron ジョブを作成しましょう。ターミナルで以下のコマンドを実行します。

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

以下のような出力が表示されるはずです。

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Schedule a task with custom time] ****************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

新しい cron ジョブの確認

新しい cron ジョブが作成されたことを確認するには、システムの crontab を確認します。

crontab -l

出力には、2 つの cron ジョブが表示されるはずです。

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh
#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

最初のジョブはステップ 1 で作成したもので、5 分ごとに実行されます。2 番目のジョブは、新しく作成したもので、毎日午前 9:00 に実行されます。

追加の cron スケジューリング例

cron スケジューリングの追加の例をいくつか紹介します。これらの例を通じて、時間フォーマットをより深く理解することができます。

  • 0 * * * * - 毎時 0 分に実行
  • 0 0 * * * - 毎日真夜中に実行
  • 0 0 1 * * - 毎月 1 日の真夜中に実行
  • 0 0 * * 0 - 毎週日曜日の真夜中に実行
  • 0 12 * * 1-5 - 平日(月曜日から金曜日)の正午に実行

これらのパターンを理解することで、Ansible Cron モジュールを使用してタスクをより効果的にスケジュールすることができます。

おめでとうございます!Ansible Cron モジュールを使用して、特定の時間に cron ジョブを実行するようにスケジュールすることに成功しました。

cron ジョブが特定のユーザーとして実行されることを確認する

このステップでは、cron ジョブをどのユーザーとして実行するかを指定する方法を学びます。これは、システム管理とセキュリティの重要な側面であり、スケジュールされたタスクが実行される権限と環境を制御することができます。

cron ジョブのユーザーコンテキストの理解

Unix 系システムでは、cron ジョブはそれを所有するユーザーの権限と環境を引き継ぎます。これは以下のことを意味します。

  1. ジョブは、ユーザーがアクセス権を持つファイルとリソースにのみアクセスできます。
  2. ジョブは、ユーザーの環境変数と設定で実行されます。
  3. ジョブによって作成されたすべてのファイルは、ユーザーが所有することになります。

デフォルトでは、Ansible Cron モジュールを使用してユーザーを指定しない場合、cron ジョブは Ansible プレイブックを実行しているユーザー用に作成されます。ただし、user パラメーターを使用して別のユーザーを明示的に設定することができます。

Ansible プレイブックの修正

cron ジョブを labex ユーザーとして実行するようにプレイブックを修正しましょう。WebIDE でファイル /home/labex/project/cron_module_playbook.yaml を開き、その内容を以下のように置き換えます。

- hosts: localhost
  tasks:
    - name: Schedule a task with custom time for specific user
      cron:
        name: custom_cron_job
        minute: "0"
        hour: "9"
        job: /home/labex/project/script.sh
        user: labex

ここでの重要な追加部分は以下の通りです。

  • user: labex - このパラメーターは、cron ジョブを labex ユーザー用に作成することを指定します。

この環境ではすでに labex ユーザーとして実行していますが、明示的に設定することは、プレイブックを他の環境に移植する際の明確性と移植性のために良い習慣です。

修正後のプレイブックの実行

では、修正した Ansible プレイブックを実行して、cron ジョブを更新しましょう。ターミナルで以下のコマンドを実行します。

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

以下のような出力が表示されるはずです。

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Schedule a task with custom time for specific user] **********************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

出力に changed ではなく ok が表示されていることに注意してください。これは、cron ジョブがすでに存在しており、唯一の変更点はユーザーパラメーターであり、この場合はすでに正しい(最初から labex ユーザーとして実行していた)ためです。

cron ジョブの確認

cron ジョブが引き続き適切に設定されていることを確認するには、crontab を確認します。

crontab -l

以下のような出力が表示されるはずです。

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh
#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

特定のユーザーの cron ジョブを表示する

特定のユーザーの cron ジョブを表示する場合は、crontab コマンドに -u オプションを使用することができます。

sudo crontab -u labex -l

このコマンドは、labex ユーザー用にスケジュールされたすべての cron ジョブを表示します。本番環境では、各タスクに必要なアクセスレベルと権限に応じて、異なるユーザーとして異なる cron ジョブが実行される場合があります。

セキュリティに関する考慮事項

異なるユーザー用に cron ジョブをスケジュールする際には、以下のセキュリティ上の慣行を考慮してください。

  1. 最小権限の原則を使用する - タスクを実行するために必要な権限のみを持つユーザーに cron ジョブを割り当てます。
  2. 絶対に必要な場合を除き、root ユーザーとしてタスクをスケジュールしないでください。
  3. cron ジョブによって実行されるスクリプトが適切な権限とエラーハンドリングを持っていることを確認します。
  4. Ansible のような構成管理ツールを使用して、インフラストラクチャ全体で一貫した cron ジョブ設定を維持することを検討します。

おめでとうございます!Ansible Cron モジュールを使用して、特定のユーザーとして cron ジョブを実行するように設定することに成功しました。このスキルは、システムタスクをより安全かつ効果的に管理するのに役立ちます。

cron ジョブを削除する

このステップでは、Ansible Cron モジュールを使用して不要な cron ジョブを削除する方法を学びます。cron ジョブの完全なライフサイクルを管理することは、システム管理者や DevOps エンジニアにとって重要なスキルです。

cron ジョブを削除する理由

cron ジョブを削除する必要がある理由はいくつかあります。

  1. スケジュールされたタスクがもはや必要ない場合
  2. 既存のジョブを新しい設定で置き換えたい場合
  3. システムの保守性を向上させるためにクリーンアップする必要がある場合
  4. タスクを一時的に無効にする必要がある場合

Ansible を使用すると、インフラストラクチャ全体で cron ジョブを体系的かつ再現可能な方法で削除することができます。

state パラメーターの理解

Ansible Cron モジュールは、state パラメーターを使用して、cron ジョブが存在するか存在しないかを制御します。

  • state: present - これはデフォルトです。指定された設定で cron ジョブが存在することを保証します。
  • state: absent - これは、cron ジョブが存在しないことを保証し、以前に作成されていた場合は削除します。

Ansible プレイブックの修正

最初に作成した cron ジョブ(名前は my_cron_job)を削除するようにプレイブックを修正しましょう。WebIDE でファイル /home/labex/project/cron_module_playbook.yaml を開き、その内容を以下のように置き換えます。

- hosts: localhost
  tasks:
    - name: Remove the cron job
      cron:
        name: my_cron_job
        state: absent

このプレイブックの重要な要素は以下の通りです。

  • name: my_cron_job - これは、削除する cron ジョブを名前で識別します。
  • state: absent - これは、Ansible に cron ジョブが存在しないことを保証するように指示します。

削除する cron ジョブを識別するためには、名前を指定するだけで済みます。他のパラメーター(分、時、ジョブなど)は必要ありません。

修正後のプレイブックの実行

では、修正した Ansible プレイブックを実行して、cron ジョブを削除しましょう。ターミナルで以下のコマンドを実行します。

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

以下のような出力が表示されるはずです。

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Remove the cron job] *****************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

changed: [localhost] という行は、cron ジョブが正常に削除されたことを示しています。

cron ジョブの削除を確認する

cron ジョブが削除されたことを確認するには、システムの crontab を確認します。

crontab -l

出力には、2 番目の cron ジョブのみが表示されるはずです。

#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

my_cron_job のエントリは、プレイブックで要求された通り削除されています。

Ansible の冪等性

Ansible の重要な機能の 1 つは冪等性です。これは、同じ操作を複数回適用しても、1 回適用した場合と同じ結果になるという特性です。これは、cron ジョブの削除などのタスクに特に有用です。

これを実証するために、プレイブックを再度実行してみましょう。

ansible-playbook cron_module_playbook.yaml

以下のような出力が表示されるはずです。

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Remove the cron job] *****************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2 回目の実行では、削除タスクについて changed ではなく ok が表示されていることに注意してください。これは、cron ジョブはすでに削除されていたため、変更は必要なかったからです。

複数の cron ジョブを管理する

実際のシナリオでは、単一のプレイブックで複数の cron ジョブを管理する必要がある場合があります。それぞれ独自の設定を持つ複数の cron タスクを含めることができます。

- hosts: localhost
  tasks:
    - name: Remove first cron job
      cron:
        name: job1
        state: absent

    - name: Create second cron job
      cron:
        name: job2
        minute: "0"
        hour: "12"
        job: /path/to/script.sh

    - name: Update third cron job
      cron:
        name: job3
        minute: "*/10"
        job: /path/to/another/script.sh

このアプローチにより、単一のバージョン管理されたプレイブックですべての cron ジョブの完全なライフサイクルを管理することができます。

おめでとうございます!Ansible Cron モジュールを使用して cron ジョブを削除する方法を成功裏に学びました。これで、cron ジョブの基本的なライフサイクル管理(作成、修正、削除)が完了しました。

まとめ

Ansible Cron モジュールの実験を完了したことをお祝いします!この実験を通じて、Ansible を使用したスケジュールタスクの管理に関するいくつかの重要な側面で実践的な経験を積みました。

  1. 定期的に実行される単純な cron ジョブの作成
  2. カスタムの cron 時間表現を使用して特定の時間にタスクをスケジュールする
  3. 適切なセキュリティと権限管理のために、cron ジョブを特定のユーザーとして実行するように設定する
  4. 不要になった cron ジョブを削除する

これらのスキルは、任意の Linux 環境におけるシステム管理タスク、メンテナンス操作、および定期的なプロセスの自動化に不可欠です。Ansible を使用して cron ジョブを管理することで、以下のようなメリットがあります。

  • 複数のシステム間で一貫した設定
  • ジョブスケジュールのバージョン管理
  • 繰り返し適用できる冪等性のある操作
  • スケジュールされたタスクの自動デプロイと管理

Ansible を引き続き使用する際には、Cron モジュールのより高度な機能を探索することを検討してください。例えば、

  • cron ジョブの環境変数を設定する
  • @daily@reboot のような特殊な時間指定を使用する
  • 包括的な自動化ソリューションのために、cron 管理を他の Ansible モジュールと組み合わせる

スケジュールされたタスクを効果的に管理する能力は、システム管理、DevOps、およびその他の IT ロールで役立つ貴重なスキルです。