You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible通过NVM切换Node.js版本失效问题排查求助

问题分析与解决方案

核心问题

  1. 命令执行逻辑错误:你在shell任务里用了source ~/.profile & nvm install,这里的&是让source后台运行,导致nvm install在环境变量还没加载时就执行,所以报错nvm: command not found。
  2. 用户上下文不一致:前面的Install nvm和Setup .profile任务未指定become_user: dev,默认会以执行Ansible的用户(大概率是root)运行,导致nvm安装在root的~/.nvm下,dev用户无法访问,且未修改dev用户的.profile。
  3. 临时切换不生效:nvm use仅临时切换当前shell的Node版本,Ansible任务执行完后子shell销毁,用户登录时仍使用旧版本,需要设置默认版本才能持久生效。

修复后的完整Playbook

- name: Install and configure NVM for dev user
  hosts: your_hosts
  become: yes
  tasks:
    - name: Install nvm for dev user
      ansible.builtin.shell: >
        curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.38.0/install.sh | bash
      args:
        executable: /bin/bash
        chdir: "/home/dev"
        creates: "/home/dev/.nvm/nvm.sh"
      become_user: dev

    - name: Add nvm source to dev's .profile
      ansible.builtin.lineinfile:
        path: /home/dev/.profile
        line: source ~/.nvm/nvm.sh
        create: yes
      become_user: dev

    - name: Install Node.js 12.18.2 and set as default
      ansible.builtin.shell: |
        source ~/.nvm/nvm.sh && nvm install {{ item }} && nvm alias default {{ item }}
      args:
        executable: /bin/bash
        chdir: "/home/dev"
        creates: "/home/dev/.nvm/versions/node/v{{ item }}"
      become_user: dev
      loop:
        - 12.18.2

关键修复点说明

  • 统一用户上下文:所有任务添加become_user: dev,确保nvm安装在dev用户的home目录,修改的是dev用户的配置文件。
  • 修正命令顺序:把&改成&&,保证source加载完nvm环境后再执行后续命令;添加nvm alias default {{ item }},将目标版本设为用户默认版本,登录时自动生效。
  • 明确绝对路径:避免~在不同用户上下文的歧义,直接使用/home/dev作为路径。

验证方法

  1. 执行Playbook后,登录服务器切换到dev用户:
    su - dev
    
  2. 检查Node版本:
    node -v
    
    应输出v12.18.2。
  3. 检查nvm默认版本:
    nvm ls
    
    会看到default -> 12.18.2 (-> v12.18.2)的标记。

内容的提问来源于stack exchange,提问作者Brzozova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:10:25