【问题标题】:How to execute a command after setting environment by running shell script?通过运行shell脚本设置环境后如何执行命令?
【发布时间】:2019-05-27 18:48:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能把你的代码贴在这里吗?您是否尝试过剧本中的“shell”模块?您的要求很明确,但没有您到目前为止所做的事情,它有点完成帮助
  • 请在下面找到我的任务 - 命令:"{{ item }}" args: chdir: "/ds1/home/has9e/CS9/" with_items: - "./psconfig.sh" - " psadmin -v" 注册:ptversion ignore_errors: true
  • 尝试使用 shell 而不是命令模块。如下所示 - shell: "{{ item }}" args: chdir: "/ds1/home/has9e/CS9/" with_items: - "./psconfig. sh" - "psadmin -v" 注册:ptversion ignore_errors: true

标签: shell ansible


【解决方案1】:

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 任务

【讨论】:

  • 我是这样理解问题的,他想在不同的ssh连接中执行命令,因为第一个对第二个有影响。
  • 谢谢。通过您建议的方法,我尝试在运行和不运行 psadmin.sh 的情况下从同一个 shell 打印环境变量。但是两个环境变量看起来一样,意味着shell没有脚本导出的变量没有psadmin.sh ---------------------------- -外壳:“env” 参数:chdir:“/ds1/home/has9e/CS9/” 注册:ptversion ignore_errors: true With psadmin.sh -------------------- --- - shell: "./psconfig.sh;env" args: chdir: "/ds1/home/has9e/CS9/" 寄存器: ptversion ignore_errors: true
  • 您能否更新您的问题以显示psconfig.sh 的内容?请不要将其作为评论发布,因为无法在 cmets 中清晰地格式化代码。
猜你喜欢
  • 2011-06-17
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多