使用 nvm 的 Ansible 安装节点

Ansible install node with nvm

我正在寻找一种通过 ansible 和 nvm 安装给定版本的节点的方法,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

我认为您需要的输出线索是:

"/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

没关系,这是有效的配置

- 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

我将 post 放在下面,因为有数百个这样的 post。


- 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

对我有用。