The Inside Playbook

Windows ホストへの接続

2018年4月24日、寄稿者:Bianca Henderson

Windows 向け「はじめに」シリーズ第 1 回へようこそ。

Windows ホストの一部を Red Hat Ansible Tower で自動化したいが、どのようにセットアップしたらよいのか、わからないですか?ソフトウェアを追加でたくさんインストールしなければ Red Hat Ansible Engine が Windows サーバーと通信できなくなるのではないかという不安がありますか?人気のアプリ「Clippy」を簡単に自動化したいですよね?


画像提供元:aguyiknow.com.au

3 番目のご希望にはお応えできませんが、他の 2 つの問題には解決策があります。この記事では、Windows ホストをセットアップして Ansible Engine と接続するために必要な、すべての手順を説明します。

Windows ホストを自動化する理由

Ansible Engine は Windows ホストに対してさまざまな処理を実行できます。以下はその一部です。

  • サービスの起動、停止、管理
  • PowerShell カスタムスクリプトのプッシュと実行
  • Chocolatey パッケージマネージャーによるパッケージの管理

ローカルユーザーまたはドメインユーザー権限で Windows ホストを接続して自動化できるだけでなく、runas を使用し管理者 (Linux の sudosu に該当する Windows のロール) として処理を実行できるので、特権エスカレーションの機能は失われません。

要件

はじめに、基本要件を確認しましょう。まず、制御マシン (選択した Windows モジュールを Ansible Engine が実行する場所) が Linux を実行できる必要があります。次に、Windows への対応は急速に進化しているため、最新バージョンの Ansible Engine を取得して、最新機能を使えるようにしておきましょう!

ターゲットホストについては、Windows 7 SP1 以上または Windows Server 2008 SP1 以上を実行することが最小要件です。Windows NT などの過去の遺物を実行していては、以下の図のような事態を招きかねません。


画像提供元:youtube.com/watch?v=RoQxGYIwA4s

最後に、Ansible は Windows Remote Management (WinRM) (Linux/Unix マシンの SSH に該当) を使用して Windows マシンに接続し、PowerShell スクリプトを実行するので、WinRM リスナーを作成して有効にする必要があります。しかし幸いにも、Windows ホストの接続は、スクリプトを使用すると非常に簡単にすばやく実行できます。このスクリプトについて、以下のセクションで説明します。

ステップ 1:WinRM のセットアップ

WinRM とは何かから説明しましょう。これは Windows Vista およびそれ以降に搭載された、管理者が管理スクリプトをリモートで実行できる機能です。Simple Object Access Protocol (一般に SOAP と呼ばれています) をベースにした WS-Management プロトコルを実装して、接続を処理します。WinRM では、ローカルおよびリモートのコンピュータからネットワーク管理者としてデータにアクセスしたり、編集やアップデートを行ったり、便利な機能を利用できます。

WinRM が Ansible Engine との併用に最適である理由は、Windows 以外のオペレーティングシステム (具体的には Linux) で実行される WS-Management プロトコル実装からハードウェアデータを取得できることです。基本的には、種類の異なるオペレーティングシステムが連携できるようにする変換器として働きます。

では、どのように接続するのでしょうか。

ほとんどのバージョンの Windows には WinRM が付属していますが、デフォルトでは有効になっていません。「Configure Remoting for Ansible」というスクリプトがあり、リモート Windows マシンを (PowerShell コンソールで管理者として) 実行し、WinRM を有効にできます。https リスナーをセットアップするには、自己署名証明書を構築して PowerShell コマンドを実行し、以下の例のようなスクリプトを実行するだけです (.ps1 ファイルをマシン上にローカルに保存している場合)。


注:環境内にセットアップする Windows ホストが多数ある場合、win_psexec モジュールを使用すると、WinRM を複数のマシンで有効にできます。

WinRM と Ansible の詳細については、Windows Remote Management のドキュメントページをご確認ください。

ステップ 2:Pywinrm のインストール

pywinrm の依存関係は Ansible Engine に搭載されていないので (しかもこれらは WinRM の使用に必要)、 pywinrm 関連のライブラリを Ansible がインストールされているマシンにインストールしてください。ターミナルから pip install pywinrm を実行するのが、最も簡単な方法です。

ステップ 3:インベントリーファイルの適切なセットアップ

Windows ホストに適切に接続するには、インベントリーファイルの host vars セクションに ansible_connection=winrm を指定し、Ansible Engine が SSH で Windows ホストに接続を試行し続けないようにします。

また、WinRM 接続プラグインのデフォルトは https を介した通信ですが、メッセージ暗号化 http などの別のモードにも対応しています。前のステップで実行した「Configure Remoting for Ansible」スクリプトは自己署名証明書でセットアップするので、Python に、「この証明書は有効な CA から発行されないので、検証しようとするな」と指示しなければなりません。エラーを防止するためには、host vars セクションに ansible_winrm_server_cert_validation=ignore

も指定する必要があります。全体を確認できるように、ホストファイルのサンプルを示します (それぞれの環境に応じて細部は異なります)。

[win] 172.16.2.5 172.16.2.6 [win:vars] ansible_user=vagrant ansible_password=password ansible_connection=winrm ansible_winrm_server_cert_validation=ignore 

ステップ 4:接続のテスト

うまく機能するか、試してみましょう。このためには、コントロールノードのターミナルに移動して、ansible [host_group_name_in_inventory_file] -i hosts -m win_ping と入力します。以下のような出力結果になります。


注:すべての Windows モジュールに付けられた win_ プリフィックスは、Python ではなく PowerShell で実装されていることを示しています。

WinRM のトラブルシューティング

WinRM の設定方法は多数あるので、Ansible Engine 関連と思われるエラーが実際にはホストセットアップの問題だという場合もありえます。発生すると考えられる WinRM エラーの例には、HTTP 401 または HTTP 500 エラー、タイムアウトの問題、接続拒否などがあります。このような問題を解決するヒントについては、Windows セットアップのページで「Common WinRM Issues」のセクションをご覧ください。

まとめ

これで、追加のソフトウェアを山ほどインストールしなくても、Ansible を使用して Windows ホストを自動化する準備が整いました。ただし、上記の手順に従った場合でも、一部の Windows モジュールにはその他の仕様があることに注意してください (新しい OS や PowerShell バージョンなど)。正しい要件を満たしているか判断する最良の方法は、モジュールに関するドキュメントページを確認することです。

Ansible Engine を使用して Windows ホストを自動化する方法の詳細については、Windows FAQ および Windows サポートのドキュメントページを確認して、今後の Windows 関連のブログ投稿にご期待ください。

お問い合わせ・製品のご紹介

Red Hat Ansible Automationについてのお問い合わせは

ansible-jp@redhat.com

Red Hat Ansible Automation製品について

詳細はこちら