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関連記事
- AnsibleコントロールノードをAlmaLinux上に構築する
- AnsibleからLinuxサーバに接続するための事前作業
- AnsibleでLinuxサーバの初期設定と単体テストを行う
- Ansibleのベストプラクティスのディレクトリ構成でPlaybookを実行する
- AnsibleからWindows Serverに接続するための事前作業 ←★本記事
- AnsibleでWindows Serverの初期設定と単体テストを行う
- AnsibleでESXi上に仮想マシンを構築する
環境
コントロールノードの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 件のコメント:
コメントを投稿