たとえAnsibleがSSHを使用してLinuxノードを管理するために知られているとしても、Windows上のAnsibleが同様にうまく機能することをご存知ですか?Windows Remote Management(WinRM)を使用すると、Windows上のAnsibleはすべてのWindowsノードを効果的に管理できます!
Windows上のAnsibleを使用すると、パッチのデプロイ、Windowsサーバーの管理、PowerShellスクリプトの実行などのタスクを実行できます。
このチュートリアルでは、最初のWindowsノードをAnsibleで管理する方法と、そのノードに対してコマンドとプレイブックを実行する方法を学びます。
前提条件
チュートリアルに従いたい場合は、次のものを用意してください。
- An Ansible controller host – このチュートリアルでは、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 Remoting が PowerShell 内からリモートコマンドを実行するために使用するプロトコルと同じです。
この時点では、Ansible は管理プロトコルとして SSH をサポートしていますが、これは実験的な機能です。
Windows ノードとの通信に WinRM を使用するためには、WinRM を構成する必要があります。これを行うには、Ansible がさまざまな WinRM オプションを設定する PowerShell スクリプト が提供されています。
Red Hat が提供する WinRM を構成するための PowerShell スクリプト はテストされており、安全ですが、それを読み、その行う作業の高レベルで理解することが重要です。
最初のタスクは、構成スクリプトをダウンロードして Windows ノード上で Ansible を実行することです。これを行うには、対象の Windows コンピューターですでに PowerShell Remoting が有効 になっており、Windows ワークステーションにいると仮定します。
ローカルのWindowsコンピューターにConfigureRemotingForAnsible.ps1 PowerShellスクリプトをダウンロードします。このチュートリアルでは、~\Downloadsに保存されていると仮定します。
WindowsノードAnsibleが管理するように構成スクリプトを実行します。これにはInvoke-Command
コマンドを使用します。以下のコマンドは、チュートリアルの2つのデモマシンでコマンドを実行し、Windowsノードのローカルadminuserアカウントのパスワードを求めます。
デフォルトでは、構成スクリプトは基本的なHTTP認証用にWinRMを構成します。より安全な接続を使用するようにAnsibleを設定したい場合は、AnsibleのためにWinRMをHTTPS経由で構成する方法を学んでください。
Windows上のAnsibleコントローラーの構成
WindowsノードがAnsibleに対応したので、Ansibleコントローラーを構成して、Ansibleがどのように通信するかを示します。
1. 好きなSSHクライアントを使用して、AnsibleコントローラーホストにSSHで接続します。
2. pywinrm Pythonモジュールをインストールします。 pywinrm Pythonモジュールは、Windows上のAnsibleがWinRMプロトコル経由でホストに通信するために必要です。
AnsibleインベントリファイルでリモートWindowsノードを定義します。Ansibleインベントリは、ホスト名またはIPアドレスで定義されたリモートホストのコレクションです。定義された後、Ansibleインベントリをコマンドやプレイブックでターゲットにすることができます。これから見ていきます。
デフォルトのAnsibleインベントリファイルは、/etc/ansible/hostsディレクトリにあります。
以下のサンプルインベントリファイルは、各Windowsノードを含むwindows
ホストグループを作成しています。チュートリアルでは、後で複数のWindowsノードを一度にターゲットにしやすくするために、ここでホストグループを使用しています。
4. 次に、インベントリファイル内のWindowsホストに接続する際にAnsibleが使用するいくつかの必要な変数をwindows:vars
グループとして定義します。
5. 今、Ansibleのwin_pingモジュールを使用して、ステップ#3で定義されたwindows
ホストグループ内のホストに対して簡単な接続テストを実行します。
実行した後、以下のようにAnsibleがSUCCESSメッセージとともに緑色のテキストを返すことがわかります。成功したping試行を示しています。

出力は、AnsibleコントローラーホストがWinRM経由でWindowsリモートホストと正常に通信できることを確認しています。
Windowsホストでアドホックコマンドを実行する
この時点で、AnsibleがWindowsノードを制御を開始できる準備が整っています。これをテストするために、インベントリファイルのwindows
ホストグループで定義されたWindowsノード上でアドホックコマンドを実行します。アドホックコマンドは、最初にplaybookを作成せずにノード上で簡単なコマンドを実行する必要がある場合に便利です。
これを行うには、引き続きAnsibleコントローラーノードにSSH接続されていると仮定します。
1. 今回はwin_featureモジュールを呼び出す(-m
)ことにします。このモジュールはname
とstate
の2つの引数(-a
)を受け取ります。これらはWindowsの機能名とそれが取るべき状態を示します。
上記のコマンドを実行すると、すべてがうまくいけば、Ansibleはwindows
ホストグループのすべてのノードに接続し、それぞれのノードでwin_featureコマンドを実行し、Telnet-Client
Windows機能が存在しない場合はインストールします。

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

win_shellモジュールを使用して、リモートの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という別のPlaybookを作成して保存します。
4. 以下のPlaybookをansible-windows-shell.ymlファイルにコピーして貼り付けます。このPlaybookは、win_shellモジュールをデモンストレーションするために、2つのタスクを実行します。これは、ステップ#2からコピーしたPowerShellスクリプトを呼び出し、スクリプトが全く必要ないことを示すために、PowerShellコードを直接Playbookに挿入します。
win_shellモジュールに複数行のPowerShellコードを渡すには、
|
パイプ文字を使用します。
5. 今、リモートホストでPowerShellを使用して実行される2番目のPlaybookであるansible-windows-shell.ymlを呼び出します。

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