LoginSignup
0
0

プログラミング環境をWSLでIaCっぽく構築する

Last updated at Posted at 2024-05-12

めあて

Pythonを中心としたVSCodeでのプログラミングの環境としてWSLが便利だと思っています。

  • Windowsホストにpythonなどの環境をセットアップすると、Windows版特有のノウハウが必要だったり、 バージョンを柔軟に変更できなかったり、環境をあれこれ変えるとWindowsホストの環境が汚れる感じがして気持ち悪かったりする。
  • 逆に、WSLだと(普通に?)Linuxの環境として使用できるし、仮想環境なので、同時に、いくつも環境を作成して使用できる。間違えたり、いらなくなったら、きれいさっぱりと削除できる。
  • WSLにdockerをインストールして、Dev Container方式の環境にすることもできるけど、いろいろと実験しながらプログラミングするには、コンテナ化するより、WSLディストリビューションの環境くらいが丁度よい。

WSLのメリット(環境を複数作れる、作り直せる)を活用するため、環境のセットアップはIaCっぽくして、再実施を簡単にしたり、再現性を持たせることで、他の人に共有したり、という感じにしたくなります。

セットアップ手順をshファイルにまとめる方式

こんな感じでshファイルにまとめておけば、再実施の手順も1ファイルにまとまるし、shファイルなのでコードっぽくなってよさそう。

DebianDev.sh
# ディストリビューションのデータフォルダを配置する場所に
# 移動し、このshファイルを配置し、
# PowerShellで下記のコマンドを順次実行すれば、セットアップ完了
#
# Invoke-WebRequest -Uri "https://salsa.debian.org/debian/WSL/-/raw/master/x64/install.tar.gz" -OutFile "install.tar.gz"
# wsl --import DebianDev DebianDev install.tar.gz
# wsl -d DebianDev -u root -- bash -e -x DebianDev.sh
#

echo "[general]" >> /etc/wsl.conf
echo "guiApplications=false" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[automount]" >> /etc/wsl.conf
echo "enabled=true" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[interop]" >> /etc/wsl.conf
echo "enabled=false" >> /etc/wsl.conf
echo "appendWindowsPath=false" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[user]" >> /etc/wsl.conf
echo "default=foo" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[boot]" >> /etc/wsl.conf
echo "command=" >> /etc/wsl.conf

adduser --disabled-password --gecos "" foo
passwd --delete foo
usermod -aG sudo foo

apt update
apt -y upgrade

# python
apt -y install python3 python-is-python3 python3-pip python3-poetry

# docker
apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable' | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
usermod -aG docker foo

#################################################################
# 予備のpyenvとかnodejsをセットアップする手順
#
# apt install -y gcc make build-essential libssl-dev libffi-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev git
# git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# echo 'export PYENV_ROOT="\$HOME/.pyenv"' >> ~/.bashrc
# echo 'command -v pyenv >/dev/null || export PATH="\$PYENV_ROOT/bin:\$PATH"' >> ~/.bashrc
# echo 'eval "\$(pyenv init -)"' >> ~/.bashrc
# /home/foo/.pyenv/bin/pyenv install 3.11.9
# curl -sSL https://install.python-poetry.org | python3 -
# echo 'export PATH="/home/foo/.local/bin:\$PATH"' >> ~/.bashrc
# /home/foo/.pyenv/bin/pyenv global 3.11.9
# 
# curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
# apt-get install -y nodejs
# npm install --global yarn
#
#################################################################

全部PowerShellでやる方式(上記のsh方式のほうが推奨)

下記コードは、WSL環境を新しく作成し、セットアップを行う過程をすべてPowerShellコマンド化して、一気に実行できるようにした例です。ターミナルでコピーペーストで実行するんですが、たまに失敗したりで、安定性はいまいちです。

PowerShell
Invoke-WebRequest -Uri "https://salsa.debian.org/debian/WSL/-/raw/master/x64/install.tar.gz" -OutFile "install.tar.gz"
wsl --import debi debi install.tar.gz

wsl -d debi -u root -- adduser --disabled-password --gecos \"\" foo
wsl -d debi -u root -- passwd --delete foo
wsl -d debi -u root -- usermod -aG sudo foo

wsl -d debi -u root -- apt update `&`& apt upgrade -y
wsl -d debi -u root -- echo "[general]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "guiApplications=false" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[automount]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "enabled=true" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[interop]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "enabled=false" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "appendWindowsPath=false" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[user]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "default=foo" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[boot]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "command=" `>`> /etc/wsl.conf

## python3

wsl -d debi -u root -- apt install -y gcc make build-essential libssl-dev libffi-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev git
wsl -d debi -u foo  -- git clone https://github.com/pyenv/pyenv.git ~/.pyenv
wsl -d debi -u foo  -- echo 'export PYENV_ROOT=\"\$HOME/.pyenv\"' `>`> ~/.bashrc
wsl -d debi -u foo  -- echo 'command -v pyenv >/dev/null || export PATH=\"\$PYENV_ROOT/bin:\$PATH\"' `>`> ~/.bashrc
wsl -d debi -u foo  -- echo 'eval \"\$(pyenv init -)\"' `>`> ~/.bashrc
wsl -d debi -u foo  -- /home/foo/.pyenv/bin/pyenv install 3.11.9
wsl -d debi -u foo  -- curl -sSL https://install.python-poetry.org `| python3 -
wsl -d debi -u foo  -- echo 'export PATH="/home/foo/.local/bin:\$PATH"' `>`> ~/.bashrc
wsl -d debi -u foo  -- /home/foo/.pyenv/bin/pyenv global 3.11.9

## docker

wsl -d debi -u root -- apt install -y ca-certificates curl gnupg lsb-release
wsl -d debi -u root -- curl -fsSL https://download.docker.com/linux/debian/gpg `| gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
wsl -d debi -u root -- echo 'deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable' `| tee /etc/apt/sources.list.d/docker.list `> /dev/null
wsl -d debi -u root -- apt update `&`& apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
wsl -d debi -u root -- update-alternatives --set iptables /usr/sbin/iptables-legacy
wsl -d debi -u root -- update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
wsl -d debi -u root -- usermod -aG docker foo

## nodejs

wsl -d debi -u root -- curl -fsSL https://deb.nodesource.com/setup_20.x `| bash - `&`& apt-get install -y nodejs
wsl -d debi -u root -- npm install --global yarn

wsl --shutdown debi
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0