【问题标题】:Python Fabric perform remote database taskPython Fabric 执行远程数据库任务
【发布时间】:2016-10-10 11:21:51
【问题描述】:

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

  1. 以 userA 身份登录
  2. sudo su - 用户 B
  3. 使用 psycopg2 运行 daliy_python.py 脚本从数据库中读取一些信息(通过本地连接(非 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 到服务器。这可能是一个限制。本地和远程机器都在运行 Ubuntu 14.04。

【问题讨论】:

  • 这是一个数据库连接错误,它与使用结构运行远程进程确实是一个单独的问题。查看其中一些可能的解决方案:stackoverflow.com/questions/5500332/…stackoverflow.com/questions/26034092/…
  • @chishaku 谢谢,我不知道这个错误来自哪里,如果我通过 ssh 连接到服务器并执行该工作,它工作正常。它只是在我使用织物脚本时发生的,这让我想知道我是否对织物设置做错了/或者我应该使用其他工具?

标签: python postgresql ssh ubuntu-14.04 fabric


【解决方案1】:

我终于找到了我的问题所在。 感谢@chishake 和@C14L,我以另一种方式看待这个问题。 受到link1link2这个帖子的启发后,我开始认为这个问题与环境变量有关。 因此我添加了一个 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)

【讨论】:

    【解决方案2】:

    这就是我无需额外登录即可读取根可访问日志文件的方法

    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 的用户,运行你的脚本。在我的情况下tail -f /var/log/nginx/access.log

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

    【讨论】:

    • 谢谢,也许这是更好的选择。分两步完成,一是在服务器上运行 cron 作业,将新信息转储到文件中,二是通过 ssh 到服务器并下载文件。
    猜你喜欢
    • 2016-07-03
    • 2015-11-18
    • 2013-08-26
    • 2014-06-21
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多