BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ansible・WSL2・VSCode】知ってて当たり前?ローカルPCでのAnsible開発をMicrosoft純正ツールで!

はじめに

こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。

資格取得の勉強や自宅での学習にLinux環境を使いたい!と思っても、VMware Playerを入れて、CentOSのISOをダウンロードして、OS入れてパッケージ更新していろいろ設定して…と使うまでに数日かかっていたため、以前はとても心理的ハードルが高かったです。またいざ使うとなっても起動に時間がかかったり、ホストのリソースを使うため動きが遅くなったりしてとても使いづらい思いをしていました。

それが今やWindows Subsystem for Linux(以後、WSL)を使えばものの5分でLinux環境が手に入ります。しかも超軽量!ホスト側への影響を感じることが今のところありません。
また、テキストエディタとしてシェアが4割近いVisual Studio Code(以後、VSCode)を使うことでシンタックスハイライト機能を十分に活かしてコードを書くことができ、そのままWSL上のLinux環境へ保存することができます。

なんて便利!どうして一年前に知らなかったんだろう!と後悔しまして、過去の自分のためにこの記事を書くことにしました。

今回の構成とゴール

f:id:bftnagoya:20210204203730p:plain:w650
WSL上のUbuntuVSCodeから書き込みをしたい!
今回の構成は上の図のようにローカルの作業PC側に個人の開発用Ansibleサーバを構築します。 必要なのはローカルPCにWSL、Ubuntuアプリ、VSCodeをインストールし、Ubuntu上にAnsibleをインストールするだけです。時間はおよそ60分!

プロジェクトだとフリーツールのインストールを制限されることが多いですがWSLもUbuntuアプリもVSCodeもすべてMicrosoftが用意している純正です。もうほんと何で知らなかったんだろう!と悔やまれる思いを胸にサクッと環境を作っていきます。

Windows 10 上で Ubuntu を使う

WSL2上で動くLinux環境はMicrosoftが準備したイメージである必要があります。開発用のAnsibleサーバをRHELで構築する場合CentOSを使いたいところですが残念ながらCentOSのイメージは用意されていません。Ubuntuだとパッケージをインストールする際はyumモジュールではなくaptモジュールにするなどディストリビューションの違いを意識する必要のある場合もありますのでご注意ください。

システム要件

WSL2を実行するためのローカルPC側の要件は以下の通りです。

  • 仮想化機能が有効になっていること
  • x64 システムの場合
    • Windows 10 であること
    • バージョン 1903 以降、ビルド 18362 以上であること
  • ARM64 システムの場合
    • Windows 10 であること
    • バージョン 2004 以降、ビルド 19041 以上であること

仮想化機能が有効になっていることはタスクマネージャのパフォーマンスタブで確認ができます。CPUの仮想化の項目が「有効」であれば問題ありません。

f:id:bftnagoya:20210204205457p:plain:w450
仮想化機能の有効化を確認

Windows 10のバージョンとアーキテクチャはスタートメニューで「システム情報」と検索して出てきたアプリを選択すると確認ができます。

f:id:bftnagoya:20210202213548p:plain:w450
意外とたくさんの情報が見られます

ビルドで要件を満たしていることを確認できるためバージョンは上の画面に表示されていませんがご了承ください。またこれ以後はx64システム用の手順を記載していきます。

WSL のインストールとWSL2 化(5分)

WSLとはMicrosoftが提供している、Windows上でLinux環境を実行する互換レイヤーです(「主として開発者、特にWeb開発者やオープンソースプロジェクトを利用する開発者のためのツール」をイメージしているとのこと)。実際のLinuxカーネルを使用しているためWSL2はWSLに比べると互換性が高くディスクI/Oも向上しており、インストールしたWSLに更新パッケージをあてることでWSL2が利用できるようになります。

公式のインストールガイドに従ってWSLをインストールしていきます。

docs.microsoft.com

1 . 管理者権限でPowerShellを起動し、以下のコマンドを実行してWSLをインストールします。

> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

2 . 続いて以下のコマンドを実行して仮想マシンの機能を有効にします。

> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

3 . 再起動をします。
4 . 以下のリンクから最新のパッケージをダウンロードします。15MBくらいなので時間はかかりません。

x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ

5 . ダウンロードしたファイルをダブルクリックしインストールをします。管理者権限が求められますがこちらも秒で終わります。

6 . 管理者権限でPowerShellを起動し、以下のコマンドを実行してWSL2を既定で使用するようにします。

> wsl --set-default-version 2

Ubuntu の入手(5分)

実行するLinux環境はMicrosoftストアから入手します。対応するディストリビューションUbuntuを始め、openSUSE, Debian GNU/Linux, Pengwinなど複数用意されています。今回はAnsibleの開発環境として使用したいのでUbuntuを選択しますがFedoraベースのWSLもありそちらでもいいかもしれません。

1 . スタートメニューで「store」と入れてMicrosoft Storeアプリを起動します。
2 . 「ubuntu」と検索して表示されたubuntuの中で今回は最新の20.04 LTSをインストールします。サイズは450MBくらいです。

f:id:bftnagoya:20210203111050p:plain:w450
Microsoft storeからUbuntuを入手

3 . ダウンロードが完了したらMicrosoft Storeのウインドウに表示されている[起動]を押します。

f:id:bftnagoya:20210203111541p:plain:w450
起動を押すとUbuntuのターミナルが開きます

3 . Ubuntuのターミナルが開き、ユーザ名を入力するプロンプトが表示されます。ユーザ名を入力し、パスワードを設定すればこれだけで使用を開始できます。

f:id:bftnagoya:20210203132336p:plain:w500
IPアドレスが振られているのですぐに使用できる

ここで表示されるIPアドレスWindows端末と同じ場合はWSLがバージョン2になっていません。PowerShellでWSLのバージョンを確認してみましょう。

f:id:bftnagoya:20210203141041p:plain
仮想化機能は有効にしたはずなのに…

Microsoft Storeから取得したUbuntuをWSLバージョン2にしようとしたら「BIOSで仮想化が有効になっていることを確認してください。」とメッセージが返ってきました。しかしBIOS(私のPCはUEFIでした)では仮想化機能は有効になっています。同じような状況になる方はWindowsの機能の有効化または無効化から仮想化に関する機能が有効になっているか確認してください。

f:id:bftnagoya:20210203141637p:plain:w300
Windows 10 Proの場合に有効にする機能

上の図はWindows 10 Proの場合です。Homeの場合はHyper-VではなくWindows ハイパーバイザー プラットフォームという名前でした。機能を有効にしたらPCを再起動します。

起動してきたら管理者権限でPowerShellを起動し、以下のコマンドを実行してUbuntuのWSLバージョンを2に変更します。

> wsl --set-version Ubuntu-20.04 2

変換には3分ほどかかりました。以下の図のように[変換が完了しました。]と返ってきたら完了です。再度バージョンの確認コマンドを実行し2になっていることを確認してください。

f:id:bftnagoya:20210203142453p:plain
WSLバージョン2への変換

VSCodeWorkplaceディレクトリを作成

VSCodeはまだインストールしていませんが、先にVSCodeWorkplaceディレクトリを作成しておきます。場所はどこでもいいのですが今回は/opt/vscodeというディレクトリを作成しubuntuuserで書き込むことにしました。Ansibleもubuntuuserで実行します。

f:id:bftnagoya:20210203143343p:plain
ubuntuuserで書き込むディレクトリを作成

パッケージのアップデート(3分)

Debian系は使ったことがほぼなく、久しぶりに実行するコマンドでパッケージを更新します。

$ sudo apt update
$ sudo apt upgrade

Ansibleのインストールと初期設定

UbuntuRHELと異なり、標準のレポジトリからAnsibleの導入が可能です。最新のバージョンにこだわらなければ以下のコマンドですぐに導入完了です。

$ sudo apt-get install ansible

2021年2月3日の時点でAnsibleのバージョンは2.9.6、pythonは3.8.2です。特に問題はないのでこのままとします。

f:id:bftnagoya:20210203143003p:plain
Ansibleのインストールも一瞬で終わる

またAnsibleのディレクトリはデフォルトの/etc/ansibleのまま、実行ユーザはubuntuuserとするため、所有者を変更しておきます。

$ sudo chown ubuntuuser:ubuntuuser -R /etc/ansible

ls -laコマンド実行でディレクトリやファイルの所有者が変更されていればOKです。

f:id:bftnagoya:20210203144022p:plain
Ansibleはubuntuuserで実行する

初期設定としてあとはubuntuuserでローカル実行するためにSSHの起動とSSH鍵作成をします。

### SSHの起動
$ sudo ssh-keygen -A
$ sudo service ssh start

### ubuntuuserでSSH鍵作成&公開鍵登録
$ ssh-keygen -t rsa
$ cat .ssh/id_rsa.pub > .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ ls -la .ssh
total 20
drwx------ 2 ubuntuuser ubuntuuser 4096 Feb  3 14:42 .
drwxr-xr-x 5 ubuntuuser ubuntuuser 4096 Feb  3 14:41 ..
-rw------- 1 ubuntuuser ubuntuuser  580 Feb  3 14:42 authorized_keys
-rw------- 1 ubuntuuser ubuntuuser 2610 Feb  3 14:41 id_rsa
-rw-r--r-- 1 ubuntuuser ubuntuuser  580 Feb  3 14:41 id_rsa.pub

特に問題なく完了です。 また今回はローカルのみの実行なのでホスト名を気にせずAnsibleのインベントリファイル(/etc/ansible/hosts)の末尾にそのままlocalhostと記載しました(個人的には気持ち悪いですが)。

shellモジュールでテスト実行です。

ubuntuuser@DESKTOP-AC9R8UJ:/etc/ansible$ ansible localhost -m shell -a date
localhost | CHANGED | rc=0 >>
Wed Feb  3 17:06:40 JST 2021
ubuntuuser@DESKTOP-AC9R8UJ:/etc/ansible$

問題なく日付が返ってきました。

VSCode から WSL2 上の Ubuntu につなぐ

実はWindowsコマンドプロンプトPowerShellからWSL上のLinux環境へコマンドを実行することができますが、今回はVSCodeで書いたコードをそのままUbuntu側で保存することでより開発を楽にします。

VSCodeのインストール

以下のサイトにアクセスし、VSCodeをダウンロード&インストールします。インストールはそのまま次へ進めば1分もかからずに終了します。

code.visualstudio.com

拡張機能 Remote - WSL をインストール

VSCodeのインストールが完了し起動したら左メニュー下の[Extensions]を押し、[wsl]と 検索します。[Remote - WSL]の[Install]を押すとインストール完了です。

f:id:bftnagoya:20210203151147p:plain
WSL用の拡張機能をインストールする

Ubuntu に接続&ファイル作成

左メニューでExtensionsの上にある[Remote Explorer]を押すとMicrosoft Storeから入手したUbuntuが表示されるのでその右にある[Connect to WSL]のアイコンを押します。

f:id:bftnagoya:20210203151510p:plain
VSCodeからWSL上のUbuntuにつなぐ

新しく開いたウインドウで[Open folder]を押し、上に表示される入力欄にUbuntu側であらかじめ作成しておいたVSCodeWorkplaceのパス(/opt/vscode)を入れます。

f:id:bftnagoya:20210203151813p:plain
/opt/vscodeを指定してフォルダを開く

[Open file]を押すとファイルの新規作成が可能です。適当にテスト用にplaybookを書いて保存します。

f:id:bftnagoya:20210203220504p:plain
テスト用のymlを作成して保存

保存したらUbuntu側で転送したりコピペしなくてもちゃんと/opt/vscode以下にtest.ymlができています。すごい…!

f:id:bftnagoya:20210203221452p:plain
VSCodeで保存した内容がWSL上のubuntuに保存された

ということで/opt/vscode/test.ymlを/etc/ansible以下にコピーし、構文チェック、ドライラン、本実行してみました。

f:id:bftnagoya:20210203222611p:plain
VSCodeで作成したplaybookの実行

コピーという手間を考えるとWorkplaceを/etc/ansible/とかその下のrolesとし、その下に処理ごとのディレクトリを作成し直接ファイルを作成した方がよさそうだと気づきました。自分一人で使うのでこの辺りは柔軟に変えられますね。

終わりに

文字にすると1万文字を超えてるのですが作業時間は全部入れても一時間あれば十分です。Debian系に慣れていなくて本筋とは関係ない部分で少し時間を取られました(Debian系はsshdではなくsshとかsshのホスト鍵を作成するとか)。またいろいろPlaybookを書いてみて気づきましたがAsnible公式のモジュールのドキュメントに「Ubuntuでは確認してないよ!」と書いてあるものがありました。・・・やはりAnsibleはFedoraのWSLで構築した方がいいように感じています。

VSCodeはGitとも連携できるので、実際の開発用AnsibleサーバへはGit経由で送ればバージョン管理もできそうですね。PowerShellも実行できちゃうし恐るべしVisual Studio Code!!もっとちゃんと使いこなせるようにしたいです。

以上、長くなりましたがVSCodeからWSLのUbuntuへ保存する方法でした~!