python 远程系统管理工具paramiko/Fabric

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)
      
  • 上下文管理器

    很常见的需求,shell中的上下文管理器:
    shell pwd (cd /tmp && pwd) pwd
    在Fabric中,也提供了上下文管理器
    • cd 切换远程机器目录
          with cd("/var/www"):
              run("ls")
      
    • lcd 本地切换目录
    • path 配置远程服务器环境变量
      • append
      • prepend
      • replace
    • profix 所有命令添加一个统一前缀
          with cd("/var/www"):
              with profix("workon mvenv"):
                  run("./my.py")
                  run("./you.py")
      
      等于shell:
          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

  • fabric 的装饰器
    • task
      fabfile 中所有可调用对象都是一个task,但是你可以手动指定哪个函数为task

          from 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')
        
    • 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值