Python Fabric 执行远程数据库任务

Python Fabric perform remote database task

我需要通过 ssh 连接到远程 Ubuntu 服务器来执行一些常规工作,步骤如下:

  1. ssh 以用户 A 身份登录
  2. sudo su - 用户 B
  3. 运行 daliy_python.py 使用 psycopg2 从数据库中读取一些信息的脚本(通过本地连接 (non-TCP/IP))
  4. scp 读数到我的本地机器

问题是:如何自动做到这一点? 我已经尝试使用 Fabric,但是我 运行 遇到了 psycopg2 的问题,在我 运行 下面的 Fabric 脚本之后,我收到了来自 daliy_python.py

的错误
psycopg2.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/xxx/.s.xxxx"?

我的fabfile.py代码如下:

from fabric.api import *

import os
import socket
import pwd

# Target machine setting
srv = 'server.hostname.com'
env.hosts = [srv]
env.user = 'userA'
env.key_filename = '/location/to/my/key'

env.timeout = 2
# Force fabric abort at timeout
env.skip_bad_hosts = False

def run_remote():
    user = 'userB'    
    with settings(warn_only=True):
        run('whoami')
        with cd('/home/%s/script/script_folder' % user):
            sudo('whoami')
            sudo('pwd', user=user)
            sudo('ls', user=user)
            sudo('python daliy_python.py', user=user)

有什么建议吗?我的数据库只能通过 userB 在本地访问,但只有 userA 可以通过 ssh 连接到服务器。这可能是一个限制。本地和远程机器都是 运行ning Ubuntu 14.04.

这就是我在无需额外登录的情况下读取我的 root 可访问日志文件的方法

ssh usera@12.34.56.78 "echo hunter2 | sudo -S tail -f /var/log/nginx/access.log"

即:ssh usera@12.34.56.78 "..run this code on the remote.."

然后在遥控器上,将 sudo 密码通过管道传输到 sudo -S echo hunter2 | sudo -S

向 sudo 添加 -u userb 以切换到特定用户,我在本例中使用的是 root。那么作为 sudo'ed 用户,运行 你的脚本。就我而言 tail -f /var/log/nginx/access.log.

但是,阅读您的 post,我可能会简单地在遥控器上设置一个 cronjob,因此它会自动 运行s。我实际上对我所有的数据库都这样做。一个 cronjob 每天将它们转储到某个目录,日期作为文件名。然后我在一小时后使用 rsync 将它们下载到我的本地 PC。

我终于找到我的问题所在了。 感谢@chishake 和@C14L,我换个角度看问题。 受到这个帖子的启发link1 link2,我开始认为这个问题与环境变量有关。 因此我添加了一个 with 语句来改变 $HOME 并且它起作用了。

fabfile.py如下:

from fabric.api import *

import os
import socket
import pwd

# Target machine setting
srv = 'server.hostname.com'
env.hosts = [srv]
env.user = 'userA'
env.key_filename = '/location/to/my/key'

env.timeout = 2
# Force fabric abort at timeout
env.skip_bad_hosts = False

def run_remote():
    user = 'userB'    
    with settings(warn_only=True):
        run('whoami')
        with shell_env(HOME='/home/%s' % user):
            sudo('echo $HOME', user=user)
            with cd('/home/%s/script/script_folder' % user):
                sudo('whoami')
                sudo('pwd', user=user)
                sudo('ls', user=user)
                sudo('python daliy_python.py', user=user)