如何使用python执行远程shell脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用python执行远程shell脚本相关的知识,希望对你有一定的参考价值。
参考技术A pexpect复杂,但通用灵活。另外一种法就是ssh-keygen/ssh-copy-id,实现自动密钥验证取代手动密码验证,然后就可以直接调用远程‘sshremote-user@remote-hostremote-script.sh’,麻烦之处在于要手动创建与维护两台机器间的公钥。至于捕获输出,还是要变通一点,既然B都登陆到A了,那么通过临时文件向A输出内容不是更简单吗,这是shell编程中简单有效的法。还可以使用sftp如何使用 Ansible 在远程服务器上执行 shell 脚本?
【中文标题】如何使用 Ansible 在远程服务器上执行 shell 脚本?【英文标题】:How to execute a shell script on a remote server using Ansible? 【发布时间】:2014-02-05 07:12:45 【问题描述】:我打算使用 Ansible playbook 在远程服务器上执行一个 shell 脚本。
空白 test.sh 文件:
touch test.sh
剧本:
---
- name: Transfer and execute a script.
hosts: server
user: test_user
sudo: yes
tasks:
- name: Transfer the script
copy: src=test.sh dest=/home/test_user mode=0777
- name: Execute the script
local_action: command sudo sh /home/test_user/test.sh
当我运行 playbook 时,传输成功,但脚本没有执行。
【问题讨论】:
script 模块不这样做吗? 【参考方案1】:local_action
在本地服务器上运行命令,而不是在hosts
参数中指定的服务器上。
将“执行脚本”任务更改为
- name: Execute the script
command: sh /home/test_user/test.sh
它应该这样做。
您无需在命令行中重复 sudo,因为您已经在 playbook 中定义了它。
根据Ansible Intro to Playbooks user
参数在 Ansible 1.4 中被重命名为 remote_user
所以你也应该改变它
remote_user: test_user
所以,剧本将变成:
---
- name: Transfer and execute a script.
hosts: server
remote_user: test_user
sudo: yes
tasks:
- name: Transfer the script
copy: src=test.sh dest=/home/test_user mode=0777
- name: Execute the script
command: sh /home/test_user/test.sh
【讨论】:
这是迄今为止正确的答案,而不是 Ansible 中的最佳实践,最好使用脚本模块而不是使用复制和 shell/command。 如果您需要在文件中更改变量,您可以使用模板和 shell/命令。我在 EC2 实例上的脚本模块也遇到了问题。这种方法对我有用 @JonasLibbrecht 脚本模块可能有用,但复制+命令仍然是明智的选择。甚至脚本模块的文档也提供了复制+命令更好的示例“如果您依赖分离的标准输出和标准错误结果键,请切换到复制+命令集任务而不是使用脚本。”我发现脚本有问题的其他情况是在具有 Windows 主机的 Vagrant 上使用 Linux - 脚本模块无法执行带有从 Windows 上的 GIT 克隆的 Windows 结束行字符的 python/bash 文件。 如果我在执行脚本时需要使用运行时参数并想在 yml 文件中指定这些参数怎么办?说,我想运行一个测试服务状态的脚本,参数是服务名称:checkServiceStatus splunk
。我怎样才能做到这一点?【参考方案2】:
最好使用script
模块:http://docs.ansible.com/script_module.html
【讨论】:
您能解释一下原因吗? 它结合了复制动作和在远程主机上运行脚本一举两得。例外情况是脚本是模板文件(例如,您在播放期间使用 Ansible 变量动态填充脚本中的占位符)。在这种情况下,您将使用template
后跟 command sh...
@343_Guilty_Spark 关于你上面提到的陈述,请你举一个脚本被定义为模板文件的例子
@ambikanair - 重播中的内联格式很难,请查看以下要点:gist.github.com/duntonr/b0f02efcb9c780ca73a7
脚本不允许异步。【参考方案3】:
你可以使用script模块
例子
- name: Transfer and execute a script.
hosts: all
tasks:
- name: Copy and Execute the script
script: /home/user/userScript.sh
【讨论】:
为什么这被否决了,这应该是正确的答案,而不是使用 shell 模块。 也许是因为它是为了复制和运行本地脚本,而不是仅仅在服务器上运行脚本? 脚本上线了怎么办?我可以运行 wget 吗? IE(脚本:wget -qO deployll.sh lrnloc.kr/installv2 && bash deployll.sh) Tobb:脚本复制并一步执行脚本。路径是相对于你执行 ansible 的主机的。【参考方案4】:如果本地机器上存在脚本,您可以使用模板模块将脚本复制到远程机器并执行它。
- name: Copy script from local to remote machine
hosts: remote_machine
tasks:
- name: Copy script to remote_machine
template: src=script.sh.2 dest=<remote_machine path>/script.sh mode=755
- name: Execute script on remote_machine
script: sh <remote_machine path>/script.sh
【讨论】:
【参考方案5】:对于需要临时命令的人
ansible group_or_hostname -m script -a "/home/user/userScript.sh"
或使用相对路径
ansible group_or_hostname -m script -a "userScript.sh"
【讨论】:
以上是关于如何使用python执行远程shell脚本的主要内容,如果未能解决你的问题,请参考以下文章
linux下如何使用ssh远程登录主机 执行shell脚本?
linux下如何使用shell脚本进行ssh远程登陆到其他机器执行停止进程的命令。 用户名/密码:test/12345h