阅读 170

模拟 saltstack/ansible 系列二(实现ansible主要功能)

前言

本次主要分享是如何基于Python模拟实现ansible的主要功能

ansible功能分析与代码实现

连接远程主机

ansible连接远程主机是通过SSH实现的,因此我们可以通过Python的SSH模块来实现连接远程主机。

Python中SSH模块主要是三方的paramiko模块,这个模块也是ansible内部实现SSH所用的模块。

由于paramiko属于第三方库,所以需要使用如下命令先行安装

pip install paramiko 复制代码

下面是使用paramiko进行SSH连接和SFTP连接的相关代码

获取一个SSH连接

def get_ssh_conn(hostname, port, username, password):     try:         # 实例化SSHClient         ssh_client = paramiko.SSHClient()         # 当远程服务器没有本地主机的密钥时自动添加到本地,这样不用在建立连接的时候输入yes或no进行确认         ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())         # 连接SSH服务器,这里以账号密码的方式进行认证,也可以用key认证         ssh_client.connect(             hostname=hostname, port=port, username=username, password=password, timeout=5         )         return ssh_client     except Exception as e:         logger.info(e)         return None 复制代码

获取一个SFTP连接

def get_sftp_conn(hostname, port, username, password):     try:         # paramiko sftp功能需要先初始化一个Transport,有点类似打开一个文件传输通道         t = paramiko.Transport((hostname, port))         t.banner_timeout = 10         t.connect(username=username, password=password)         sftp = paramiko.SFTPClient.from_transport(t)         return sftp     except Exception as e:         return None 复制代码

执行命令

paramiko既然能连接主机,当然也能执行命令

基于SSH连接执行命令

def exec_ssh_command(ssh_client, cmd):     # 这个类似Popen执行命令,返回三个byte类型值,需要解码     stdin, stdout, stderr = ssh_client.exec_command(cmd, timeout=30)     return stderr.read().decode(), stdout.read().decode() 复制代码

上传下载文件

当我们初始化好后SFTP连接后,就可以对远程服务器进行文件上传下载了

基于SFTP连接进行文件上传下载

# put上传文件 def upload_file(sftp, src, dest):     sftp.put(src, dest) # get下载文件 def download_file(sftp, src, dest):     sftp.get(src, dest) 复制代码

ansible的ping功能

其实我们可以通过paramiko是否能ssh连接远程主机作为ping功能实现的原理,当ssh能连接成功时,会返回一个sshclient,否则返回None,参考获取一个SSH连接的代码

 伪原创工具 SEO网站优化  https://www.237it.com/ 

作者:jackless
链接:https://juejin.cn/post/7035630466791276558


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐