LinuxサーバからWindowsサーバにAnsibleを実行する

こんにちは入社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を実行することができると、自動化という観点から非常に有効でしたので、今後も活用していこうと思います。
今回読んでいただきました皆様もぜひお試しください!

ブログの著者欄

城後 明慈

GMOインターネットグループ株式会社

2021年度より運用保守業務に従事しています。 主にH/W保守を中心に業務をしています。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW