ansibleでnvmをグローバルインストール

時は大コンテナ時代の今、ansibleでnvmをインストールする需要があるのかどうか知らんが・・・

ちなみにnvmのページには

- name: nvm
  shell: >
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
  args:
    creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"

と書いてあるが、これではrootユーザのホームディレクトリにインストールされてしまうのでrootユーザにしか使えない。全ユーザが使えるように /usr/local/nvm 以下にインストールするroleを作成してみた。

roles/nvm/tasks/main.yml

- name: clone (or fetch) nvm repository
  git:
    repo: "https://github.com/nvm-sh/nvm.git"
    dest: "{{ nvm_root }}"

- name: checkout the latest tag of nvm
  shell:
    cmd: "git checkout $(git describe --abbrev=0 --tags --match 'v[0-9]*' $(git rev-list --tags --max-count=1))"
    chdir: "{{ nvm_root }}"

- name: initialize nvm for login shell
  copy:
    src: "nvm.sh"
    dest: "/etc/profile.d/nvm.sh"

- name: "check nodejs {{ nodejs_version }} is installed"
  command: "bash -lc 'nvm ls --no-colors --no-alias'"
  check_mode: no
  ignore_errors: yes
  register: installed_nodejs_versions

- name: "install nodejs {{ nodejs_version }}"
  command: "bash -lc 'nvm install {{ nodejs_version }}'"
  when: nodejs_version not in installed_nodejs_versions.stdout

roles/nvm/files/nvm.sh

source /usr/local/nvm/nvm.sh

roles/defaults/main.yml

nvm_root: /usr/local/nvm
nodejs_version: v16.15.0

制限事項

nvmでnodeをインストールするにはroot権限が必要である(インストールされたnodeコマンドの実行には不要)。

また、/etc/profile.d からnvmを読み込むため、ログインシェル経由でなければnodeコマンドにパスが通らない。よって、cronや systemdからnodeアプリを起動する場合は/usr/local/nvm/versions/node/v16.15.0/bin/nodeのようにフルパスで実行ファイルを指定しなければならない。