Ответ 1
Взаимодействие с удаленными серверами наконец поддерживается в Fabric 1.0. Подробнее см. эту страницу.
Это связано с этим question здесь, но с небольшим завихрением: вместо того, чтобы просто передавать "да" или "нет", мне нужна ткань для прохождения произвольная строка для удаленной оболочки.
Например, если удаленная оболочка запрашивает "как ваше имя?" то мне нужно прокормить его "первым, последним".
Уточнение: я знаю, что я произнес произвольный ввод, но я действительно пытался использовать его для подсказки passwd ключа SSH, когда я пытаюсь сделать git тянуть.
Обновление # 1: Получил ответ от Джеффа Форсира @bitprophet
Взаимодействие с удаленными серверами наконец поддерживается в Fabric 1.0. Подробнее см. эту страницу.
Я предложил API для этой функции в тканью в списке рассылки, и в итоге сам что-то написал:
from fexpect import expect, expecting, run
prompts = []
prompts += expect('What is your name?','John')
prompts += expect('Where do you live?','New York')
with expecting(prompts):
run('command')
Смотрите мой блогпост на ожидающие подсказки в ткани с fexpect
Возможно, посмотрите pexpect
Я создал исходный репозиторий git, названный project_name/.git.
ssh to the server, (entering ssh passwords or passphrases as I go)
mkdir project_name
cd project_name
git init
touch fabfile.py
git add fabfile.py
git commit -a -m "almost empty"
git checkout -b web
Я выхожу из веб-сайта. Вернитесь на локальную машину.
Я вытаскиваю с сервера через клон и добавляю содержимое моего проекта в мастер-ветку на локальном репо. Stll не использует ткань, просто настраивая вещи, хотя эти шаги также могут быть автоматизированы, и никто из них не нуждается в другой кодовой фразе ssh.
cd /path/to/project_name/..
git clone ssh://[email protected]_server.com/var/web/project_name/.git
cd project_name
gvim fabfile.py
git add fabfile.py
git commit -a -m "fabfile edits"
Теперь я начинаю использовать ткань. Ниже выдержки из моего файла fabfile для управления тегами git и ветки:
#Usage: fab committag brpush | fab committag push | fab push | fab tag
def committag():
"""commit chgs, tag new commit, push tags to server."""
prompt('commit descr: ', 'COM_MSG', default='new stuff')
prompt('commit name: ', 'COM_NAME', default='0.0.1')
local('git commit -a -m "%(COM_MSG)s"' % env)
local('sleep 1')
local('git tag -u "John Griessen" -m "%(COM_MSG)s" %(COM_NAME)s' % env)
local('sleep 1')
local('git push origin --tags') #pushes local tags
def brpush():
"""create a new branch, default COM_NAME, then push to server."""
prompt('new branch name: ', 'BR_NAME', default= '%(COM_NAME)s' % env)
local('git checkout -b %(BR_NAME)s' % env)
local('sleep 2')
local('git checkout master')
local('git push origin --tags') #pushes local tags
local('git push --all origin') #pushes local master and branches
def push():
"""Push existing tags and changes to server."""
local('git push origin --tags') #pushes local tags
local('git push --all origin') #pushes local master and branches
def tag(): #Call this from committag()
"""create a gpg signed tag on the local git repo tag from prompted name ."""
prompt('tag descr: ', 'TAG_MSG', default='0.0.1')
prompt('tag name: ', 'TAG_NAME', default='0.0.1')
local('git tag -u "John Griessen" -m "%(TAG_MSG)s" %(TAG_NAME)s' % env)
Чтобы использовать приведенные выше fabfile defs, я просто вношу некоторые изменения в свой проект dir, подумайте о соответствующем сообщении о них и выполните:
$fab committag
и у меня есть изменения, отмеченные и обновленные на сервере. Или:
$fab committag brpush
и у меня новая ветвь создана, и сервер обновлен.
Один из способов пропустить подсказку подтверждения хоста:
run('ssh-keyscan github.com > ~/.ssh/known_hosts')
Кроме того, я использую py-github для установки развертывания клавиши:
run('ssh-keygen -q -t rsa -f /home/%(user)s/.ssh/id_rsa -N ""' % env)
key = run('cat /home/%(user)s/.ssh/id_rsa.pub' % env)
gh.repos.addDeployKey(repo, env.host, key)