Python Fabric 执行远程数据库任务
Python Fabric perform remote database task
我需要通过 ssh 连接到远程 Ubuntu 服务器来执行一些常规工作,步骤如下:
- ssh 以用户 A 身份登录
- sudo su - 用户 B
- 运行 daliy_python.py 使用 psycopg2 从数据库中读取一些信息的脚本(通过本地连接 (non-TCP/IP))
- 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)
我需要通过 ssh 连接到远程 Ubuntu 服务器来执行一些常规工作,步骤如下:
- ssh 以用户 A 身份登录
- sudo su - 用户 B
- 运行 daliy_python.py 使用 psycopg2 从数据库中读取一些信息的脚本(通过本地连接 (non-TCP/IP))
- 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)