AnsibleはSSHを使用してLinuxノードを管理することで有名ですが、AnsibleはWindowsでも同様に動作することをご存知でしたか?Windows Remote Management (WinRM)を使用すると、AnsibleはWindowsノードを効果的に管理することができます。
Windows上のAnsibleでは、パッチの展開、Windowsサーバーの管理、PowerShellスクリプトの実行などのタスクを実行することができます。
このチュートリアルでは、最初のWindowsノードをAnsibleで管理するための設定方法と、それに対してコマンドやプレイブックを実行する方法を学びます。
前提条件
チュートリアルに従って進めるためには、以下の環境が必要です:
- Ansibleコントローラーホスト – このチュートリアルでは、IPアドレスが10.111.4.53であるUbuntu 18.04.5 LTSマシン上のAnsible v2.9.18を使用します。なお、コントロールノードとしてWindowsはサポートされていません。
- AnsibleコントローラーホストにインストールされたPython – このチュートリアルではPython v2を使用しますが、v3でも同様に動作するはずです。
- Ansibleコントローラーにpipパッケージがインストールされていること。
- A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
- A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
- 管理するWindowsサーバーにはPowerShellリモーティングが有効になっていること。
- A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.
WindowsでWinRMリスナーを設定する
AnsibleがリモートのWindowsノードと通信するためには、それに接続できる必要があります。これはMicrosoftプロトコルであるWinRMを介して行われます。WinRMは、PowerShell内からリモートコマンドを実行するために使用されるPowerShellリモーティングと同じプロトコルです。
この記事が書かれた時点では、Ansibleは管理プロトコルとしてSSHをサポートしていますが、現時点では実験的な機能です。
Windowsノードとの通信にWinRMを使用するためには、WinRMを構成する必要があります。これを行うために、AnsibleはさまざまなWinRMオプションを設定するPowerShellスクリプトを提供しています。
Red Hatが提供するWinRMの構成に使用されるPowerShellスクリプトはテストされており安全ですが、それを読み、高レベルで何をしているかを理解する必要があります。
最初のタスクは、構成スクリプトをダウンロードし、WindowsノードでAnsibleを実行することです。これを行うには、対象のWindowsコンピュータでPowerShellリモーティングが有効になっていることを前提とし、Windowsワークステーション上で次の手順を実行します。
ConfigureRemotingForAnsible.ps1 PowerShellスクリプトをローカルのWindowsコンピュータにダウンロードしてください。このチュートリアルでは、~\Downloadsに保存されていると想定しています。
Windowsノードで構成スクリプトを実行します。このチュートリアルの2つのデモマシンでコマンドを実行し、Windowsノード上のローカルadminuserアカウントのパスワードを入力します。
デフォルトでは、構成スクリプトはWinRMを基本的なHTTP認証で構成します。より安全な接続を使用する場合は、AnsibleのWinRMをHTTPSで構成する方法を学んでください。
Windows上のAnsibleコントローラを構成する
WindowsノードがAnsibleに対応したので、Ansibleコントローラの構成を行いましょう。
1. 好きなSSHクライアントを使用して、AnsibleコントローラホストにSSHで接続します。
2. pywinrm Pythonモジュールをインストールします。pywinrm Pythonモジュールは、AnsibleがWinRMプロトコルを介してWindowsホストと通信するために必要です。
3. AnsibleインベントリファイルでリモートのWindowsノードを定義します。Ansibleインベントリは、ホスト名またはIPアドレスで定義されたリモートホストのコレクションです。定義した後、Ansibleインベントリをコマンドやプレイブックの対象として使用することができます。すぐに見るように、
デフォルトのAnsibleインベントリファイルは/etc/ansible/hostsディレクトリにあります。
以下のサンプルインベントリファイルは、各Windowsノードを含むwindows
ホストグループを作成しています。チュートリアルでは、後で一度に複数のWindowsノードを対象にするために、ホストグループを使用しています。
4. 次に、インベントリファイル内のWindowsホストに接続する際にAnsibleが使用するいくつかの必須変数をwindows:vars
グループとして定義します。
5. 今、Win_pingモジュールを使用して、ステップ3で定義されたwindows
ホストグループ内のホストへの接続テストを実行します。
実行後、以下のようにAnsibleは成功したpingの試行を示すSUCCESSメッセージと緑のテキストを返します。

出力は、AnsibleコントローラーホストがWinRMを介してWindowsリモートホストと正常に通信できることを確認しています。
Windowsホストでのアドホックコマンドの実行
この時点で、AnsibleはWindowsノードを制御する準備が整っています。では、インベントリファイルで定義されたwindows
ホストグループのWindowsノードでアドホックコマンドを実行して変更してみましょう。アドホックコマンドは、最初にplaybookを作成する必要がない場合に便利です。
これを行うために、まだAnsibleコントローラーノードにSSH接続していると仮定します。
1. 今回は win_feature モジュール を呼び出し、-a
オプションを使用して name
と state
の2つの引数を渡します。これにより、Windows の機能の名前とそれがあるべき状態を指定します。
上記のコマンドを実行すると、すべてがうまくいけば、Ansible は windows
ホストグループのすべてのノードに接続し、各ノードで win_feature コマンドを実行し、Telnet-Client
Windows 機能がインストールされていない場合はインストールします。

2. Ansible は成功を表示しますが、確認のために、PowerShell を使用して Windows ノードに手動で接続し、Telnet Client Windows 機能がインストールされているか確認します。ローカルの Windows ワークステーションで、各 Windows コンピューター上で Get-WindowsFeature
PowerShell コマンドを実行するために Invoke-Command
を実行します。
この時点で、アドホックコマンドとして 任意の Windows モジュール を実行できます!
Windows 上で Ansible を作成して実行する
Windows管理ノードでadhocコマンドを実行する技術を習得したら、次に行うべきことは、playbookを作成して実行することです。Ansible playbookは、コマンドを1つの場所にまとめ、複雑なロジックを記述して複雑な自動化シナリオを実行するためのものです。
win_commandモジュールを使用してリモートのWindowsコマンドを実行する
まだAnsibleコントローラホストに接続されていると仮定します:
1. ホームディレクトリの下にansible-windows-demoという名前のフォルダを作成し、そのフォルダに移動します。このフォルダにはプレイブックが保存されます。
2. 好きなテキストエディタを開き、~/ansible-windows-demoディレクトリにansible-windows.ymlという名前のファイルを作成して保存します。
AnsibleのプレイブックはYAML形式で記述されます
3. 以下のプレイブックをansible-windows.ymlファイルにコピーして、単一のタスクを作成します。このプレイブックは、windows
ホストグループ内のすべてのホストで、win_commandWindows Ansibleモジュールを使用してnetstat Windowsコマンドを実行します。
win_commandモジュールは、Windowsリモートホスト上でコマンドを実行します。特殊文字、改行、大なり記号などの変数を含むコマンドは許可されません。
4. 以下のコマンドを実行して、リモートホスト上でタスクを実行するansible-windows.ymlプレイブックを呼び出します。
うまくいけば、以下のような出力が表示されるはずです。

win_shellモジュールを使用してリモートのPowerShellコマンドを実行する
以前の例では、リモートのcmd.exeコマンド(netstat
)を実行するプレイブックを作成しました。さらに一歩進んで、win_shellモジュールを使用してPowerShellコマンドを実行しましょう。
デフォルトでは、win_shellモジュールはWindowsホスト上でPowerShellを実行します。
ローカルのWindowsワークステーションで:
1. 最初に、お気に入りのテキストエディタをローカルのWindowsワークステーションで開き、サンプルのPowerShellスクリプトを作成し、以下のコードをコピーして、one.ps1という名前で保存します。このチュートリアルでは、スクリプトを~\one.ps1に保存します。
以下のコードは、C:\tempディレクトリにtest2.txtという空のテキストファイルを作成します。
2. one.ps1というPowerShellスクリプトを、選択した方法でWindowsの管理ノードにコピーします。このチュートリアルでは、one.ps1スクリプトを各WindowsノードのC:\Tempフォルダにコピーしたものとします。
3. サンプルのPowerShellスクリプトがWindowsノードにある場合、Ansibleコントローラーホストに接続し、再度お気に入りのテキストエディタを開きます。今度は、同じ~/ansible-windows-demoディレクトリにansible-windows-shell.ymlという別のプレイブックを作成して保存します。
4. 以下のプレイブックをansible-windows-shell.ymlファイルにコピーして貼り付けます。このプレイブックは、win_shellモジュールを使用して2つのタスクを実行します。ステップ2でコピーしたPowerShellスクリプトを呼び出し、プレイブックに直接PowerShellコードを挿入して、スクリプトが必要ないことを示します。
PowerShellコードの複数行をwin_shellモジュールに渡すには、
|
パイプ文字を使用します。
5. 今、ansible-windows-shell.ymlという2番目のプレイブックを呼び出し、リモートホストでPowerShellで実行します。

6. 必要に応じて、ローカルのWindowsワークステーションで、プレイブックが既存のスクリプトとプレイブック内のPowerShellコードを実行したかどうかを確認します。
Ansibleのプレイブックが正常に実行された場合、PowerShellは2つのTrue
ステートメントを返し、ファイルが存在することを示します。
結論
このチュートリアルでは、Ansibleで最初のWindows管理ノードを設定する方法を学びました。Ansibleは従来、Linuxツールとして知られていましたが、Windowsでも簡単に使用することができます!
AnsibleでWindowsを管理するためにどのようなプレイブックとWindowsモジュールを使用しますか?