You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible使用shell模块通过SSH执行命令时如何保持在目标指定目录?

问题根因

你当前写法的问题在于Shell的命令拆分逻辑:分号、&&分隔的命令会被本地Shell拆分为独立执行的片段,ssh dbadmin@dbserver001 cd sqllib/bin/ 是第一个执行的片段,仅在远程服务器执行cd操作后就断开SSH连接,后续的ls命令完全在本地中枢服务器执行,自然返回的是本地目录内容,替换为&&也不会改变拆分逻辑,所以结果一致。

解决方案

方案1:直接修改现有SSH命令(最小改动)

将所有需要在远程服务器执行的命令用双引号包裹,确保整段内容作为SSH的执行参数传递到远端:

shell: ssh dbadmin@dbserver001 "cd sqllib/bin/ && ls"

所有需要依次执行的数据库命令都可以写在双引号内部,用分号或者&&分隔即可,全部会在远程服务器的对应目录下执行。建议cd的路径写绝对路径,避免因远程用户默认家目录位置不符合预期导致切换目录失败。

方案2:Ansible原生实现(推荐最佳实践)

如果你的Ansible inventory中已经配置了数据库服务器的连接信息,不需要通过中枢服务器手动写SSH跳转,直接指定执行目录的参数即可,更符合Ansible的使用规范:

- name: 在指定目录执行数据库相关命令
  hosts: dbserver001
  remote_user: dbadmin
  tasks:
    - name: 列出sqllib/bin目录内容
      shell: ls
      args:
        chdir: sqllib/bin/

如果确实需要通过中枢服务器跳转连接数据库服务器,可以配置Ansible的ProxyCommand参数实现SSH跳转,不需要手动在shell模块中写SSH命令,可维护性更强。

内容的提问来源于stack exchange,提问作者NewbChewbCS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:39:02