python运维自动化使用案例:paramiko(SSH 远程操作)、fabric(批量执行命令)

Paramiko(SSH 远程操作)和 Fabric(批量执行命令)在 Python 运维自动化中的使用案例:

Paramiko 使用案例

  • 远程执行命令

    import paramiko

    def execute_remote_command(hostname, username, password, command):
    try:
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname, username=username, password=password)
    stdin, stdout, stderr = client.exec_command(command)
    print(stdout.read().decode())
    except Exception as e:
    print(f"Error: {e}")
    finally:
    client.close()

    if name == "main":
    hostname = "your_remote_host"
    username = "your_username"
    password = "your_password"
    command = "ls -l"
    execute_remote_command(hostname, username, password, command)

上述代码定义了一个函数,通过 Paramiko 连接到远程服务器,执行指定的命令,并打印命令执行结果

复制代码
import paramiko

def upload_file(hostname, port, username, password, local_path, remote_path):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname, port=port, username=username, password=password)
    sftp = client.open_sftp()
    sftp.put(local_path, remote_path)
    sftp.close()
    client.close()

if __name__ == "__main__":
    hostname = "192.168.56.10"
    port = 22
    username = "root"
    password = "vagrant"
    local_path = "localfile.txt"
    remote_path = "/remote/path/remote.txt"
    upload_file(hostname, port, username, password, local_path, remote_path)

该案例实现了将本地文件上传到远程服务器指定路径的功能。

Fabric 使用案例

  • 远程执行命令并查看系统信息2:

    from fabric import Connection

    def check_server_info():
    c = Connection('your - server - ip', user='your_username', connect_kwargs={"password": "your_password"})
    result = c.run("uname -a", hide=True)
    print("远程服务器信息:", result.stdout.strip())

    if name == "main":
    check_server_info()

代码通过 Fabric 的Connection对象连接到远程服务器,执行uname -a命令获取系统信息并打印

  • 批量更新 Docker 容器
复制代码
  from fabric import Connection
  from fabric.decorators import task

  @task
  def update_docker(c):
      c.run("docker pull mydockerhub/myapp:latest")
      c.run("docker stop myapp")
      c.run("docker rm myapp")
      c.run("docker run -d --name myapp -p 80:80 mydockerhub/myapp:latest")

  if __name__ == "__main__":
      hosts = ["server1_ip", "server2_ip"]
      for host in hosts:
          c = Connection(host, user='your_username', connect_kwargs={"password": "your_password"})
          update_docker(c)

上述案例定义了一个更新 Docker 容器的任务,通过 Fabric 可以在多个远程服务器上批量执行该任务,实现 Docker 容器的更新。

  • 批量执行脚本并传递参数4:

    from fabric.api import run, env

    env.hosts = ('192.168.1.110', '192.168.1.111')
    env.user = "username"
    env.password = "password"

    def robot(device):
    with cd('/home/workspace/project'):
    run('bash run.sh %s robot && sleep 1' % device)

执行时可以使用fab robot:device=5560,这样就会在env.hosts指定的远程服务器上的指定目录下执行run.sh脚本,并传递参数5560 robot