通过运行Shell脚本设置环境后如何执行命令?

时间:2019-04-10 10:11:03

标签: shell ansible

我正在使用ansible连接到远程Linux机器。我想执行一个特定于应用程序的命令,该命令将为我提供应用程序的版本。但是在此之前,必须执行一个shell脚本,该脚本将为上述命令的执行设置环境。

当前,每个任务似乎都在单独的shell中执行

我想在执行psadmin -v之后执行/ds1/home/has9e/CS9/psconfig.sh

- command: "{{ item }}"
  args:
    chdir: "/ds1/home/has9e/CS9/"
  with_items:
   - "./psconfig.sh"
   - "psadmin -v"
  register:  ptversion
  ignore_errors: true

错误是:

failed: [slc13rog] (item=./psconfig.sh) => {
    "changed": false,
    "cmd": "./psconfig.sh",
    "invocation": {
        "module_args": {
            "_raw_params": "./psconfig.sh",
            "_uses_shell": false,
            "argv": null,
            "chdir": "/ds1/home/has9e/CS9/",
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "warn": true
        }
    },
    "item": "./psconfig.sh",
    "msg": "[Errno 8] Exec format error",
    "rc": 8
}

1 个答案:

答案 0 :(得分:0)

command模块(和shell模块)在子进程中执行您的命令。这意味着,如果您运行一个设置环境变量的shell脚本,该脚本对任何后续命令均无任何作用:该变量在子进程中设置,然后退出。

如果要在Shell脚本中设置环境变量来影响后续命令,则需要使它们都成为同一Shell脚本的一部分。例如:

- shell: |
    ./psconfig.sh
    psadmin -v
  args:
    chdir: "/ds1/home/has9e/CS9/"
  register:  ptversion
  ignore_errors: true       

在这里,我们使用YAML |运算符将文字块传递给shell模块,但是我们可以写成这样:

- shell: "./psconfig.sh;psadmin -v"
  args:
    chdir: "/ds1/home/has9e/CS9/"
  register:  ptversion
  ignore_errors: true       

这两种选择在功能上是相同的。在这两种情况下,我们都将psconfig.sh脚本采购到shell环境中,然后在同一shell中运行psadmin任务