Ansible 无法运行 npm 或 rake 命令

Ansible unable to run npm or rake command

设置我的 VM 时,我想让剧本运行数据库迁移以及一些 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

耙子的错误说:

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 命令,但这也没有用。

当我通过 ssh 进入 VM 时,我能够毫无问题地运行这些命令。

非常感谢任何帮助。

冒险猜测:可执行文件的路径不在您的 $PATH 中,因为您使用的是 command Ansible module instead of the shell 模块。

根据文档:

The shell module takes the command name followed by a list of space-delimited arguments. It is almost exactly like the command module but runs the command through a shell (/bin/sh) on the remote node.

ansible.command 手册页中:

As such, all paths to commands must be fully qualified.

所以用完全限定的路径替换命令(或者尝试用 ./ 作为前缀,因为你已经有了 chdir),或者使用 shell 代替(如果它们在用户的 $PATH).

运行 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

你可以这样做

- 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'