使用nvm安装Node的Ansible

6
我正在寻找一种通过ansible和nvm安装特定版本node的方法,nvm的安装按预期进行,因为如果我使用root用户连接,我可以执行命令“nvm install 8.11.3”,但是这个相同的命令在Ansible中不起作用,我不明白为什么。
---
- name: Install nvm
  git: repo=https://github.com/creationix/nvm.git dest=~/.nvm version=v0.33.11
  tags: nvm

- name: Source nvm in ~/.{{ item }}
  lineinfile: >
      dest=~/.{{ item }}
      line="source ~/.nvm/nvm.sh"
      create=yes
  tags: nvm
  with_items:
    - bashrc
    - profile

- name: Install node and set version
  become: yes
  become_user: root
  shell: nvm install 8.11.3
...

错误日志

TASK [node : Install node and set version] *************************************************************************************
    fatal: [51.15.128.164]: FAILED! => {"changed": true, "cmd": "nvm install 8.11.3", "delta": "0:00:00.005883", "end": "2018-12-03 15:05:10.394433", "msg": "non-zero return code", "rc": 127, "start": "2018-12-03 15:05:10.388550", "stderr": "/bin/sh: 1: nvm: not found", "stderr_lines": ["/bin/sh: 1: nvm: not found"], "stdout": "", "stdout_lines": []}
        to retry, use: --limit .../.../ansible/stater-debian/playbook.retry
5个回答

18

没关系,这是可行的配置

- name: Install node and set version
  become: yes
  become_user: root
  shell: "source /root/.nvm/nvm.sh && nvm install 8.11.3" 
  args:
    executable: /bin/bash

3
你住在哪里?我想给你寄送一份礼物。 - hytromo
Dockerfile 中,从 bash 直接调用 nvm.sh 脚本(而不是 sh)也很有帮助:RUN bash -c 'source $HOME/.nvm/nvm.sh && nvm install node' - mirekphd
为什么需要/bin/bash来执行该命令? - neeh

1
我认为你需要的输出线索是:
"/bin/sh: 1: nvm: not found"
如果要运行一个命令而不包括该命令的完整路径(即使用“nvm”而不是“/the/dir/nvm/is/installed/in/nvm”),则包含该命令的目录必须在运行该命令的shell的$PATH环境变量中。
在这种情况下,看起来该目录不存在于Ansible生成的shell中,与你的交互式命令运行的shell不同。请更改:
- name: Install node and set version
  become: yes
  become_user: root
  shell: nvm install 8.11.3

- name: Install node and set version
  become: yes
  become_user: root
  shell: /full/path/to/nvm install 8.11.3

如果您不知道要替换“/full/path/to”的内容,请尝试以下两种方法:
which nvm

或者

find / -name nvm

1
我也不知道为什么,但是which和find都没有返回任何内容,我唯一找到与nvm相关的地方是在/root目录下。 - eth3rnit3
2
nvm是一个函数,而which nvm没有返回任何内容。尝试使用type nvm代替,你会看到结果。似乎只有在交互式shell中才能执行该函数。 - Günter Zöchbauer

0

基于在Stack上找到的所有帖子,并根据自己的需求进行了一些调整 - 我发现这个解决方案既可以完美地安装NVM(简单部分),又可以创建一个循环,允许您插入所需的1个或多个Node版本。

# test if nvm has been installed by the user desired
- stat:
      path: /home/yournonrootuser/.nvm
  register: nvm_path

- name: Setup NodeVersionManager and install node version
  become: yes
  # Execute config files such as .profile (Ansible uses non-interactive login shells)
  become_flags: -i 
  become_user: yournonrootuser 
  block:
    - name: Install nvm
      shell: >
        curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash 
      args:
        executable: /bin/bash
        chdir: "$HOME"
        creates: "$HOME/.nvm/nvm.sh"

    - name: Setup .profile of yournonrootuser
      lineinfile:
        path: ~/.profile
        # This will make sure Node is on the users PATH
        line: source ~/.nvm/nvm.sh 
        create: yes
      become_flags: -i  
  when: nvm_path.stat.exists  == false 

  # if we got here we already know node version manager is installed
- name: installing node versions using loop
  command: sudo -iu yournonrootuser nvm install {{item}}
  args:
    executable: /bin/bash
    chdir: "$HOME"
    creates: "$HOME/.nvm/versions/node/v{{item}}"
  loop:
    - 14.18.3

0

这个方法适用于我在Ubuntu 20.04上使用nvm版本0.39.1:

- name: Install NVM
  shell: >
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
  args:
    creates: "/root/.nvm/nvm.sh"

  - name: Install Node Versions
    shell: ". /root/.bashrc && nvm install {{item}}"
    with_items: 
      - 'v10.24.1'
      - 'v16.17.0'
      - '--lts'
      - 'node'

0

我只是在这里发帖,因为有数百个这样的帖子。


- name: Install node
    become: true
    become_user: root
    shell: "source /root/.nvm/nvm.sh && nvm install {{ personal_node_version }} && nvm alias default {{ personal_node_version }}"                                 
    args:
      executable: /bin/bash

对我有用。


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