Romira's develop blog

Windows・WSLの開発環境をansibleで管理しているという話

Cover image of Windows・WSLの開発環境をansibleで管理しているという話

概要

私は普段、仕事ではMac、プライベートではWindows(WSL - Ubuntu)で開発しています。

皆さんは、「今すぐお使いの端末を初期化してください」と言われたら、何時間で普段の環境に復元できますか?

私の場合、Ubuntuなら30分、Windowsならアプリケーションのインストールに時間がかかるので1~2時間程度でしょうか。

復元作業では何をしているかというと、Ansibleを実行しているだけです。

というわけで、今回は開発環境をAnsibleで管理している方法について紹介したいと思います。

Ansibleとは

ChatGPTより

Ansibleは、ITの構成管理(Configuration Management)やアプリケーションデプロイメント(Application Deployment)、プロビジョニング(Provisioning)、オーケストレーション(Orchestration)などを自動化するためのオープンソースツールです。

Ansibleの特徴として、エージェントなどをプロビジョニング先のOSに別途インストールする必要がない点が挙げられます。
sshなどで接続さえできれば利用可能です。

Linuxをはじめ、MacやWindowsにも対応しています。

管理方法

以下のリポジトリで管理しています

このリポジトリには、私が管理しているインフラやクラウドリソースのコードも含まれています。
ansible/inventories配下にターゲット先を配置しており、develop_ubuntuが開発用WSL、develop_windowsがWindows、develop_macOSがMacですが、Macの設定は整備中となっています。

また、ansible/roleには、それぞれのパッケージやシステム操作をroleとしてまとめています。
role化することで、複数のinventoriesから再利用可能な構成にしています。

playbookを実行する側では、roleと必要な変数を指定するだけで、必要なアプリケーションやミドルウェアがセットアップできる状態にしています。

例えば、UbuntuとWindowsの両方でインストールしているghでは、Unix用のunix_gh.ymlとWindows用のwin_gh.ymlを実装し、ansible_facts.systemを参照することで両方のシステムに対応しています。

- name: Gather facts
  ansible.builtin.gather_facts:
  when: ansible_facts.system is not defined
  tags:
    - gh

- name: Import task
  ansible.builtin.import_tasks: unix_gh.yml
  when: ansible_facts.system in ['Linux', 'Darwin']

- name: Import task
  ansible.builtin.import_tasks: win_gh.yml
  when: ansible_facts.system in ['Win32NT']

また、開発環境の設定に限らず、セットアップには秘匿性のある情報(ユーザーパスワードや秘密鍵など)が必要になることがあります。それらもansible-vaultを使うことで暗号化し、安全に保管しています。

Windowsに対してAnsibleを実行する場合

LinuxなどをターゲットとしたAnsibleは、sshが利用可能な環境であれば実行できますが、Windowsではそうはいきません。

Windowsはデフォルトでsshをサポートしていないため、WinRMという管理プロトコルを使用する必要があります。ただし、WinRMはデフォルトでは無効化されているため、手動で有効化が必要です。これがWindowsでAnsibleを使用する際の大変な点です。

WindowsでAnsibleを利用可能にするには、以下の手順を実施します。

  1. WinRM をセットアップする

    $url = "https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
    $file = "$env:temp\ConfigureRemotingForAnsible.ps1"
    
    (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
    
    powershell.exe -ExecutionPolicy ByPass -File $file
    
  2. ファイアウォールを無効化するか、5986 portを開放する.

さらにinventoriesファイルに以下を記述する必要があります。

[develop_windows:vars]
ansible_user=${your_user_name}
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

これでansible-playbookからWindowsに接続できるようになります。

なお、WinRMで接続が可能になったとしても、ansible-playbookを実行する環境も必要です。
ローカルネットワークに所属するMacやLinuxから実行しても良いですが、私は単体でセットアップを完結させるため、まず最初にWSLをインストールし、そこからWindowsホストのIPに接続するようにしています。

現在のWindowsは以下のコマンドを実行するだけでWSLおよびデフォルトのディストリビューションであるUbuntuがインストールされるので、昔に比べて非常に簡単になりました。

wsl --install

Windows側のIPを取得するには、cmdやPowerShellからipconfigを実行する方法などがあります。
以下のリンクも参考になります

IPを取得できたら、他のOSと同様にansible-playbookを実行するだけでセットアップを完了できます。

ansible-playbook --diff -i inventories/develop_windows/hosts site.yml --limit ${WINDOWS_HOSTNAME}

まとめ

今回はansibleを使って開発環境の状態を管理している件を紹介しました。

Ansibleを使うことで、開発環境のセットアップを効率化し、再現性を高めることができます。