BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ansible】AnsibleでWindowsUpdateを自動化する

 こんにちは!
 BFT名古屋支店の、佐野です。

 以前に書いた記事と同じく、今回も実際にAnsibleを使用する例および方法についてお送りしていきます。
 今回お送りするのは、Ansibleから管理対象となるWindowsにWindowsUpdateを行なわせる方法です。


はじめに:Windowsを管理する場合の前提

 AnsibleでWindowsの構成管理を行なう場合の前提については、こちらの記事を参照ください。

bftnagoya.hateblo.jp

 本記事は以上の記事の内容を行なった、ないしそれに相当する環境であることを前提としております。
 AnsibleによるWindowsの構成管理を行なう準備がまだという場合は、以上記事に沿って環境の準備をお願い致します。


AnsibleでWindowsUpdateを行なう場合に使用するモジュール

 Ansibleにおいて管理対象に処理を行なわせる場合、その実行内容をまとめるPlaybookに実際に行なわせる処理を記述する必要があります。
 その処理を実施するためのコードに相当するのが、Ansibleにおける“モジュール”となります。
 Playbookの処理内容はすべてモジュールの組み合わせであると言っても過言ではなく、使用したモジュールによって処理の内容が決まります。

 Ansibleでは汎用的に使用できるモジュールの他、Windowsの自動構成管理を行なうためのモジュールも多くサポートされています。
 WindowsUpdateを行なうモジュールも用意されており、今回はそのモジュールを使ったPlaybookを作成していく流れとなります。

 今回使用するモジュールは、WindowsUpdateを行なうものも含めて以下の通りとなります。

使用モジュール 概要
win_updates Windowsアップデートをダウンロードしてインストールします
win_reboot Windowsを再起動します

WindowsUpdateを行なわせるPlaybook

 管理対象にWindows Updateを行なわせるPlaybookの作成例は以下の通りとなります。

- hosts: all

  tasks:
  - name: win_os_update
    win_updates:
      category_names:
        - SecurityUpdates
        - CriticalUpdates
        - UpdateRollups
  
  - name: win_os_reboot
   win_reboot:

 WindowsUpdateを行なったのち、再起動も自動で行わせるために別タスクとしてwin_rebootモジュールを使用しています。
 実のところ、win_updateモジュールにおいてもアップデート適用後に再起動を行なわせるrebootオプションを指定することができるのですが、一般的には以上のPlaybookのように再起動のタスクを別途設定することが多いようです。

 また「WindowsUpdateを実行する必要があるかを知りたい」場合は、このPlaybookをチェックモードで起動するか、以下のようにstateオプションでsearchedを指定することにより、更新の必要がある内容をリストとして表示することができます。
 リストが表示されれば更新の必要があるということになり、特に続けてアップデートを行なうかどうかの判断する際には重要と言えます。

- hosts: all

  tasks:
  - name: win_os_update
    win_updates:
      category_names:
        - SecurityUpdates
        - CriticalUpdates
        - UpdateRollups
    state: searched

さいごに:繰り返しWindowsUpdateを行なわせる方法

 以上でAnsibleによって管理対象にWindowsUpdateを行なわせる方法、Playbookの作成例に関する解説は終了となりますが、これは1回のWindowsUpdateを行なわせる方法となります。
 実際の運用では依存関係の都合上、WindowsUpdateを複数回行わせなければいけないシチュエーションも出てくると思いますし、そのケースを想定して「WindowsUpdateの必要がなくなるまで自動で行わせたい」と考えるのも自然かと思います。

 「WindowsUpdateの必要がなくなるまで自動で行わせたい」ということは、一定の条件下でPlaybookの処理をループさせることになりますが、Ansibleにおいては仕様上なかなか難しいと言わざるを得ません。
 有限となる複数回のアップデートおよびチェックを行なうという処理で問題ないというのであれば、Roleを利用してチェックと更新を繰り返し行なわせるPlaybookの流れを作るか、AnsibleTower(AWX)のワークフローを組んでそれらしいもので間に合わせるのが一番簡便であると考えます。
 筆者としては、用意できるのであれば後者のワークフローを利用するやり方がおすすめとなります。

 ただ、それでもWindowsUpdateさせる処理をループさせたい!という方もいらっしゃるかと思いますので、どこかの機会でその手法については触れていきたいと思います。