使用Ansible运行几个命令

时间:2017-05-26 13:08:32

标签: ansible

我正在使用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

有什么想法吗?

3 个答案:

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