我正在使用ansible 1.9并希望运行两个命令。我尝试了几种变体:
- name: npm build
command: npm run build
args:
chdir: "{{ app_dir }}"
- name: clean up
shell: sed_index.sh
args:
chdir: "{{ app_dir }}"
在运行时,我收到以下错误:
"stderr": "/bin/sh: 1: npm: not found"
然而
npm run build
当我登录服务器并在app_dir中运行它时,工作正常。
我也尝试过:
- name: npm install and clean
command: "{{ item }} chdir={{ app_dir }}"
with_items:
- npm run build
- sed_index.sh
我再次发现npm未找到错误。
如果我注释掉npm run build命令,那么在' cd dist'上运行sed_index脚本时会出错。下面的命令,说' dist'没找到。
sed_index.sh
#!/usr/bin/env bash
cd dist
sed -i 's|=static/css/font-awesome.min.css rel=stylesheet>|=/app/static/css/font-awesome.min.css rel=stylesheet>|g' index.html
有什么想法吗?
答案 0 :(得分:1)
使用npm
可执行文件的完整路径。 Ansible在非交互式shell会话中运行命令,并且不读取在rc文件中设置的环境。
关于第二个问题:如果您收到“'dist'not found”错误,则表示dist
目录不存在,或者您从错误的目录中调用它。鉴于您提供的信息,我们无法判断。
答案 1 :(得分:1)
@techraf答案应该可以帮助您解决这个问题。
出于某种原因,如果您寻找替代方法,请使用ansible命令尝试如下:
ansible -m shell -a "/bin/bash -c 'cd {{app_dir}} && npm run build && ./sed_index.sh'" -e "app_dir=/path/to/app_dir" <host/group name>
一旦你开始运行,你应该可以将它转换回你的剧本。
答案 2 :(得分:1)
npm可执行文件可能不在/ usr / bin / npm这样的标准位置。可能是/ usr / local / bin / npm,但您可以找到它的安装位置并使用完全限定的路径。从可以运行npm命令的登录中,执行“npm&#39;”。输出将是你想要使用的,而不仅仅是npm。
仅供参考 - 当我做一次性或其他小型任务时,我不想花时间写一本剧本,如果它不是一个简单的单行Ansible我写了一个小脚本来通过脚本模块执行。如果我知道某些命令位于非标准位置,那么这些脚本中的第一个命令就是设置PATH。