我正在尝试使用nvm在Ansible yml文件下安装node js版本。
我得到的错误就像源"来源/home/centos/.nvm/nvm.sh"文件未找到。但如果我通过使用ssh登录机器来做同样的事情,那么它可以正常工作。
- name: Install nvm
git: repo=https://github.com/creationix/nvm.git dest=~/.nvm version={{ nvm.version }}
tags: nvm
- name: Source nvm in ~/.profile
lineinfile: >
dest=~/.profile
line="source ~/.nvm/nvm.sh"
create=yes
tags: nvm
- name: Install node {{ nvm.node_version }}
command: "{{ item }}"
with_items:
- "source /home/centos/.nvm/nvm.sh"
- nvm install {{ nvm.node_version }}
tags: nvm
错误:
failed: [172.29.4.71] (item=source /home/centos/.nvm/nvm.sh) => {"cmd": "source /home/centos/.nvm/nvm.sh", "failed": true, "item": "source /home/centos/.nvm/nvm.sh", "msg": "[Errno 2] No such file or directory", "rc": 2}
failed: [172.29.4.71] (item=nvm install 6.2.0) => {"cmd": "nvm install 6.2.0", "failed": true, "item": "nvm install 6.2.0", "msg": "[Errno 2] No such file or directory", "rc": 2}
答案 0 :(得分:12)
source
是一个内部shell命令(例如参见Bash Builtin Commands),而不是您可以运行的外部程序。您的系统中没有名为source
的可执行文件,这就是导致No such file or directory
错误的原因。
而不是command
模块使用shell
来执行shell中的source
命令。
在with_items
循环中,Ansible将运行shell两次,两个进程将彼此独立。一个中设置的变量将不会被另一个看到。
您应该在一个shell进程中运行这两个命令,例如:
- name: Install node {{ nvm.node_version }}
shell: "source /home/centos/.nvm/nvm.sh && nvm install {{ nvm.node_version }}"
tags: nvm
在{{ ansible_env.HOME }}
任务中使用~
代替git
。任何一个都可以在这里工作,但代号扩展是shell的功能,你正在为Ansible编写代码。