Ansible中使用nvm时npm模块无法工作

4

我正在使用Ubuntu 18的Ansible。

问题:无法使用nvm安装npm命令

当我执行以下代码时,在全局安装 npm 包中出现错误消息。我该怎么做才能解决这个问题?请注意,当我通过ssh连接时,我可以运行nvm和npm install,但是在使用ansible时却不能。

failed: [X.X>X.X] (item=apn) => {"ansible_loop_var": "item", "changed": false, "item": "apn", "msg": "Failed to find required executable npm in paths: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"}

Ansible剧本:

 roles:
        - role: ansible-role-nvm
            nodejs_version: "12.21.0"
            nvm_profile: "home/{{ ansible_user }}/.bashrc"
    
    tasks:
        - name: install npm package globally
          npm:
            name: "{{ item }}"
            global: yes
            loop: "{{ npm_packages }}"

即使我将npm的可执行路径设置为/home/ubuntu/.nvm/versions/node/v12.21.0/bin/npm,它仍然显示错误:

failed: [X.X.X.X] (item=apn) => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "ansible_loop_var": "item", "changed": false, "cmd": "/home/ubuntu/.nvm/versions/node/v12.21.0/bin/npm install --global apn", "item": "apn", "msg": "/usr/bin/env: ‘node’: No such file or directory", "rc": 127, "stderr": "/usr/bin/env: ‘node’: No such file or directory\n", "stderr_lines": ["/usr/bin/env: ‘node’: No such file or directory"], "stdout": "", "stdout_lines": []}

在安装完成后,该脚本将在用户的.bashrc中添加以下代码。当在交互式shell中时(在服务器上进行ssh时),它可以正常工作。
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

2
由于您已安装了 nvm,因此 node 未包含在默认路径中。Ansible 不会读取用户的 .bashrc 文件。您必须在模块选项中设置正确的 可执行文件 - Zeitounator
1
@Zeitounator 之后我还需要手动创建符号链接来指定节点吗? - vincentsty
我有同样的问题。我尝试设置可执行文件,但是出现了一个新的错误:“msg”:“/usr/bin/env:‘node’:没有那个文件或目录”。 - Alko
1个回答

1

正如你发现的那样,当 node 不在路径中时,npm 模块无法正常工作。我在使用 asdf 时也遇到了同样的问题。你可以通过使用 command 模块和 nvm 来安装 npm 包来解决这个问题。

vars:
  nodejs_version: "12.21.0"
  npm_packages: ...

tasks:
  - name: Discover npm binaries directory
    ansible.builtin.command:
      cmd: >
        bash -c "source $HOME/.nvm/nvm.sh &&
        nvm exec --silent {{ nodejs_version }} npm bin -g"
    register: npm_bin_result
    changed_when: false

  - name: Set npm binaries directory
    ansible.builtin.set_fact:
      npm_binaries_dir: "{{ npm_bin_result.stdout }}"

  - name: Install global npm packages
    ansible.builtin.command:
      cmd: >
        bash -c "source $HOME/.nvm/nvm.sh &&
        nvm exec {{ nodejs_version }} npm install -g {{ item }}"
      creates: "{{ npm_binaries_dir }}/{{ item }}"
    loop: "{{ npm_packages }}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接