
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 の sudo
や su
に該当する 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 関連のブログ投稿にご期待ください。