2015-05-06 83 views
3

如何使用Fabric來編寫Vagrant-managed虛擬機上的命令腳本?如何在Vagrant上運行Fabric命令

我以爲它就像this example一樣簡單,但我無法讓它工作。

流浪者本身工作正常。我可以運行:

vagrant init 
vagrant up --provider=libvirt 
vagrant ssh 

通過ssh連接就好了。然而,使用Fabric例如,如果我嘗試運行:

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應該運行與Fabric相同的ssh命令。但肯定不夠,即使我手動運行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

顯然,無業遊民,實際上並不設置端口轉發器,所以連接到VM的唯一方法是從vagrant ssh-config獲取IP,然後使用該端口進行連接。因此,正確的流浪服面料任務如下所示:

@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

這看起來像會起作用!但是,爲什麼當你可以指定Vagrantfile中的端口時,regex會解析'vagrant ssh-config'的輸出? – Andomar

+0

我無法讓Vagrant以這種方式工作。我的本地機器上沒有任何東西在Vagrant宣稱正在轉發的端口上運行。 – Cerin