2017-05-26 65 views
0

我使用ansible 1.9并想运行两个命令。我尝试了好几种变化:用Ansible运行几个命令

- 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 

任何想法?

回答

1

npm可执行文件可能不在像/ usr/bin/npm这样的标准位置。可能是/ usr/local/bin/npm,但是你可以找到它的安装位置并使用完全限定的路径。从可以运行npm命令的登录名执行'which npm'。输出将是你想要使用的,而不仅仅是npm。

仅供参考 - 当我正在做一次性的或其他我不想花时间编写剧本的小任务时,如果它在Ansible中不是一个简单的班轮,我会写一个小脚本给通过脚本模块执行。如果我知道某些命令位于非标准位置,那么这些脚本中的第一个命令就是设置PATH。

1

使用npm可执行文件的完整路径。 Ansible在非交互式shell会话中运行命令,并且不会读取在rc文件中设置的环境。

关于第二个问题:如果您收到“'dist'not found”错误,则表示dist目录不存在,或者您从错误的目录中调用该目录。给出您提供的信息是不可能的。

+0

我添加了npm run build到服务器上的shell脚本,然后用命令“{{app_dir}}/npm_build.sh”运行它,但是我得到了一个npm:command not found错误。 npm全球安装在服务器上,所以我不知道为什么这将是 – proximacentauri

+0

我已经回答了这个问题,阅读答案。 – techraf

+0

@techrat,对不起,但我不明白你有回答我的问题? npm确实存在于服务器上,我希望我应该能够从任何目录运行它。关于sed_index。嘘,dist目录存在,但我可能需要运行其中的所有命令而不是服务器上的脚本,因为我不知道如何让脚本识别它当前在服务器上的目录。 – proximacentauri

0

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

你应该能够将其转换回你的剧本一旦你得到它运行。