WSL の Java 開発環境を Ansible で構築する

![WSL 24.04](https://img.shields.io/badge/WSL-24.04.1-limegreen) ![Ansible 2.18.1](https://img.shields.io/badge/Ansible-2.18.1-limegreen) ![JDK 21](https://img.shields.io/badge/JDK%20Temurin-21.0.5-limegreen)

[【Java環境構築】WSL+SDKMAN!+VSCode で開発環境を構築する](https://qiita.com/nimzo6689/items/c399840b360e409b0c61) のスピンオフ記事です。
その記事では、 SDKMAN! で JDK と Maven をインストールしましたが、 Ansible で playbook.yaml を書いておけば、いちいちコマンド実行して環境を構築する必要がないので、その方法で構築し直してみました。

# Ansible のインストール

WSL の Ubuntu にて Ansible をインストールします。インストール手順は公式ドキュメントの通りです。

https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#pipx-install

```bash
sudo apt update
sudo apt install -y pipx
pipx ensurepath
sudo pipx ensurepath

pipx install ansible-core

# ansible-playbook コマンドを実行するため、シェルの再起動 or 新しいシェルの起動が必要
bash
which ansible-playbook
#=> /home/nimzo6689/.local/bin/ansible-playbook
```

# JDK 21 と Maven をインストール

JDK は今回も Eclipse Temurin JDK 21 とします。
それぞれ、 PATH を通して JAVA_HOME を環境変数として追加します。

```yaml:playbook.yaml
---
- name: Install Java Development Environment (Root tasks)
  hosts: localhost
  become: yes
  vars:
    java_version: 21
    java_home: "/usr/lib/jvm/temurin-{{ java_version }}-jdk-amd64"

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

    - name: Install initial required packages
      apt:
        name:
          - wget
          - gpg
        state: present

    - name: Create keyrings directory
      file:
        path: /etc/apt/keyrings
        state: directory
        mode: '0755'

    - name: Add Adoptium repository key
      ansible.builtin.get_url:
        url: https://packages.adoptium.net/artifactory/api/gpg/key/public
        dest: /etc/apt/keyrings/adoptium.asc
        mode: '0644'

    - name: Add Adoptium repository
      apt_repository:
        repo: "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb {{ ansible_distribution_release }} main"
        state: present
        update_cache: yes

    - name: Install Java and Maven
      apt:
        name:
          - "temurin-{{ java_version }}-jdk"
          - maven
        state: present
        update_cache: yes

- name: Configure User Environment
  hosts: localhost
  become: no
  vars:
    java_version: 21
    java_home: "/usr/lib/jvm/temurin-{{ java_version }}-jdk-amd64"

  tasks:
    - name: Set JAVA_HOME in .bashrc
      blockinfile:
        path: "~/.bashrc"
        block: |
          export JAVA_HOME={{ java_home }}
          export PATH=$JAVA_HOME/bin:$PATH
        marker: "# {mark} JAVA ENVIRONMENT VARIABLES"
        create: yes
```

playbook.yaml を作成して、 Ansible で適用していきます。

```bash
ansible-playbook -K playbook.yaml
```

問題なく構築できているか確認します。

```bash
java --version
#=> openjdk 21.0.5 2024-10-15 LTS
#=> OpenJDK Runtime Environment Temurin-21.0.5+11 (build 21.0.5+11-LTS)
#=> OpenJDK 64-Bit Server VM Temurin-21.0.5+11 (build 21.0.5+11-LTS, mixed mode, sharing)

mvn --version
#=> Apache Maven 3.8.7
#=> Maven home: /usr/share/maven
#=> Java version: 21.0.5, vendor: Eclipse Adoptium, runtime: /usr/lib/jvm/temurin-21-jdk-amd64
#=> Default locale: en, platform encoding: UTF-8
#=> OS name: "linux", version: "5.15.167.4-microsoft-standard-wsl2", arch: "amd64", family: "unix"

# シェルの再起動、または、新しいシェルの起動
bash
echo $JAVA_HOME
#=> /usr/lib/jvm/temurin-21-jdk-amd64
```

# JDK のバージョンを切り替える

JDK のバージョンを切り替えたい場合は、以下のコマンドでできます。

```bash
ansible-playbook -K playbook.yaml -e "java_version=17"

# シェルの再起動、または、新しいシェルの起動
bash
java --version
#=> openjdk 17.0.13 2024-10-15
#=> ...

echo $JAVA_HOME
#=> /usr/lib/jvm/temurin-17-jdk-amd64
```

WSL は作り直しが簡単にできるので、コマンドで構築手順を作るよりも Ansible などの IaC で実施する方が使い勝手良いかも。