在设置我的VM时,我希望让playbook运行数据库迁移以及一些npm命令。以下是代码段:
- name: Run DB Migration
shell: rake db:migrate
args:
chdir: /opt/site
sudo: no
- name: Install bower and grunt
command: "npm install -g bower grunt-cli"
args:
chdir: /opt/site
sudo: no
- name: Install bower packages
command: "bower install"
args:
chdir: /opt/site
sudo: no
- name: Install npm packages
command: "npm install"
args:
chdir: /opt/site
sudo: no
npm东西的错误说:
TASK: [site | Install bower and grunt] ******************************
failed: [default] => {"cmd": "npm install -g bower grunt-cli", "failed": true, "item": "", "rc": 2}
msg: [Errno 2] No such file or directory
rake的错误说:
TASK: [salemarked-api | Run DB Migration] *************************************
failed: [default] => {"changed": true, "cmd": " rake db:migrate ", "delta": "0:00:00.002664", "end": "2015-01-01 00:40:03.915189", "item": "", "rc": 127, "start": "2015-01-01 00:40:03.912525"}
stderr: /bin/bash: rake: command not found
我已经尝试将executable: /bin/bash
添加到rake命令中,但这也不起作用。
当我进入虚拟机时,我能够毫无问题地运行这些命令。
非常感谢任何帮助。
答案 0 :(得分:4)
手动运行which rake
并使用完整路径。粗略地说,运行时你没有PATH
环境变量。这是一个例子,虽然我假设某条道路。
- name: Install bower and grunt
command: "/usr/bin/npm install -g bower grunt-cli"
args:
chdir: /opt/site
sudo: no
此外,shell
和command
用法通常是反模式。在这种情况下,您最好使用npm module替换两个command
来电。另请注意,您可以删除隐含的sudo: no
。
这是一个改进的例子。
- name: install global node packages
npm: name={{item}} path=/opt/site global=yes
with_items:
- bower
- grunt-cli
答案 1 :(得分:3)
有误解:可执行文件的路径不在$PATH
中,因为您使用的是command
Ansible模块而不是shell
模块。
根据文件:
shell
模块获取命令名称,后跟空格分隔的参数列表。它几乎与command
模块完全相同,但是通过远程节点上的shell(/bin/sh
)运行命令。
在ansible.command手册页中:
因此,命令的所有路径必须是完全限定的。
所以用完全限定的路径替换命令(或尝试用./
作为前缀,看看你已经有chdir
),或者改为使用shell
(如果他们在用户的$PATH
)。
答案 2 :(得分:0)
您可以这样做
- name: Run my task
shell: /bin/bash -l -c 'cd /your/path/here && RAILS_ENV={{api_rails_env}} bundle exec rake my_namespace:my_task'