AnsibleでWindowsスケジュールタスクを自動化する!win_scheduled_taskモジュールの基礎と応用

2024-07-30

win_scheduled_taskモジュールとは?

Ansibleのwin_scheduled_taskモジュールは、Windows環境におけるスケジュールタスクを管理するためのモジュールです。スケジュールタスクとは、特定の時間やイベント発生時に自動的に実行されるプログラムやスクリプトのことです。このモジュールを使うことで、Ansibleのプレイブックから、Windowsサーバー上のスケジュールタスクの作成、変更、削除などを自動化することができます。

何ができるの?

  • スケジュールタスクの状態の取得
    スケジュールタスクが有効か無効か、次回実行予定時刻などを取得できます。
  • スケジュールタスクの削除
    既存のスケジュールタスクを削除できます。
  • スケジュールタスクの変更
    既存のスケジュールタスクのプロパティ(実行するプログラム、実行頻度、実行ユーザーなど)を変更できます。
  • スケジュールタスクの作成
    新しいスケジュールタスクを作成できます。
- name: スケジュールタスクの作成
  win_scheduled_task:
    name: MyTask
    description: "毎日実行されるタスク"
    trigger:
      - daily:
          at: 03:00
    user: Administrator
    task: powershell -Command "Write-Host 'Hello, world!'"

上記の例では、

  • task
    実行するコマンドを指定します。ここでは、PowerShellコマンドで"Hello, world!"と表示するコマンドを指定しています。
  • user
    タスクを実行するユーザーを指定します。
  • trigger
    トリガーを設定します。ここでは、毎日午前3時に実行するように設定しています。
  • description
    スケジュールタスクの説明を指定します。
  • name
    スケジュールタスクの名前を指定します。
  • args
    コマンドに渡す引数を指定します。
  • stop_when
    タスクを停止する条件を指定します。
  • start_when
    タスクを開始する条件を指定します。
  • hidden
    スケジュールタスクを非表示にするか表示するかを指定します。
  • enabled
    スケジュールタスクを有効にするか無効にするかを指定します。
  • state
    タスクの状態を指定します。presentで作成または変更、absentで削除します。

win_scheduled_taskモジュールは、Windows環境におけるスケジュールタスクの管理を自動化する上で非常に便利なツールです。Ansibleのプレイブックに組み込むことで、繰り返し行うスケジュールタスクの管理を効率化することができます。



Ansibleのwin_scheduled_taskモジュールを使用する際に、様々なエラーやトラブルが発生する可能性があります。ここでは、一般的なエラーとその解決策について解説します。

よくあるエラーとその原因

  • モジュールのバグ
    • 原因
      モジュール自身にバグが存在する場合がある。
    • 解決策
      • モジュールの最新バージョンにアップデートする。
      • コミュニティフォーラムで同様の問題が報告されているか確認する。
      • バグ報告を行う。
  • タスク実行の失敗
    • 原因
      指定したコマンドが実行できない、またはエラーが発生している。
    • 解決策
      • コマンドの構文が正しいか確認する。
      • 実行環境でコマンドが利用可能か確認する。
      • コマンドの出力やエラーログを確認する。
  • トリガー設定の誤り
    • 原因
      トリガーの構文が間違っている、またはサポートされていないトリガータイプを使用している。
    • 解決策
      • Ansibleのドキュメントでサポートされているトリガータイプを確認する。
      • トリガーの構文を正しく設定する。
  • 権限不足
    • 原因
      実行中のユーザーにスケジュールタスクの作成、変更、削除の権限がない。
    • 解決策
      • 管理者権限でAnsibleを実行する。
      • sudoやbecomeを使用する。
      • タスクを実行するユーザーに適切な権限を付与する。
  • モジュールの読み込みエラー
    • 原因
      Ansibleがwin_scheduled_taskモジュールを見つけられない、またはモジュールに問題がある。
    • 解決策
      • Ansibleのバージョンとモジュールの互換性を確認する。
      • requirements.ymlファイルにモジュールを明記し、ansible-galaxy installコマンドでインストールする。
      • Ansibleのキャッシュをクリアする。

トラブルシューティングのヒント

  • モジュールのドキュメントを参照
    Ansibleのドキュメントには、各モジュールの使用方法やオプションが詳しく説明されています。
  • 簡単なタスクから始める
    複雑なタスクを実行する前に、簡単なタスクで動作を確認しましょう。
  • Ansibleのログを確認
    Ansibleのログファイルには、実行の詳細な情報が記録されています。
  • 詳細なエラーメッセージを確認
    エラーメッセージには、問題の原因に関する重要な情報が含まれています。
  • 非互換性
    Ansibleのバージョン、Windowsのバージョン、モジュールのバージョンなど、様々な要素が互いに影響し合うことがあります。
  • PowerShellコマンド
    PowerShellコマンドを使用する場合、PowerShellの構文や実行ポリシーに注意が必要です。
  • Windows環境の特殊性
    Windows環境では、ユーザーアカウント制御 (UAC) やセキュリティ設定など、Linux環境とは異なる考慮が必要となる場合があります。
- name: スケジュールタスクの作成 (エラー例)
  win_scheduled_task:
    name: MyTask
    trigger:
      - daily:
          at: 3:00  # 誤り: 03:00と記述する必要がある
    user: Administrator
    task: powershell -Command "Write-Host 'Hello, world!'"

上記の例では、トリガーのatパラメータの記述が間違っているため、タスクが作成されません。

Ansibleのwin_scheduled_taskモジュールは、Windows環境でのスケジュールタスク管理を自動化する上で非常に便利なツールですが、エラーが発生することもあります。エラーの原因を特定し、適切な解決策を講じることで、スムーズにタスクを実行することができます。



毎日午前3時にPowerShellスクリプトを実行する

- name: 毎日午前3時にPowerShellスクリプトを実行
  win_scheduled_task:
    name: DailyScript
    description: "毎日午前3時に実行されるスクリプト"
    trigger:
      - daily:
          at: 03:00
    user: Administrator
    task: powershell -File "C:\scripts\daily_task.ps1"

毎週月曜日の午後5時にバッチファイルを起動する

- name: 毎週月曜日の午後5時にバッチファイルを起動
  win_scheduled_task:
    name: WeeklyBatch
    description: "毎週月曜日の午後5時に実行されるバッチファイル"
    trigger:
      - weekly:
          days: [monday]
          at: 17:00
    user: Domain\User
    task: C:\scripts\weekly_task.bat

システムの再起動を毎日午前2時に実行する

- name: 毎日午前2時にシステムを再起動
  win_scheduled_task:
    name: DailyReboot
    description: "毎日午前2時にシステムを再起動"
    trigger:
      - daily:
          at: 02:00
    user: System
    task: shutdown /r /t 0

特定のイベント発生時にプログラムを実行する

- name: イベントログに特定のエラーが発生したらプログラムを実行
  win_scheduled_task:
    name: EventLogTrigger
    description: "イベントログにエラーが発生したらプログラムを実行"
    trigger:
      - logon:
          user: Administrator
      - event:
          subscription: MySubscription
    user: Administrator
    task: C:\myprogram.exe

既存のスケジュールタスクを無効にする

- name: 既存のスケジュールタスクを無効にする
  win_scheduled_task:
    name: MyTask
    state: absent

スケジュールタスクの詳細を取得する

- name: スケジュールタスクの詳細を取得
  win_scheduled_task_stat:
    name: MyTask
  register: task_info

スケジュールタスクの開始条件を設定する

- name: 特定のサービスが開始されたらタスクを実行
  win_scheduled_task:
    name: ServiceStartTrigger
    description: "特定のサービスが開始されたらタスクを実行"
    trigger:
      - start:
          service: MyService
    user: System
    task: powershell -Command "Write-Host 'Service started.'"

スケジュールタスクの停止条件を設定する

- name: ディスク空き容量が不足したらタスクを実行
  win_scheduled_task:
    name: LowDiskSpaceTrigger
    description: "ディスク空き容量が不足したらタスクを実行"
    trigger:
      - diskfree:
          drive: C:
          threshold: 10
    user: System
    task: powershell -Command "Write-Host 'Low disk space detected.'"
  • stop_when
    タスクを停止する条件
  • start_when
    タスクを開始する条件
  • idle
    アイドル状態での実行
  • priority
    優先度
  • working_directory
    作業ディレクトリ
  • args
    コマンドに渡す引数
  • hidden
    スケジュールタスクを非表示にする
  • enabled
    スケジュールタスクを有効/無効にする
  • 複雑な設定
    複雑なスケジュール設定やトリガー条件を設定する場合は、Windowsのタスクスケジューラで事前に確認することをおすすめします。
  • 権限
    スケジュールタスクの作成や変更には、通常、管理者権限が必要です。
  • トリガー
    トリガーの種類や設定は、AnsibleのバージョンやWindowsのバージョンによって異なる場合があります。
  • Ansibleの公式ドキュメントを参照して、より詳細な情報を確認することをおすすめします。
  • AnsibleのバージョンやWindowsのバージョンによって、利用可能なオプションや挙動が異なる場合があります。


Ansibleのwin_scheduled_taskモジュールは、Windows環境でのスケジュールタスク管理に非常に便利なツールですが、状況によっては、他の方法も検討する価値があります。

PowerShell Direct

  • デメリット
    • スクリプト作成の難易度が上がる。
    • エラー処理が複雑になる可能性がある。
  • メリット
    • Ansibleモジュールよりも柔軟な設定が可能。
    • PowerShellの豊富な機能を活用できる。
  • 特徴
    PowerShellスクリプトを直接実行し、スケジュールタスクの作成や管理を行います。
# PowerShellスクリプト例
$Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-Command "Write-Host Hello, world!"'
$Trigger = New-ScheduledTaskTrigger -Daily -At "3:00 AM"
Register-ScheduledTask -TaskName "MyTask" -Action $Action -Trigger $Trigger

SCOM (System Center Operations Manager)

  • デメリット
    • 学習コストが高い。
    • ライセンス費用がかかる。
  • メリット
    • 複数のサーバーを一元管理できる。
    • 複雑な監視や自動化が可能。
  • 特徴
    大規模な環境でのシステム管理に特化したツール。

サードパーティ製の構成管理ツール

  • デメリット
    • 学習コストがかかる。
    • ツール間の切り替えが必要になる。
  • メリット
    • Ansibleにない機能やプラグインがある場合がある。
  • 特徴
    Chef、Puppetなど、Ansible以外の構成管理ツール。

WindowsタスクスケジューラAPI

  • デメリット
    • プログラミングスキルが必要。
  • メリット
    • 細粒度の制御が可能。
  • 特徴
    Windowsのタスクスケジューラを直接操作するAPIを使用。

GUIツール

  • デメリット
    • 複数のサーバーを一括管理できない。
  • メリット
    • 直感的な操作が可能。
    • 小規模な環境で手軽に利用できる。
  • 特徴
    WindowsのタスクスケジューラなどのGUIツールを使用。
  • コスト
    ツールのライセンス費用、導入コスト。
  • チームのスキル
    PowerShell、スクリプト言語、構成管理ツールのスキル。
  • 既存のツール
    既に導入されているツールとの連携。
  • 複雑さ
    スケジュールタスクの設定が単純か複雑か。
  • 環境
    小規模か大規模か、Windowsのバージョン、ネットワーク構成など。

win_scheduled_taskモジュールは、Ansibleのエコシステムの中で使いやすい選択肢ですが、状況によっては他の方法も検討する価値があります。それぞれの方法にはメリットとデメリットがあり、最適な方法は環境や要件によって異なります。

  • コスト
    無料で利用したい場合は、PowerShellやwin_scheduled_taskモジュールが適している。
  • 統合
    他のシステムと連携させたい場合は、SCOMやサードパーティ製の構成管理ツールが適している。
  • 柔軟性
    複雑な設定やカスタマイズが必要な場合は、PowerShellやSCOMが適している。
  • シンプルさ
    簡単な設定で済ませたい場合は、GUIツールやwin_scheduled_taskモジュールが適している。