Ansible win_scheduled_taskでスケジュールされたタスクを自在に操る!

2025-03-21

Ansibleのwin_scheduled_taskモジュールとは?

win_scheduled_taskモジュールは、Windows環境において、スケジュールされたタスク(タスクスケジューラ)を管理するためのAnsibleモジュールです。このモジュールを使用することで、タスクの作成、更新、削除、有効化、無効化など、様々な操作を自動化できます。

主な機能と使い方

    • 指定されたコマンドやスクリプトを、指定されたスケジュールで実行するタスクを作成できます。
    • 例:毎日特定の時間にバックアップスクリプトを実行するタスクを作成する。
  1. タスクの更新 (modify)

    • 既存のタスクの設定を変更できます。
    • 例:タスクの実行時間を変更したり、実行するスクリプトを変更したりする。
  2. タスクの削除 (delete)

    • 不要になったタスクを削除できます。
  3. タスクの有効化/無効化 (enabled)

    • タスクを一時的に有効または無効にできます。
  4. タスクの実行 (run)

    • タスクを即時実行できます。

Ansible Playbookでの記述例

---
- hosts: windows_servers
  tasks:
    - name: バックアップタスクを作成する
      win_scheduled_task:
        name: "Backup Script"
        description: "毎晩バックアップスクリプトを実行する"
        action:
          executable: "C:\\Scripts\\backup.ps1"
        trigger:
          type: daily
          start_time: "02:00"
        state: present

解説

  • state: present: タスクが存在することを確認し、存在しない場合は作成します。
  • trigger:: タスクの実行トリガー(スケジュール)を指定します。
    • type: daily: 毎日実行するトリガーを指定します。
    • start_time: "02:00": 実行開始時間を指定します。
  • action:: タスクが実行するアクション(コマンドやスクリプト)を指定します。
    • executable: "C:\\Scripts\\backup.ps1": 実行するスクリプトのパスを指定します。
  • description: "毎晩バックアップスクリプトを実行する": タスクの説明を指定します。
  • name: "Backup Script": 作成するタスクの名前を指定します。
  • win_scheduled_task: win_scheduled_taskモジュールを使用することを指定します。
  • hosts: windows_servers: このPlaybookを適用する対象のWindowsサーバーグループを指定します。

利点

  • 冪等性(べきとうせい)があるので、複数回実行しても結果が同じです。
  • タスクの変更や削除も簡単に行えます。
  • 複数のWindowsサーバーに対して、同じタスクを効率的に展開できます。
  • Windowsタスクスケジューラの管理を自動化できるため、手作業による設定ミスを減らせます。
  • 多くの引数(argument)があるので、ansibleの公式ドキュメントを参照してください。
  • win_scheduled_taskモジュールは、Windows Remote Management (WinRM) を使用してWindowsサーバーと通信します。


一般的なエラーとトラブルシューティング

    • エラー
      Failed to connect to the host via WinRM.
    • 原因
      AnsibleコントローラからWindowsサーバーへのWinRM接続が確立できていない。
    • トラブルシューティング
      • WindowsサーバーでWinRMが有効になっているか確認します (winrm quickconfig コマンド)。
      • ファイアウォールでWinRMのポート(通常は5985または5986)が許可されているか確認します。
      • Ansibleインベントリファイルに正しいWindowsサーバーのIPアドレスまたはホスト名、および認証情報が設定されているか確認します。
      • Ansibleコントローラから Test-NetConnection コマンドを使用し、Windowsサーバーへの接続をテストします。
  1. 権限の問題

    • エラー
      Access is denied. または The user does not have the required permissions.
    • 原因
      Ansibleが使用しているユーザーアカウントに、タスクスケジューラを操作する権限がない。
    • トラブルシューティング
      • Ansibleインベントリファイルで、管理者権限を持つユーザーアカウントを使用しているか確認します。
      • タスクスケジューラのセキュリティ設定で、指定されたユーザーアカウントに適切な権限が付与されているか確認します。
      • タスクの実行ユーザーが適切であるか確認する。
  2. タスク定義の問題

    • エラー
      Invalid argument. または The specified task definition is invalid.
    • 原因
      win_scheduled_taskモジュールに渡された引数が不正である。
    • トラブルシューティング
      • Ansible Playbookのタスク定義を再確認し、引数のスペルミスや値の型が正しいか確認します。
      • タスクの actiontriggersettings などの引数が、Windowsタスクスケジューラの仕様に準拠しているか確認します。
      • Ansibleの公式ドキュメントを参照し、引数の詳細を確認します。
      • タスクの実行ファイルが存在するか確認する。
  3. タスクの実行失敗

    • エラー
      タスクは作成されたが、実行時にエラーが発生する。
    • 原因
      タスクが実行するスクリプトやコマンドに問題がある。
    • トラブルシューティング
      • タスクの実行履歴を確認し、エラーメッセージを特定します。
      • タスクが実行するスクリプトやコマンドを直接実行し、エラーが発生しないか確認します。
      • タスクの実行ユーザーが、スクリプトやコマンドを実行するために必要な権限を持っているか確認します。
      • タスクの実行時の作業ディレクトリが適切であるか確認する。
  4. 冪等性の問題

    • エラー
      state: present を指定しているにもかかわらず、Ansible Playbookを複数回実行すると、毎回タスクが変更される。
    • 原因
      タスク定義が完全に一致していないか、Ansibleがタスクの変更を正しく検出できていない。
    • トラブルシューティング
      • タスク定義のすべての引数を明示的に指定し、デフォルト値に依存しないようにします。
      • Ansible Playbookの実行結果を詳細に確認し、変更された引数を特定します。
      • タスクの force 引数を yes に設定し、強制的にタスクを更新します。
  5. トリガーの問題

    • エラー
      スケジュールされた時間にタスクが実行されない。
    • 原因
      トリガーの設定が間違っている。
    • トラブルシューティング
      • トリガーの種類(dailyweeklymonthly など)が正しいか確認します。
      • 開始時間や繰り返し間隔が正しいか確認します。
      • トリガーの有効期限が切れていないか確認します。
      • タイムゾーンの設定が正しいか確認する。

デバッグのヒント

  • Windowsタスクスケジューラを直接使用し、タスクの作成や実行をテストします。
  • Windowsサーバーのイベントログを確認し、エラーメッセージを特定します。
  • Ansible Playbookの実行時に -vvv オプションを使用し、詳細なデバッグ情報を表示します。


例1:毎日特定の時間にスクリプトを実行するタスクを作成する

---
- hosts: windows_servers
  tasks:
    - name: 毎晩2時にバックアップスクリプトを実行するタスクを作成
      win_scheduled_task:
        name: "Backup Script"
        description: "毎晩2時にバックアップスクリプトを実行します"
        action:
          executable: "C:\\Scripts\\backup.ps1"
        trigger:
          type: daily
          start_time: "02:00"
        state: present

解説

  • state: present: タスクが存在しない場合は作成し、存在する場合は設定を更新します。
  • trigger: start_time: "02:00": 実行開始時間を午前2時に設定します。
  • trigger: type: daily: 毎日実行するトリガーを設定します。
  • action: executable: "C:\\Scripts\\backup.ps1": 実行するスクリプトのパスを指定します。
  • description: タスクの説明を指定します。
  • name: "Backup Script": 作成するタスクの名前を指定します。
  • hosts: windows_servers: このタスクを適用するWindowsサーバーを指定します。

例2:特定のユーザーでタスクを実行する

---
- hosts: windows_servers
  tasks:
    - name: 特定のユーザーでスクリプトを実行するタスクを作成
      win_scheduled_task:
        name: "Run Script as User"
        description: "特定のユーザーでスクリプトを実行します"
        action:
          executable: "C:\\Scripts\\run_as_user.ps1"
        trigger:
          type: daily
          start_time: "03:00"
        user_name: "DOMAIN\\specific_user"
        password: "user_password"
        state: present

解説

  • password: "user_password": ユーザーアカウントのパスワードを指定します。
    • セキュリティ上の理由から、パスワードをPlaybookに直接記述するのは推奨されません。Ansible Vaultなどの安全な方法でパスワードを管理することを推奨します。
  • user_name: "DOMAIN\\specific_user": タスクを実行するユーザーアカウントを指定します。

例3:タスクを無効化する

---
- hosts: windows_servers
  tasks:
    - name: バックアップタスクを無効化する
      win_scheduled_task:
        name: "Backup Script"
        state: absent
        enabled: no

解説

  • state: absent : タスクが存在する場合設定を無効化し、存在しない場合は何も行いません。
  • enabled: no: タスクを無効化します。

例4:タスクを削除する

---
- hosts: windows_servers
  tasks:
    - name: 不要なタスクを削除する
      win_scheduled_task:
        name: "Old Task"
        state: absent

解説

  • state: absent: タスクを削除します。

例5:タスクの実行結果を記録する

---
- hosts: windows_servers
  tasks:
    - name: スクリプトの実行結果をログに記録するタスクを作成
      win_scheduled_task:
        name: "Log Script Output"
        description: "スクリプトの実行結果をログに記録します"
        action:
          executable: "C:\\Scripts\\log_output.ps1"
          arguments: "> C:\\Logs\\output.log"
        trigger:
          type: daily
          start_time: "04:00"
        state: present

解説

  • action: arguments: "> C:\\Logs\\output.log": スクリプトの実行結果をリダイレクトしてログファイルに保存します。
  • WinRM: これらの例を実行するには、対象のWindowsサーバーでWinRMが有効になっている必要があります。
  • エラー処理: スクリプト内でエラー処理を行い、エラー発生時に適切なログを出力するようにしてください。
  • スクリプトのパス: スクリプトのパスは、Windowsサーバー上で有効なパスである必要があります。
  • 権限: タスクを実行するユーザーアカウントには、必要な権限が付与されている必要があります。
  • パスワードの管理: Playbookにパスワードを直接記述するのは避け、Ansible Vaultなどの安全な方法を使用してください。


PowerShellスクリプトを使用する


  • ---
    - hosts: windows_servers
      tasks:
        - name: PowerShellを使用してタスクを作成する
          win_powershell:
            script: |
              $Action = New-ScheduledTaskAction -Execute "C:\Scripts\MyScript.ps1"
              $Trigger = New-ScheduledTaskTrigger -Daily -At 2AM
              $Settings = New-ScheduledTaskSettingsSet
              $Principal = New-ScheduledTaskPrincipal -UserId "DOMAIN\user" -LogonType Password
              Register-ScheduledTask -TaskName "MyPowerShellTask" -Action $Action -Trigger $Trigger -Settings $Settings -User $Principal
    
  • 利点

    • win_scheduled_taskモジュールよりも詳細な制御が可能です。
    • 複雑なタスク定義や高度なカスタマイズが必要な場合に適しています。
    • Windowsのネイティブツールを使用するので、安定性が高い。
    • Ansibleのwin_shellまたはwin_commandモジュールを使用して、PowerShellスクリプトを実行し、タスクスケジューラを操作します。
    • Windowsのタスクスケジューラは、PowerShellのScheduledTasksモジュールを通じて強力に管理できます。

Windowsコマンドラインツール schtasks.exe を使用する


  • ---
    - hosts: windows_servers
      tasks:
        - name: schtasks.exeを使用してタスクを作成する
          win_command:
            cmd: schtasks /create /tn "MySchtasksTask" /tr "C:\Scripts\MyScript.exe" /sc daily /st 03:00
    
  • 利点

    • PowerShellが利用できない環境でも使用できます。
    • 単純なタスク管理に適しています。
  • 説明

    • win_commandモジュールを使用して、schtasks.exeコマンドを実行し、タスクスケジューラを操作します。
    • schtasks.exeは、Windowsの標準的なコマンドラインツールであり、タスクの作成、削除、変更などを行うことができます。

カスタムモジュールを作成する

  • 注意
    • モジュール開発にはPythonの知識が必要です。
    • モジュールのテストとメンテナンスが必要です。
  • 利点
    • 特定の要件に合わせたカスタム機能を実装できます。
    • 複雑なタスク管理や高度な自動化が必要な場合に適しています。
  • 説明
    • Pythonを使用して独自のAnsibleモジュールを作成し、タスクスケジューラを操作します。
    • Windows APIやPowerShellライブラリを使用して、高度なタスク管理機能を実装できます。

Windows Remote Management (WinRM) と WMI (Windows Management Instrumentation) を使用する

  • 注意
    • WMIの知識が必要です。
    • PowerShellを使用するほうが一般的に簡単です。
  • 利点
    • Windowsの標準的な技術を使用するので、安定性が高い。
    • タスクスケジューラに関する詳細な情報にアクセスできます。
  • 説明
    • Ansibleのwin_shellwin_powershellモジュールからWMIを使用してタスクスケジューラを操作します。
    • WMIはWindowsの管理情報にアクセスするための標準的なインターフェースです。

選択の基準

  • 詳細な情報が必要な場合
    WMI
  • PowerShellが利用できない環境
    schtasks.exe
  • 複雑なタスク管理や高度なカスタマイズ
    PowerShellスクリプトまたはカスタムモジュール
  • 単純なタスク管理
    schtasks.exe または win_scheduled_task モジュール