概要
私は普段、仕事では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を利用可能にするには、以下の手順を実施します。
-
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
-
ファイアウォールを無効化するか、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を使うことで、開発環境のセットアップを効率化し、再現性を高めることができます。