システムワイドにnvmを入れる

Node.jsのいろいろなバージョンを使う際のnvm、特定ユーザのホームディレクトリ配下に入れる資料は多いのだけれど、システムワイドに入れる資料が少なめであるのと、それをansibleでやる場合にちょっとコツが必要だったりもするのでメモ(VagrantBox CentOS65やさくらVPSの標準OSで動作確認済。確かAmazonLinuxでもOKだった気がする)。

「ansibleでやる場合にちょっとコツが必要」というのは、システムワイドにやるために「/etc/profile.d/nvm.sh」に初期設定を入れていて、全ユーザがログインした際にそれが発動するようにしているものの、(ssh接続でリモートでansibleを実行している場合)sourceとかで再読込しても後続タスクでは有効にはならないので、「/bin/bash -lc "..."」などとして明示的にログインシェルで実行されるする必要がある。

あと、この方法で入れた場合、その後のコマンドでも「sudo nvm install ...」などとするとやはり上記と同じ状態になるので、nvmの管理コマンドを使う際などは一回rootになって実行した方がよい。

以下、ansibleのplaybook片だけれども「ansible使わないよ!」という向きはコマンドラインに読み替えて実行するよろし。

vars/development.yml

---
nvm:
  nvm_dir: /opt/nvm

node:
  version: 0.12.7

roles/nodejs/tasks/main.yml

---
- name: check nvm
  stat: path={{ nvm.nvm_dir }}/nvm.sh
  register: nvm_sh

- name: install nvm
  shell: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
  environment:
    NVM_DIR: "{{ nvm.nvm_dir }}"
  when: not nvm_sh.stat.exists

- name: copy global profile for nvm
  template: src=nvm.sh.j2 dest=/etc/profile.d/nvm.sh
  when: not nvm_sh.stat.exists

- name: check node
  shell: /bin/bash -lc "NVM_DIR={{ nvm.nvm_dir }} nvm ls | grep {{ node.version }}"
  register: node_installed
  failed_when: node_installed.rc not in [0, 1]

- name: install node
  shell: /bin/bash -lc "NVM_DIR={{ nvm.nvm_dir }} nvm install {{ node.version }}"
  when: node_installed|failed

- name: set default node
  shell: /bin/bash -lc "NVM_DIR={{ nvm.nvm_dir }} nvm alias default {{ node.version }}"
  when: node_installed|failed

roles/nodejs/templates/nvm.sh.j2

export NVM_DIR={{ nvm.nvm_dir }}

if [[ -s {{ nvm.nvm_dir }}/nvm.sh ]] ; then
  source {{ nvm.nvm_dir }}/nvm.sh
fi