WindowsでAnsibleをマスターする:あなたの専門家ガイド

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アカウントのパスワードを入力します。

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

デフォルトでは、構成スクリプトはWinRMを基本的なHTTP認証で構成します。より安全な接続を使用する場合は、AnsibleのWinRMをHTTPSで構成する方法を学んでください。

Windows上のAnsibleコントローラを構成する

WindowsノードがAnsibleに対応したので、Ansibleコントローラの構成を行いましょう。

1. 好きなSSHクライアントを使用して、AnsibleコントローラホストにSSHで接続します。

2. pywinrm Pythonモジュールをインストールします。pywinrm Pythonモジュールは、AnsibleがWinRMプロトコルを介してWindowsホストと通信するために必要です。

pip install pywinrm

3. AnsibleインベントリファイルでリモートのWindowsノードを定義します。Ansibleインベントリは、ホスト名またはIPアドレスで定義されたリモートホストのコレクションです。定義した後、Ansibleインベントリをコマンドやプレイブックの対象として使用することができます。すぐに見るように、

デフォルトのAnsibleインベントリファイルは/etc/ansible/hostsディレクトリにあります。

以下のサンプルインベントリファイルは、各Windowsノードを含むwindows ホストグループを作成しています。チュートリアルでは、後で一度に複数のWindowsノードを対象にするために、ホストグループを使用しています。

[windows]
 54.242.251.213
 10.111.4.106

4. 次に、インベントリファイル内のWindowsホストに接続する際にAnsibleが使用するいくつかの必須変数をwindows:varsグループとして定義します。

[windows:vars]
 ansible_user=localadmin ## ansibleが通信するためのWindowsユーザー名
 ansible_password=s3crect ## ansibleが通信するためのWindowsパスワード
 ansible_connection=winrm ## ansibleがリモートのWindowsノードとの接続に使用する接続の種類
 ansible_winrm_server_cert_validation=ignore ## 証明書の検証を無視する(Ansibleに付属する自己署名証明書を使用するため)

5. 今、Win_pingモジュールを使用して、ステップ3で定義されたwindowsホストグループ内のホストへの接続テストを実行します。

# windowsはホストグループです
# -mはAnsibleがwin_pingモジュールを使用することを指定します
 ansible windows -m win_ping

実行後、以下のようにAnsibleは成功したpingの試行を示すSUCCESSメッセージと緑のテキストを返します。

Successful win_ping connection

出力は、AnsibleコントローラーホストがWinRMを介してWindowsリモートホストと正常に通信できることを確認しています。

Windowsホストでのアドホックコマンドの実行

この時点で、AnsibleはWindowsノードを制御する準備が整っています。では、インベントリファイルで定義されたwindowsホストグループのWindowsノードでアドホックコマンドを実行して変更してみましょう。アドホックコマンドは、最初にplaybookを作成する必要がない場合に便利です。

これを行うために、まだAnsibleコントローラーノードにSSH接続していると仮定します。

1. 今回は win_feature モジュール を呼び出し、-a オプションを使用して namestate の2つの引数を渡します。これにより、Windows の機能の名前とそれがあるべき状態を指定します。

# ここで windows はホストのグループです
# win_feature はモジュールの名前です
# state=present はパッケージやサービスをインストールすることを意味します
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

上記のコマンドを実行すると、すべてがうまくいけば、Ansible は windows ホストグループのすべてのノードに接続し、各ノードで win_feature コマンドを実行し、Telnet-Client Windows 機能がインストールされていない場合はインストールします。

Ansible Windows Feature

2. Ansible は成功を表示しますが、確認のために、PowerShell を使用して Windows ノードに手動で接続し、Telnet Client Windows 機能がインストールされているか確認します。ローカルの Windows ワークステーションで、各 Windows コンピューター上で Get-WindowsFeature PowerShell コマンドを実行するために Invoke-Command を実行します。

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

この時点で、アドホックコマンドとして 任意の Windows モジュール を実行できます!

Windows 上で Ansible を作成して実行する

Windows管理ノードでadhocコマンドを実行する技術を習得したら、次に行うべきことは、playbookを作成して実行することです。Ansible playbookは、コマンドを1つの場所にまとめ、複雑なロジックを記述して複雑な自動化シナリオを実行するためのものです。

win_commandモジュールを使用してリモートのWindowsコマンドを実行する

まだAnsibleコントローラホストに接続されていると仮定します:

1. ホームディレクトリの下にansible-windows-demoという名前のフォルダを作成し、そのフォルダに移動します。このフォルダにはプレイブックが保存されます。

mkdir ~/ansible-windows-demo 
cd ~/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リモートホスト上でコマンドを実行します。特殊文字、改行、大なり記号などの変数を含むコマンドは許可されません。

---
 - name: Ansible win_command module example  
   hosts: windows # モジュールを実行するホストグループ
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_commandはWindowsモジュールです。

4. 以下のコマンドを実行して、リモートホスト上でタスクを実行するansible-windows.ymlプレイブックを呼び出します。

ansible-playbook ansible-windows.yml

うまくいけば、以下のような出力が表示されるはずです。

Ansible successfully executed the netstat command using win_command module

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という空のテキストファイルを作成します。

Set-Content -Path C:\temp\test2.txt -Value ''

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モジュールに渡すには、|パイプ文字を使用します。

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # ローカルのWindowsユーザーで接続する
   hosts: windows # リモートホストグループ
   tasks:
    - name: Single line PowerShell # win_shellモジュールを使用して単一のコマンドを実行する
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. 今、ansible-windows-shell.ymlという2番目のプレイブックを呼び出し、リモートホストでPowerShellで実行します。

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. 必要に応じて、ローカルのWindowsワークステーションで、プレイブックが既存のスクリプトとプレイブック内のPowerShellコードを実行したかどうかを確認します。

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

Ansibleのプレイブックが正常に実行された場合、PowerShellは2つのTrueステートメントを返し、ファイルが存在することを示します。

結論

このチュートリアルでは、Ansibleで最初のWindows管理ノードを設定する方法を学びました。Ansibleは従来、Linuxツールとして知られていましたが、Windowsでも簡単に使用することができます!

AnsibleでWindowsを管理するためにどのようなプレイブックとWindowsモジュールを使用しますか?

Source:
https://adamtheautomator.com/ansible-on-windows/