Ansible无法运行npm或rake命令

时间:2015-01-01 22:44:44

标签: ruby npm vagrant bower ansible

在设置我的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命令中,但这也不起作用。

当我进入虚拟机时,我能够毫无问题地运行这些命令。

非常感谢任何帮助。

3 个答案:

答案 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

此外,shellcommand用法通常是反模式。在这种情况下,您最好使用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'