AnsibleからWindowsホストを操作する方法を知りたい方、必見です。この記事では、AnsibleからWindowsホストを操作する方法やインストールコマンドを解説します。また、Ansibleによる使用例も紹介します。Windowsホストを操作してみたい方は、ぜひ参考にしてください。
1. AnsibleでWindowsホストを操作するには?
構成管理ツール「Ansible」は、インフラ構築の自動化に適したRed Hat社が開発するツールです。
ネットワークやサーバなどの構築、管理、運用に広く活用されており、特にサーバーサイドエンジニアやネットワークエンジニアはAnsibleを学習することで担当できる案件の幅も広がりやすいです。
Ansibleについてはこちらの記事でも解説しています。
またプロエンジニアでもAnsibleのフリーランス案件を多数取り扱っています。参考にご覧ください。
今回は、AnsibleでWindowsホストを操作する方法について解説します。
1.1 【Windows向け】Ansibleによる使用例
まずはAnsibleでWindowsホストを操作・管理した際の使用例を紹介します。
- MSIファイルを用いたインストールとアンインストール
- Windowsの標準機能の有効や無効の切り替え
- Windowsレジストリの設定変更
- Windows サービスの開始・停止
- Windows サービスの追加・管理
- WindowsOSのローカルユーザーとグループの作成と管理
- ドメイン及びドメインに参加するユーザーの管理
- ソフトウェア管理自動化ツール※1 による Windows パッケージの管理
- Windows Updateの実行管理
- WindowsホストへのPowerShell スクリプトの配置と実行
※1 Chocolateyと呼ばれるWindows専用パッケージマネージャーです。依存関係があるソフトウェアを含めて、ソフトウェアのインストールと更新が行えます。
1.2 基本的なAnsibleによるWindows操作の流れ
AnsibleからWindowsホストを操作するには、WindowsホストにWinRM(Windows Remote Management)をAnsibleが稼働する環境にPywinrmをインストールする必要があります。
WinRMとはWindowsの機能で、インターネットを経由して、WindowsOSの管理情報に接続・変更できる機能です。Pywinrmとは、Pythonで作られたLinuxからWindowsコマンドを実行するアプリケーションです。
それではインストールの流れを順に解説します。
1.3 ホスト要件
まずAnsibleで操作するWindowsのホスト要件を満たしているか、最新情報を確認することが必要です。
ホスト要件はWindowsOSのサポート状況などによってホスト要件がアップデートされる可能性があります。また、サポートされていないWindowsホストをAnsibleで操作しようとした場合、動作しない可能性も考えられます。
AnsibleでWindowsホストを操作できるよう環境設定を行う場合は必ず公式サイトで最新情報をチェックしましょう。
▸ ホスト要件|Ansible公式サイト
1.3.1 Windowsホスト要件の確認
2021/06時点でAnsibleを利用する上でWindowsホストが満たす必要がある条件は以下の通りです。
【1】いずれかのOSであること
■ デスクトップOS
- Windows 7
- Windows 8.1
- Windows 10
■ サーバーOS
- Windows Server 2008
- Windows Server 2008 R2
- Windows Server 2012
- Windows Server 2012 R2
- Windows Server 2016
- Windows Server 2019
【2】Windowsホストで以下の機能が利用可能な状態であること
- PowerShell 3.0 以降
- .NET Framework 4.0 以降
【3】WinRMでAnsibleが利用するリスナーを作成し、有効化していること
1.3.2 PowerShell および .NET Framework
Windowsホストには、AnsibleがサポートしているバージョンのPowerShellと.NET Frameworkがインストールされている必要があります。
- PowerShell 3.0 以降
- .NET Framework 4.0 以降
上記のバージョンより古い場合はアップデートが必要です。次の手順でアップデートします。
【1】PowerShellでGitHubよりアップデート用のスクリプトファイルをダウンロードし、ダウンロードしたスクリプトを実行する
$githubUrl = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$scriptFile = "$env:temp\Upgrade-PowerShell.ps1"
$username = "winserver01_user"
$password = "winserver01_pass"
(New-Object -TypeName System.Net.WebClient).DownloadFile($githubUrl, $scriptFile)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
&$scriptFile -Version 5.1 -Username $username -Password $password -Verbose
【2】スクリプトを実行する際に変更した実行ポリシーをデフォルトに戻す
Set-ExecutionPolicy -ExecutionPolicy Restricted -Force
$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue
1.3.3 WinRM
WinRMとは、Microsoftが提供するWindowsの管理機能です。Ansibleでは、Windowsホストを操作するためにWinRMを利用します。
WinRMを利用することで、別の端末からインターネットを経由して、WindowsOSに接続し、管理情報を閲覧したり、変更したりすることが可能です。WinRMの設定方法は次の見出しで解説します。
2. WinRMの設定方法
WinRMの設定はPowerShell 3.0 以降のアップデートが完了した環境に実施します。実施する手順は次の通りです。
- Ansibleとの基本設定の作成
- WindowsホストのあわせてWinRMリスナーの設定
それでは、詳しく解説します。
2.1 WinRM のセットアップ
AnsibleからWindowsホストに接続・管理するためのリスナーとサービスを作成します。基本設定は以下のAnsible公式がGitHubで提供しているスクリプトで設定可能です。
基本設定をセットアップするコマンドは以下の通りです。
$githubUrl = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$scriptFile = "$env:temp\ConfigureRemotingForAnsible.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($githubUrl, $scriptFile)
powershell.exe -ExecutionPolicy ByPass -File $scriptFile
<注意事項>
基本設定ではBasic認証などが有効になっているため、運用環境でのご利用はお控えください。
2.2 WinRMリスナーの確認
先ほど作成したWinRMリスナーが実行されているか、確認します。
winrm enumerate winrm/config/Listener
2.3 WinRMのリスナーの設定
環境構成に応じて、WinRMのリスナーに設定します。設定方法は次の3つがあります。
2.3.1 winrmコマンドを利用する方法
AnsibleとWindowsホストの接続プロトコルに応じて次のwinrmコマンドを実行します。
<HTTP接続の場合>
winrm quickconfig
<HTTPS接続の場合>
winrm quickconfig -transport:https
2.3.2 グループポリシーオブジェクトを使用する方法
Windowsホストがドメインのメンバーの時に利用する方法です。
グループポリシーオブジェクトの詳細はMicrosoftの公式サイトよりご確認にしてください。
▸ Group Policy Objects|Microsoft公式サイト
2.3.3 WinRM用のリスナーを作成する方法
PowerShellを実行して、WinRM用のリスナーを作成します。
PowerShellの実行例は次の通りです。
$selector_set = @{
Address = "*"
Transport = "HTTPS"
}
$value_set = @{
CertificateThumbprint = "E6CDBB82EEAF2ECE8546E05DB7F3E01BB47D76CE"
}
New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set
他にもオプションがあり、オプションの内容を確認したい方は、Microsoftの公式サイトよりご確認ください。
▸ New-WSManInstance|Microsoft公式サイト
3. Pywinrmのインストール
AnsibleはPywinrmというLinuxからWindowsコマンドを実行できるアプリケーションを利用して、Windowsホストを操作します。Pywinrmは、LinuxOSに標準搭載されておらず、Ansibleとの依存関係もありません。
そのため、Ansibleとは別にPywinrmをインストールする必要があります。Ansibleのセットアップが完了した環境にてpip※2 を利用して、Pywinrmをインストールします。
【1】Pywinrmをインストールする
$ pip install pywinrm
【2】インストールできたか、確認する
$ pip3 list | grep pywinrm
pywinrm 0.4.2
※2 pipとは、Pythonで作成されたパッケージをインストールする際などに利用するユーティリティです。
4. インベントリーファイルのセットアップ
Ansibleのイベントリーファイルに操作するWindowsホストを設定します。イベントリーファイルの形式によって書き方が異なります。お使いのファイル形式をご参考にしてください。
4.1 INI形式で書いた場合
イベントリーファイルに次の形式で記述します。
4.2 YAML形式で書いた場合
イベントリーファイルに次の形式で記述します。
5. 接続のテスト
最後にAnsibleからWindowsホストに接続できるか、テストします。
$ ansible windows -i hosts -m win_ping
winserver01.sample.com | success => {
"changed": false,
"ping": "pong"
}
Windowsホスト名もしくはIPアドレスの右に「success」と表示されたら、Ansibleとの接続成功です。
接続に成功しなかった場合は、Ansible公式サイトのトラブルシューティングをご参考にしてください。
▸ 一般的なWinRMの問題|Ansible公式サイト
6. Ansibleで使用可能なWindowsモジュールについて
AnsibleはPlayBook(プレイブック)という自動化したい処理をYAML形式のファイルに記述します。
Windowsホストに対してはPlayBookに記述された内容をモジュールが実行します。
プロセスの実行までの流れは、AnsibleからWinRM経由でホストにモジュールをコピーした上で、PlayBookに記述された状態になるようにプログラムを実行するという流れです。
ご利用のOSや機器、クラウドサービスによって、利用できるモジュールが異なります。
6.1 Windows Server モジュールの一覧
AnsibleではAnsible Collectionより数多くのモジュールを提供しています。
Ansibleで提供しているモジュールはAnsible公式サイトにて一覧で紹介しております。
もっとモジュールを詳しく知りたい方は、ご確認ください。
▸ Ansible.Windows|Ansible公式サイト
6.2 Windows Server モジュールの例
Ansible 2.10で利用できるモジュールの一例を紹介します。
win_acl | ファイルやディレクトリ・レジストリへのアクセス許可の管理 |
---|---|
win_command | Windowsホスト上でのコマンドの実行 |
win_copy | Windowsホストへファイルのコピー |
win_file | ファイルまたはディレクトリの作成、変更・削除 |
win_find | 特定の条件に該当するファイルの検索 |
win_get_url | Windowsホストへのファイルのダウンロード |
win_reboot | Windowsホストの再起動 |
win_regedit | レジストリのキーと値の追加・変更・削除 |
win_service | windowsサービスの管理 |
win_updates | WindowsUpdateのモジュールをダウンロード後、インストール |
win_user | Windowsホストのユーザーアカウントの管理 |
win_user_right | Windowsホストのユーザー権限の管理 |
6.3 目的に合致するモジュールの探し方
目的にあったWindows Serverのモジュールの探し方を2種類解説します。モジュールを探す際にぜひ参考にしてください。
6.3.1 Ansible公式サイトから探す
Ansible公式サイトにWindowsのモジュールと概要が一覧で掲載されていますので、その一覧から探す方法です。
掲載内容は英語ではありますが、公式サイトと一番信頼がおけるサイトなので、おすすめします。
▸ Windows modules|Ansible公式サイト
6.3.2 インターネットで検索する
Googleなどの検索エンジンで「Ansible Windows module」といったキーワードで検索し、実行例を探す方法です。いろいろなサイトを横断して検索できるので、便利です。
その一方で、AnsibleとWindowsホストの組合せによっては利用できない可能性があります。
そのため、公式サイトでご利用のAnsibleとWindowsホストがサポートされているバージョンか、確認することをおすすめします。
7. まとめ
今回は、AnsibleでWindowsホストを操作する方法について解説しました。Windowsホストを操作する前に、次の準備が必要です。
■ Windowsホスト側
• WinRMのセットアップ
■ Ansible側
• Pywinrmのインストール
• インベントリーファイルのセットアップ
準備はありますが、AnsibleでWindowsホストを操作できるようになるので、興味がある方は、ぜひ試してみてください。