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
此外,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
你可以这样做
- 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'
设置我的 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 thecommand
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
此外,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
你可以这样做
- 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'