2016-06-09 3 views
0

мне нужно SSH на удаленный сервер Ubuntu, чтобы сделать некоторые рутинную работу, в следующих шагах:Python Fabric выполнить удаленную базу данных задач

  1. SSH как ПользовательА
  2. SUDO су - USERB
  3. запустить daliy_python .py скрипт с использованием psycopg2 прочитать некоторую информацию из базы данных (через локальное соединение (не TCP/IP))
  4. показания ПКПП моей локальной машине

Вопрос: Как это сделать автоматически? Я пытаюсь использовать ткань, но я столкнулся с проблемой с psycopg2, после того, как я запускаю сценарий ткани ниже, я получил сообщение об ошибке от моего 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.

+0

Это ошибка соединения с базой данных, которая на самом деле отдельное беспокойство от запуска удаленных процессов с тканью. См. Некоторые из этих возможных решений: https://stackoverflow.com/questions/5500332/cant-connect-the-postgresql-with-psycopg2 https://stackoverflow.com/questions/26034092/connection-error-while- connection-to-postgresql-as-postgres-user – chishaku

+0

@chishaku Спасибо, я не знаю, откуда эта ошибка, если я нахожусь на сервере и выполняю работу, он отлично работает. Это произошло, когда я использую скрипт для работы с материалами, что заставляет меня задаться вопросом, не сделал ли я что-то не так с настройкой ткани/или я должен использовать другой инструмент? – cityzz

ответ

0

Это то, что я делаю, чтобы прочитать мой корень доступные логах без дополнительного входа

ssh [email protected] "echo hunter2 | sudo -S tail -f /var/log/nginx/access.log" 

То есть: ssh [email protected] "..run this code on the remote.."

Тогда на пульте дистанционного управления, вы передадите пароль Sudo в sudo -Secho hunter2 | sudo -S

Добавьте -u userb в sudo для перехода к определенному пользователю, я использую root в моем случае. Итак, как пользователь sudo'ed, запустите свой скрипт. В моем случае tail -f /var/log/nginx/access.log.

Но, читая ваше сообщение, я бы, вероятно, просто установил cronjob на пульте дистанционного управления, поэтому он запускается автоматически. Я действительно делаю это для всех моих баз данных. Cronjob сбрасывает их один раз в день в определенный каталог с датой имени файла. Затем я загружаю их на свой локальный ПК через rsync через час.

+0

Спасибо, возможно, это лучший вариант.Чтобы сделать это до двух шагов, одно, задание cron, запущенное на сервере, дамп новой информации в файл, во-вторых, ssh на сервер и загрузка файла. – cityzz

0

Наконец-то я выяснил, где моя проблема. Спасибо @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) 
Смежные вопросы