🧰

Windows サンドボックスの中でAnsible構成管理をテストする

2022/09/17に公開

要約

  • AnsibleでWindowsの構成管理をしたいから、WindowsSandbox上で構成管理走らせてテストしたい
  • 上の実行が可能になるまでのお膳立て(WinRMの設定など)も1コマンドに含めた

こういう用途で参考になるかも?

  • 真っ新なWindows環境に複数のソフトをポチポチ入れるのがめんどくさいので、1発で環境構築したい
  • 真っ新なWindows環境で自作のソフトウェアやプラグインのインストール→動作含めてテストしたい

WindowsSandboxとは?

https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-sandbox/windows-sandbox-overview

使い捨てのWindows環境を手軽に実行できるので、中でソフトウェアインストールしたり、環境変数やレジストリの値を書き換えてみたりといった事が可能です。

使い方

READMEを置いてます。

https://github.com/oniku-2929/win_sandbox_ansible

  1. Windows Sandboxの機能を有効化します こちら
  2. 「test.wsb」を利用してWindows Sandboxを起動します
  3. 「run_setup.ps1」と「dev_playbook.yml」をSandbox内の任意の環境に設置します
  4. 「run_setup.ps1」を実行します
    最初にパスワード入力を求められます(WDAGUtilityAccountアカウントのパスワードはこのパスワードに変更されます)
  5. 「dev_playbook.yml」の内容に基づいて、Windows Sandbox環境に必要なソフトウェアがインストールされていきます

内部で走る処理

  • Chocolateyのインストール
  • Cygwinのインストール
  • WinRM のセットアップ こちらを利用しています
  • WDAGUtilityAccountのパスワードを「run_setup.ps1」を実行した際に入力したものに変更します

動作確認済み環境

エディション:Windows 10 Pro
バージョン:21H2
OSビルド:19044.1889

動機

手元の開発環境をWindowsSandboxの中で構築しようと思ったのがスタート地点です。
Windowsで何らかのソフトウェア入れて開発環境構築すると、環境変数やレジストリの値の書き換えが発生しがちです。

🤔「書き換え自体は仕方がないにしても、どこか隔離された環境でテストとかできないかなぁ・・・」

🧐「WindowsSandboxという機能で隔離機能が作れるのか」

😮「うおおお!環境変数やレジストリが確かに切り離されてる!!」

🤨「よし、ここにぽこぽこソフトいれてこう ポチポチめんどくさ・・・」

🤔「そういえば昔AnsibleでWindowsも構成管理できるのを見たなぁ、せっかくだし試してみるか」
という流れが事の経緯です。

詰まった点

直接の使用等には関係ないですが以下、環境構築中に詰まった点です。

  • ansibleのインベントリファイル(hosts)の値が誤っていて時間を溶かした
    hostsファイルは「run_setup.ps1」の中で生成していますが、これが最初
   [winrm_local:vars]
   ~~~~
   ansible_winrrm_transport=basic
   ansible_winrrm_server_cert_validation=ignore 
   #本来は「ansible_winrm_***」

となっていた為、WinRMの設定を変更していじりまくっても

   fatal: [127.0.0.1]: UNREACHABLE! => {"changed": false, "msg": "ssl: HTTPSConnectionPool(host='127.0.0.1', port=5986): Max retries exceeded with url: /wsman (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1091)')))", "unreachable": true}

というエラーが出力され、ansibleでの環境構築が実行できませんでした。(わかったときは「ンンンンアアアアアアアアアアアアア!!👺」となりました)
何かうまく動作しない時は、大体自分が何か見逃してるやつは自戒しながらも毎回毎回起こる問題として
インベントリファイル自体のチェックを行う手段ってなにか存在するんですかね?

  • cygpathでWindows → cygwinのパス変換
    以下のようなWindows上のパス → cygwin上のパスに変換する際に
    cygpathを利用していますが参照:cygpath

    "C:\Users\WDAGUtilityAccount\Desktop\hosts"
    ↓
    "/cygdrive/c/Users/WDAGUtilityAccount/Desktop/hosts"
    

    bash -c 経由でコマンドを渡している都合で

    "C:\Users\WDAGUtilityAccount\Desktop\hosts"
     ↓
    "C:UsersWDAGUtilityAccountDesktophosts"
    

    として渡されてしまうので,最終的に

    "C:\\\\Users\\\\WDAGUtilityAccount\\\\Desktop\\\\hosts"
    

    として渡しています。

    cygwin上では

    cygpath -u C:\\Users\\WDAGUtilityAccount\\Desktop\\hosts
    

    というコマンドとして実行されています。

毎回環境が消えちゃうから、再起動が必要なソフトウェアのテストはできないのでは?

はい、現状はそのようです。
Windows 11 Build 22509のInsider Previewで再起動が挟まるようなフローでも対応する旨のアナウンスがされています。

https://blogs.windows.com/windows-insider/2021/12/01/announcing-windows-11-insider-preview-build-22509/

Windows Sandbox now supports reboot inside of its virtualized environment (for example, if you were to click the Restart option under the Power button in Start).

Windows11を使用していれば、そのうち対応されるのかなと思います。

参考にさせて頂いたURL

https://zenn.dev/nobokko/articles/idea_winget_wsb
https://overcome-adv.hatenablog.com/entry/2018/08/27/203903
https://www.torutk.com/projects/swe/wiki/AnsibleをWindows上のWSLにインストール

所感

これでガシガシレジストリ書き換えてやるううううう
😁📝🧰 Sandbox

😮️️📝🖥️ ホストのWindows「あ...」

😮️️💬🖥️💀

🙈💥

Discussion