2015-05-06 4 views
3

Как вы используете Fabric для команд сценария на Vagrant-managed VM?Как выполнять команды Fabric на Vagrant

Я думал, что это было так просто, как this example, но я не могу заставить его работать.

Vagrant сам по себе работает нормально. Я могу запустить:

vagrant init 
vagrant up --provider=libvirt 
vagrant ssh 

и подключиться через ssh просто отлично. Однако, используя ткань пример, если я пытаюсь запустить:

fab vagrant uname 

он не может подключиться с ошибкой:

[127.0.0.1:2222] Executing task 'test_dev_env' 
[127.0.0.1:2222] run: uname -a 

Fatal error: Low level socket error connecting to host 127.0.0.1 on port 2222: Connection refused (tried 1 time) 

Underlying exception: 
    Connection refused 

Aborting. 

Что вызывает эту ошибку? Насколько я знаю, vagrant ssh должен работать с той же командой ssh, что и Fabric. Но конечно же, даже если я вручную запустить команду SSH:

ssh -i /myproject/.vagrant/machines/default/libvirt/private_key -p 2222 [email protected] 

Я также получаю ошибку:

ssh: connect to host 127.0.0.1 port 2222: Connection refused 

Что я делаю неправильно?

+0

'127.0.0.1' будет неправильным, если вы пытаетесь войти в виртуальную машину. Взгляните на 'vagrant ssh-config'. – jordanm

ответ

-1

By default Vagrant кажется пересылать TCP-порт 22 (SSH) на локальный порт 4567.

Для прослушивания на порт 2222 вместо этого, включать это в Vagrantfile:

config.vm.network "forwarded_port", guest: 22, host: 2222, id: 'ssh' 
1

Видимо, бродяга фактически не настройте порт-переадресацию, поэтому единственный способ подключения к виртуальной машине - получить ее IP от vagrant ssh-config, а затем подключиться к ней. Таким образом, правильная задача бродяги Ткань выглядит так:

@task 
def vagrant(): 
    result = local('vagrant ssh-config', capture=True) 

    hostname = re.findall(r'HostName\s+([^\n]+)', result)[0] 
    port = re.findall(r'Port\s+([^\n]+)', result)[0] 
    env.hosts = ['%s:%s' % (hostname, port)] 

    env.user = re.findall(r'User\s+([^\n]+)', result)[0] 
    env.key_filename = re.findall(r'IdentityFile\s+([^\n]+)', result)[0] 
+0

Похоже, это сработает! Но почему вы regex анализируете вывод 'vagrant ssh-config', когда вы можете указать порт в Vagrantfile? – Andomar

+0

Я не мог заставить Вагранта работать так. Ничто не было запущено на моей локальной машине в портах, которые Vagrant заявляет о пересылке. – Cerin

Смежные вопросы