文章目录
SSH 访问远程服务器
-
SSH
- OpenSSH 基本使用
# 重启 ssh 服务 /etc/init.d/sshd restart # ssh 配置文件地址 /etc/ssh/sshd_config # ssh username@remote_host -p 22 'COMMANDS' # 配置 ~/.ssh/config cat ~/.ssh/config Host host2 StrictHostKeyChecking no HostName 10.166.224.14 Port 2092 ForWardAgent yes User root Controlpath ~/.ssh/ssh-%r@%h:%p.sock Host * StrictHostKeyChecking no HostName %h Port 2092 User root Controlpath ~/.ssh/ssh-%r@%h:%p.sock
- 使用秘钥远程登录
- ssh-keygen 生成秘钥对
- ~/.ssh/id_rsa 私钥文件
- ~/.ssh/id_rsa.pub 公钥文件
- 将 公钥文件 添加到远程服务器的 ./ssh/authorized_ksys 文件中即可实现免密登录
# OpenSSH 提供的公钥远程保存工具 ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host
- ssh-agent 管理私钥
ssh-agent ssh-add ~/.ssh/id_rsa
Polysh 批量管理服务器
- pexpect 实现交互式命令
- Polysh 是交互式命令工具,可以批量对服务器进行处理
- 安装
pip isntall polysh
- 使用
polysh --help 查看参数意义
```
polysh --ssh='exec ssh -p 22 -i ~/.ssh/idrsa.private' --user=root --hosts-file=hosts
```
paramiko
-
安装
pip install paramiko
python -c ‘import paramiko’ -
paramiko 基本使用
import paramiko # SSHClient 的方法 ssh = paramiko.SSHClient.connect() # 建立远程连接 set_missing_host_key_public # know_hosts 文件控制 exec_command # 执行命令 open_sftp # 建立 sftp 会话 # SFTPClient 的方法 put get mkdir remove rmdir stat listdir chmod
Fabric 一个强大的命令行工具,方便应用部署和系统管理
-
安装
pip install fabric
命令行帮助
fab --help -
简单使用
from fabric.api import run,sudo,env env.hosts = ['10.166.224.14', '10.166.224.14'] env.port = 3306 env.user = root def hostname(): run('hostname') def ls(path='.'): run("ls {}".format(path)) def tail(path='/etc/passwd', line=10): sudo('tail -n {0} {1}'.format(line, path))
- run 函数,远程执行命令封装
- sudo 以sudo权限执行远程命令
- env 保存配置信息的字典
# 获取所有任务列表 fab --list # 获取所有服务器 hostname fab hostname # 调用函数传递参数 fab ls:/home fab ls:path=/home # 多个参数 fab tail:/etc/sudoer,3 fab tail:line=3,path=/etc/sudoer # 执行多个函数 fab hostname ls # 按任务顺序依次执行
-
命令行参数
fab --help- -l 查看任务列表
- -f 入口文件
- -g 指定网管设备
- -H 命令行指定目标服务器,逗号分隔多个服务器
- -P 并行运行任务,默认串行
- -R 用角色名区分不同的服务
- -t 连接超时时间,秒
- -w 命令行失败警告,默认终止任务
- –Fabric 不写代码进行远程操作
fab -H 1.1.1.1,2.2.2.2 --port=2092 --user=root – ‘ip a’
-
env 字典
全局唯一字典,保存配置
常用配置:- env.hosts 目标服务器列表
- env.exclude_hosts 排除特定的服务器
- env.user ssh到远程服务器的用户名
- env.port 远程服务器的端口号
- key_filename 私钥文件地址
- password 到远程服务器的密码
-
Fabric 提供的命令
- run 在远程服务器执行shell命令
run("mkdir /tmp/trunk/")
- sudu
sudo("mkdir /var/www/")
- local 执行本地命令
local("tar xzvf /tmp/trunk/app.tar.gz")
- get 从远程服务器获取文件
get(remote_path="/tmp/log.log", local_path="/log/log.log") get(remote_path="/tmp/*.log", local_path="/log/")
- put 将本地文件上传到远程服务器
put("*.py", "/usr/bin", mode=0755)
- reboot 远程重启服务器
reboot(wait=30)
- prompt 执行交互
prompt("Please specify process nice level:", key='nice', validate=int)
- run 在远程服务器执行shell命令
-
上下文管理器
很常见的需求,shell中的上下文管理器:
shell pwd (cd /tmp && pwd) pwd
在Fabric中,也提供了上下文管理器- cd 切换远程机器目录
with cd("/var/www"): run("ls")
- lcd 本地切换目录
- path 配置远程服务器环境变量
- append
- prepend
- replace
- profix 所有命令添加一个统一前缀
等于shell:with cd("/var/www"): with profix("workon mvenv"): run("./my.py") run("./you.py")
cd /var/www && workon mvenv && ./my.py cd /var/www && workon mvenv && ./you.py
- shell_env 设置shell脚本环境变量
with shell_env(ZOM_DIR="/home/user/local") run("pip install flask") # shell export ZMQ_DIR="/home/user/local" && pip install flask
- settings 临时覆盖env变量
- remote_tunnel 通过ssh的端口转发建立转发通道
with remote_tunnel(3306): run("mysql -u root -p pwd")
- 控制输出
-
hide
-
show
-
quiet
-
warn_only
-
日志分类
1、 status
2、aborts
3、warnings
4、running
5、stdout
6、stderr
7、user
-
- cd 切换远程机器目录
- fabric 的装饰器
-
task
fabfile 中所有可调用对象都是一个task,但是你可以手动指定哪个函数为taskfrom tabric.api inport task,run @task def mytask(): run("command") def notask() run("command")
这个时候,没有用装饰器装饰的就不是可调用的task了。
-
host
1、通过修改env中的host列表来指定远程服务器
2、fab命令行的 -H
- 指定host时,可以同时指定 用户名和端口号
用户名和端口号不是必须的username@hostname:port
- 通过命令行指定 哪些host 执行 哪些任务
fab mytask:host="host1;host2"
- 通过host装饰器指定哪些host执行当前task
@host(host1,host2) def mytask(): run("ls")
- env.reject_unkown_hosts 控制位置host的行为,默认为True。相当于 StrictHostKeyChecking 为 no
ssh -o StrictHostKeyChecking=no
- role 将host进行分组,进行不同管理操作
from fabric.api import run,roles env.roledefs = { "db":["db1", "db2"], "web":["web1", "web2"], } @roles("db") def migrate(): pass @roles("web") def update(): pass @hosts('a', 'b') @roles("db") def mytask(): run('ls')
- 指定host时,可以同时指定 用户名和端口号
-
fabric 的执行模型
fabric的执行步骤如下:
1、根据命令行参数创建任务列表,保持任务的顺序
2、对于每个任务构造服务器列表
3、遍历任务列表,对每一台服务器分别执行任务
4、没有执行服务器的任务默认为本地任务,仅执行一次
如何让任务并行:
1、 命令行参数 -P | --parallel
2、env.parallel
3、parallel 装饰器
-
fabric 的装饰器
- runs_once 只执行一次
- serial 强制串行
-
-
其它功能函数
- 封装task execute函数
from fabric.api import run,role,execute env.roledefs = { "db":["db1", "db2"], "web": ["web1", "web2"], } @roles("db") def migrate(): pass @roles("web") def update(): pass def deploy(): execute(migrate) execute(update)
- util 函数
- abort 终止函数执行,打印错错,退出码为 1
- warn 输出警告信息
- puts 打印输出,类似于python的print
- 带颜色的终端输出
包含颜色:from fabric.colors import green print(green("This text is green!!!"))
- blue
- cyan
- green
- magenta
- red
- white
- yellow
- 封装task execute函数