一 前言
之前做运维的时候,了解过python的fabric,但是后来用了ansible几乎就没接触fabric了,现在翻出来学习下,毕竟技多不压身。
二 fabric介绍
fabric是一个python自动化通过ssh管理服务器的第三方库,官方发布地址是https://pypi.org/project/fabric/,现在已经迭代到3.2.2版本。它能够在远程执行一些shell命令,从而实现运维的自动化。
#三 fabric实战
3.1 安装
代码语言:python代码运行次数:0复制pip3 install fabric
如果出现如下报错:
代码语言:python代码运行次数:0复制Collecting cryptography>=3.3 (from paramiko>=2.4->fabric)
ERROR: Could not find a version that satisfies the requirement cryptography>=3.3 (from paramiko>=2.4->fabric) (from versions: none)
ERROR: No matching distribution found for cryptography>=3.3 (from paramiko>=2.4->fabric)
先升级pip
代码语言:python代码运行次数:0复制sudo pip3 install --upgrade pip
如果继续报错:
代码语言:python代码运行次数:0复制 note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pycrypto
Running setup.py clean for pycrypto
Successfully built fabric
Failed to build pycrypto
ERROR: Could not build wheels for pycrypto, which is required to install pyproject.toml-based projects
解决方式如下:
使用清华的源
代码语言:python代码运行次数:0复制sudo pip3 install fabric -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2 run 一个命令
Fabric 推荐使用 SSH 密钥进行认证,而不是密码。
如果你需要使用密码进行连接,可以使用 paramiko 库,它是 Fabric 底层的 SSH 库,可以直接使用用户名和密码进行连接。以下是使用 paramiko 进行密码连接的示例代码:
代码语言:python代码运行次数:0复制import paramiko
hostname = '175.x.x.x'
port = 22
username = 'xxxxx'
password = 'xxxx'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, port, username, password)
stdin, stdout, stderr = ssh.exec_command('mkdir -p /tmp/ssh_test && echo "test" > /tmp/ssh_test/testfile&&ls -l /tmp/ssh_test')
print(stdout.read().decode())
ssh.close()
当然也可以直接使用fabric:
代码语言:python代码运行次数:0复制from fabric import Connection
hostname = 'x.x.x.x'
port = 22
username = 'xxxx'
password = 'xxx@xxx'
# 创建SSH连接
c = Connection(hostname, username, connect_kwargs={"password": password})
c.run('mkdir -p /tmp/ssh_test && echo "test" > /tmp/ssh_test/testfile&&ls -l /tmp/ssh_test')
# 关闭连接
c.close()
运行结果如下:
代码语言:python代码运行次数:0复制ljw4010deair:~ ljw4010$ python3 ssh.py
total 4
-rw-rw-r-- 1 ljw4010 ljw4010 5 Mar 7 23:49 testfile
3.3 上传文件
代码语言:python代码运行次数:0复制from fabric import Connection
hostname = 'x.x.x.x'
port = 22
username = 'xxxx'
password = 'xxx@xxx'
# 要上传的本地文件路径和远程目录
local_file = "./testssh"
remote_dir = "/tmp/ssh_test"
# 创建SSH连接
c = Connection(hostname, username, connect_kwargs={"password": password})
# 上传文件
with c.cd(remote_dir):
c.put(local_file, remote_dir)
c.run('ls -l /tmp/ssh_test')
# 关闭连接
c.close()
执行结果:
代码语言:python代码运行次数:0复制ljw4010deair:~ ljw4010$ python3 ssh.py
total 4
-rw-rw-r-- 1 ljw4010 ljw4010 5 Mar 7 23:56 testfile
-rw-r--r-- 1 ljw4010 ljw4010 0 Mar 8 00:00 testssh
3.4 下载文件
代码语言:python代码运行次数:0复制from fabric import Connection
hostname = 'xx.xx.xx.xx'
port = 22
username = 'xxxxx'
password = 'xxxx'
# 要dl的本地文件路径和远程目录
local_file = "./"
remote_dir = "/tmp/ssh_test/testfile"
# 创建SSH连接
c = Connection(hostname, username, connect_kwargs={"password": password})
# dl文件
c.get(remote_dir,local_file)
# 关闭连接
c.close()
执行结果:
代码语言:python代码运行次数:0复制ljw4010deair:~ ljw4010$ python3 ssh.py
ljw4010deair:~ ljw4010$ ls -al testfile
-rw-rw-r-- 1 ljw4010 staff 5 3 8 00:05 testfile
四 总结
本文简单介绍了自动化运维python库之fabric,并讲解安装过程,以及解决安装遇到的问题,并使用执行命令,上传,下载等运维常见操作进行示例,当然这个工具不单单只有讲述的功能,还有其他高级功能,诸如批量执行,sudo执行等待你的探索。