こんにちは入社2年目の城後です。皆様Windowsサーバに対して複数台動作を実行することに苦労したかたはいませんでしょうか。私は苦労しました。そのため、今回は遠隔からWindowsサーバを操作したいという気持ちからLinuxサーバからWindowsサーバへAnsibleを実施するための準備、実際にWindowsサーバに対してAnsibleを実行する方法までを書いていきます。
実行環境
Linuxサーバ: Ubuntu 20.04
Windowsサーバ: Windows Server 2019
Ansible Version: 2.9.6
Python: 3.8.10
Windowsサーバ側の準備
WindowsサーバにAnsibleで実施する際にはWinRMを有効にする必要性があります。下記のダウンロードしてきたスクリプトを実行することでWinRMを有効にできます。さらに、httpsリスナーを有効にするには自己証明書を使用して構築されます。具体的には下記の手順をWindowsサーバのPowershellで実施します。
$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1
powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1
上記の実行が確認できれば、実際にAnsibleで利用されるWinRMリスナが存在するかを確認するため下記コマンドを実行します。
winrm enumerate winrm/config/Listener
上記を実行することで下記のような結果が得られればWindows側の作業は終了です。
PS C:\Windows> winrm enumerate winrm/config/Listener
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname = WINDOWS-SERVER
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = 127.0.0.1, ***.***.***.***, ::1
Listener
Address = *
Transport = HTTPS
Port = 5986
Hostname = WINDOWS-SERVER
Enabled = true
URLPrefix = wsman
CertificateThumbprint = ****************
ListeningOn = 127.0.0.1, ***.***.***.***, ::1
続いてLinuxサーバ側の準備を行います。
Linuxサーバ側の準備
今回はNTLM認証を利用します。そのためkerberos認証などで実施する場合は別途ツールのインストールが必要となります。*Ansible、Pythonなどは事前にインストールされている前提で進めていきます。
NTLM認証であれば今回はWindowsサーバの接続に必要なモジュールをpipでwinrmモジュールをインストールします。
下記のようにインストールします。
pip install pywinrm
ここまでがLinuxサーバ、WindowsサーバのAnsibleを実行するまでの準備となります。続いてはAnsible-Playbookを書いてきましょう。
Ansible-playbookの準備
Ansible-Playbookを準備していきます。今回は対象のホストに再起動を実行します。ディレクトリ構造は下記のようになります。
Ansible
├── reboot_windows.yml
├── roles
│ └── windows_reboot
│ └── tasks
│ └── main.yml
└── target
└── hosts
それぞれに記載していくAnsible-Playbookの中身を見ていきます。
---
- hosts: windows
roles:
- windows_reboot
---
- name: windows reboot
win_reboot:
[windows]
[対象のIP]
[windows:vars]
ansible_user=USER #windowsのユーザ名
ansible_password=PASSWORD #windowsのパスワード
ansible_port=5986 #今回使用するポート
ansible_winrm_transport=ntlm #使用する認証オプション
ansible_connection=winrm #Ansible EngineがSSHでWindowsホストに接続を試行し続けるためwinrmで接続するように指定
ansible_winrm_server_cert_validation=ignore #Windowsサーバの準備では自己証明書をセットアップするため有効なCAから
発行されたものではありません。そのため検証しないようにignoreを指定しています。
以上になります。
上記を作成した後は準備したLinuxサーバで下記のように実行してみます。
ansible-playbook -i target/hosts reboot_windows.yml
LinuxサーバからWindowsサーバへのAnsibleを実行することができると、自動化という観点から非常に有効でしたので、今後も活用していこうと思います。今回読んでいただきました皆様もぜひお試しください!