Git管理 + CLI運用によるWindowsタスクスケジューラーの運用改善

ogp

こんにちは、WEAR部運用改善チームの三浦です。私たちのチームでは、WEARの日々の運用業務を安全かつ効率的に行えるよう改善を行っています。今回はバッチの定期実行に使用しているWindowsのタスクスケジューラーの運用改善について紹介します。

背景

WEARではバッチをWindowsサーバー上で定期実行させており、定期実行するために タスクスケジューラー を使用しています。WEARではバッチ実行用のサーバー(バッチサーバー)を用意しており、バッチサーバーへのアクセス権限を持つ人がタスクスケジューラーの設定を下記のような画面から変更していました。

image

しかしこの運用方法では次のような課題がありました。

  • バッチサーバーへのアクセス権限がある人しかタスクの設定を見ることができない
  • タスクスケジューラー上ではタスクの変更履歴や変更した経緯が残らない
  • GUI上での手動変更では操作ミスが起こる
  • 引継ぎが手間

実際にこれらの課題により、業務に影響を及ぼす事象も発生しました。

  • タスクの実行頻度を元に戻したいが、以前の設定がどうなっていたか見ることができない
  • タスクを手動で止め、実行頻度を変更後に再開するのを忘れ、タスクが止まったままになっていた

実現したいこと

前述した課題を改善するために2つの改善を行うことにしました。

タスクの設定をGitHubで管理する

各タスクの設定をファイル出力してGitHub上で管理します。これによりバッチサーバーへのアクセス権限を問わずタスクの設定を確認できるようになります。

また、Gitでのバージョン管理によって変更履歴も確認できるようになります。

コマンドでタスクの設定を変更する

コマンドでタスクの設定が書かれたファイルを読み込んで反映させます。コマンドを実行するだけでよくなり、これまで必要だった手動作業が不要になることにより、結果として誤操作のリスクを防ぐことができます。事前にコマンドもレビューしておくと更に安全に変更ができます。

これらを実現するためにschtasksというコマンドを使用します。

schtasksについて

schtasksはWindows OSに標準搭載されているコマンドで、タスクスケジューラーのタスクの操作ができます。Windowsのコマンドプロンプトから実行してタスクの登録や実行頻度の変更といった編集操作が行えます。

コマンドは下記のように操作用のオプション(create, change, query, etc.)とその操作に対するオプション(対象のタスク、実行頻度、etc.)を指定して実行します。各オプションの詳細などは 公式ドキュメント を参照ください。

schtasks <操作オプション> <その他オプション>...

schtasksコマンドでは現在動いているタスクの設定内容をXMLで出力したり、XMLファイルを読み込んでタスクの設定内容を変更できます。

  • タスクの設定をXMLで出力する
schtasks /query /tn ${XML出力したいタスクの名前} /XML
  • XMLを読み込んでタスクの設定内容を変更する
schtasks /create /tn ${変更したいタスクの名前} /XML ${読み込むXMLの完全修飾パス} /F

※厳密には既存のタスクを一旦削除してXMLを元に作り直しています。

今回はこのXMLの入出力の機能を使いたいと思います。

各タスクの設定をXML出力してGitHubで管理する

各タスクの設定をXML出力し、そのXMLをGitHubで管理する手順を説明します。

Windows PowerShellを管理者実行で開く

バッチサーバーにログインしWindows PowerShellを管理者実行で開きます。管理者実行ではない場合、ログインしているユーザーが作成したタスクしか操作できないので注意が必要です。

schtasksコマンドはコマンドプロンプトからでも実行できますが、今回はPowerShellのコマンドも使用したいため、Windows PowerShellを開いています。

schtask + PowerShellのコマンドでXML出力

schtasksコマンドで現在動いているタスクの一覧を取得します。そして、一覧をループして各タスクの設定をschtasksコマンドでXML出力します。

schtasks /query /nh /fo CSV | Select-String -NotMatch Microsoft | ForEach-Object { $task = ($_-split(','))[0]; $file = Join-Path '${保存先ディレクトリ}' ([regex]::Replace($task, '[\[\]"\s]', '')); schtasks /query /tn $task /XML > $file'.xml' }

最初のschtasks /query /nh /fo CSVではschtasksの検索機能(query)で現状動いているタスクを全て取得し、CSV形式で出力します。

取得結果は下記画像のように、1行に1タスクのタスク名、次回の実行時刻、実行ステータスがCSV形式で出力されます。この時点ではWEARのバッチとは関係ないWindows OS標準のタスクが混ざってしまうので、PowerShellのSelect-Stringコマンドで除外しています。

image

ループの中でschtasks /query /XMLを実行して、各タスクの設定をXML出力します。出力結果は下記画像のようになります。

なお、XMLのスキーマに関しては 公式ドキュメント に詳しく記載されています。

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2020-06-18T18:21:35</Date>
    <Author>***</Author>
    <URI>\miura-task</URI>
  </RegistrationInfo>
  <Principals>
    <Principal id="Author">
      <UserId>***</UserId>
      <LogonType>Password</LogonType>
    </Principal>
  </Principals>
  <Settings>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <Enabled>false</Enabled>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
  </Settings>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2020-06-18T18:20:00</StartBoundary>
      <Repetition>
        <Interval>PT1M</Interval>
      </Repetition>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Users\***\Desktop\task-test\test.vbs</Command>
      <Arguments>hoge piyo hello</Arguments>
    </Exec>
  </Actions>
</Task>

最後に、コマンドでタスク毎に出力されたXMLファイルをGitHubに保存して完了です。

GitHubに保存したXMLでタスクの設定変更を行う

ここまでの手順で、各タスクの設定をXML出力し、そのXMLをGitHubで管理できるようになりました。次に、GitHubに保存したXMLでタスクの設定変更を行う手順を説明します。

タスク設定のXMLを修正

実行頻度やコマンドライン引数などタスクの設定を変更したい場合は、GitHubに保存したタスクのXMLを任意の値に修正します。修正したXMLをPull Requestに出し、コードレビューを行います。

XMLをバッチサーバーに持ってくる

バッチサーバーに変更内容を記載したXMLを git pull で取り込みます。

schtasksコマンドでXMLの内容を反映

schtasksコマンドでXMLを読み込んでタスクの設定を変更します。

schtasks /create /tn ${変更したいタスクの名前} /ru ${バッチ実行ユーザー} /rp %PASS% /XML ${読み込みたいXMLの完全修飾パス} /F

WEARではバッチ実行用のアカウントでバッチを実行させているため、バッチの実行ユーザーとパスワードを明記しています。パスワードはWindowsの環境変数で登録しておいたものを参照させています。実行ユーザーを明記しない場合はこのコマンドを実行したユーザーがバッチの実行ユーザーになります。

反映内容の確認

schtasksコマンドでタスクを検索し、反映した内容を確認できます。

schtasks /query /tn ${変更したタスクの名前} /v /fo LIST

検索結果は下記のように表示されます。

image

まとめ

タスクスケジューラーの運用改善として、GitHubでのタスクの設定管理 + schtasksコマンドでリリースする方法をご紹介しました。この運用によって事前にレビューできるようになり、より安全にリリースができるようになりました。また、コマンドで簡単に更新ができるので操作ミスがなく、作業時間の短縮にもつながりました。

今後の改善として、CI/CD周りを整備してXMLのシンタックスチェックを自動で行なったり、Pull Requestマージ後に自動でリリースして手動作業を完全になくす運用を目指しています。

さいごに

他チームとコミュニケーションを取りながら既存の運用を安全かつ効率的に行えるよう改善していくのはとてもやりがいがあります。

ZOZOテクノロジーズでは、コミュニケーションと技術力を活かしながら一緒に会社を盛り上げてくれる方を募集しています。ご興味のある方は、以下のリンクからぜひご応募ください。

tech.zozo.com

カテゴリー