2022年8月13日土曜日

AnsibleからWindows Serverに接続するための事前作業

AnsibleはLinuxサーバに対してはSSHを使用して接続するが、Windows ServerのようにデフォルトではSSH接続ができないOSの場合は当然SSHによる処理実行はできない。しかし、SSHは使えなくともAnsibleから接続する手段は用意されており、Windows Serverの場合はWinRMを用いて接続することができる。

本記事では、AnsibleからWindows Serverに接続し処理を実行できるようにするための事前作業を記載する。

なお本記事では触れないが、最近のWindows OSではOpenSSHサーバのインストールが可能となっており、Ansible 2.8以降ではSSHによる接続もできるようだ。Windows Server 2019にOpenSSHをインストールする方法は以下別記事を参照いただきたい。

今までのAnsible関連記事

環境

コントロールノードのLinuxのOSは、AlmaLinuxにて構築している。実行対象のWindows Serverは、Windows Server 2019とした。

  • コントロールノード
    • OS : AlmaLinux 8.5
    • Ansible : ansible [core 2.13.1]
  • Ansible実行対象サーバ
    • OS : Windows Server 2019
    • IPアドレス : 192.168.1.194

AnsibleによるWindows Server接続手順

1. Ansibleコントロールノードにpywinrmをインストール

前述の通りAnsibleは、Windows Serverに対してWinRMによる接続を行うため、WinRMにて接続を行うために必要となるPythonのモジュールであるpywinrmをインストールしておく。

[Ansibleコントロールノード]
# pip3 install pywinrm

2. WinRM設定用スクリプトをダウンロード

実行対象サーバのWindows ServerでWinRMを有効化するためのスクリプトConfigureRemotingForAnsible.ps1を以下URLからダウンロードする。

3. WinRM設定用スクリプトを実行

PowerShellのプロンプトを「管理者として実行する」で開き、まずは現在のWinRMの設定を確認する。初期状態ではポート5985のListenerが存在しているだけとなっている。

[実行対象サーバ]
PS> winrm enumerate winrm/config/Listener
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 127.0.0.1, 192.168.11.194, ::1

先ほどダウンロードしたWinRM設定用スクリプトを実行し、最後に「OK」と表示されることを確認する。処理は10秒程度で完了する。

[実行対象サーバ]
PS> powershell.exe -ExecutionPolicy ByPass -File .\ConfigureRemotingForAnsible.ps1
Self-signed SSL certificate generated; thumbprint: 274532XXXXA792D9D89EF21XXXXD541B542BB5EF


wxf                 : http://schemas.xmlsoap.org/ws/2004/09/transfer
a                   : http://schemas.xmlsoap.org/ws/2004/08/addressing
w                   : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
lang                : ja-JP
Address             : http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters : ReferenceParameters

OK   ←★「OK」を確認する

実行後、再度WinRMの設定を確認すると、ポート5986のListenerが追加されているはずだ。

[実行対象サーバ]
PS> winrm enumerate winrm/config/Listener
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 127.0.0.1, 192.168.11.194, ::1

Listener          ←★追加されている
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname = T1194W219
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint = 274532XXXXA792D9D89EF21XXXXD541B542BB5EF
    ListeningOn = 127.0.0.1, 192.168.11.194, ::1

4. Ansible実行用ユーザを作成しパスワードを設定

実行対象サーバに対して、Ansible実行用ユーザを作成する。また、WinRMではパスワード認証にて接続することから、パスワードの設定も行う。なお、Ansibleからの処理実行時には特権が必要となることから、ローカルのAdministratorsグループに所属させておく。

[実行対象サーバ]
PS> $ansible_pass = "[任意のパスワード]"
PS> New-LocalUser -Name "ansibleuser" -PasswordNeverExpires -Password (ConvertTo-SecureString "${ansible_pass}" -AsPlainText -Force)
PS> Add-LocalGroupMember -Group "Administrators" -Member "ansibleuser"

5. インベントリファイルの作成

Ansible実行時の実行対象サーバを定義するインベントリファイルをhostsというファイルで作成する。対象がLinuxサーバの場合は、実行時に利用するユーザとパスワード情報だけ指定すれば問題なかったが、Windowsの場合は、WinRMによる接続であることを明示的に指定するため、以下3点を変数で指定する。

  • 接続ポート番号 (ansible_port)
  • 接続方式 (ansible_connection)
  • 接続時の証明書の検証を無視する (ansible_winrm_server_cert_validation)

また、Ansible接続用ユーザのパスワードが平文で書かれてしまうという問題がある。パスワードを平文でインベントリファイルやPlaybookに記載しないためのツールとして、「Ansible Vault」があるが、こちらについては別記事で使用方法を紹介することとしたい。

[Ansibleコントロールノード]
# cd ~
# cat << 'EOF' > hosts
[windows_servers]
t1194w219 ansible_host=192.168.11.194

[windows_servers:vars]
ansible_user=ansibleuser
ansible_password=[ansibleuserのパスワード]
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
EOF

6. Ansibleコントロールノードからの接続確認

これでAnsibleを実行するための準備は整った。Ansibleコントロールノードからwin_pingモジュールを用いて接続確認をしてみよう。結果としてpongが返ってくればOKとなる。

[Ansibleコントロールノード]
# ansible -i hosts -m win_ping t1194w219
t1194w219 | SUCCESS => {
    "changed": false,
    "ping": "pong"   ★pongが返ってくればOK
}

以上で、AnsibleからWindows Serverに接続するための事前作業は完了となる。次回以降の記事で、実際にWindows Serverに対してPlaybookを実行してみたいと思う。

参考

0 件のコメント:

コメントを投稿

人気の投稿