我正在使用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
}
答案 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
任务 。