2012-01-19 17 views
9

Python's Fabric, execute işlevini kullanarak fab yardımcı programının dışında kumaş işlevlerini çağırmayı sağlar. Bir 1.execute işlevi, yürütme kullanılarak çağrılan başka bir işlev içinde çağrıldığında bağlamsal bir sorun ortaya çıkar. Kumaş, iç yürütme çalıştırıldığında dış yürütme bağlamını kaybeder ve hiçbir zaman kurtarmaz. Örneğin:Python'un Kumaş kitaplığı ile "yürütme" için iç içe aramalar yapma

env.roledefs = { 
    'webservers': ['web1','web2'], 
    'load_balancer': ['lb1'] 
} 

@roles('webserver') 
def deploy_code(): 
    #ship over tar.gz of code to unpack. 
    ... 
    execute(remove_webserver_from_load_balancer, sHost=env.host_string) 
    ... 
    #shutdown webserver, unpack files, and restart web server 
    ... 
    execute(add_webserver_to_load_balancer, sHost=env.host_string) 

@roles('load_balancer') 
def remove_webserver_from_load_balancer(sHost=None): 
    ssh("remove_host %s" % sHost) 

execute(deploy_code) 

execute ilk aramadan sonra, kumaş tamamen bağlamı kaybeder ve host_string='lb1' yerine 'web1' ile deploy_code işlevi içinde tüm diğer komutları yürütür. Hatırlamak için onu nasıl alabilirim?

bu hack ile geldi, ancak gelecek sürümlerde üzerinde kırılabilir gibi hissediyorum: Bu etkin tüm devlet kaydeden çağrısından sonra bunu geri

with settings(**env): 
    execute(remove_webserver_from_load_balancer, sHost=env.host_string) 

, ancak istenmeyen bir yol gibi görünüyor işlevi. Fabric'e iç içe geçmiş bir işlemde olduğunu ve durumu hatırlamak için bir ayar yığını mı yoksa eşdeğer bir yöntem mi olduğunu söylemenin daha iyi bir yolu var mı?

Teşekkürler!

+0

btw, kullanıyorum Fabric 1.3.4 – adowds

+0

Neden sadece işlevleri doğrudan çağırmak yerine execute() 'içindeki görevleri kullanıyorsunuz? – jfs

+1

@JFSebastian Sanırım [belgeler] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) sorunuzu yanıtlıyor: 'Kumaşın tasarımı büyülü davranışı eskort ediyor. görev işlevi rolleri gibi dekoratörler dikkate almaz. – jcollado

cevap

1

Doğru kumaş kullanmıyorsunuz. Sadece python gibi fabfile çalıştırmak yerine fab deploy_code'u aradığınızda. Fabfile'ınızı nasıl yapılandıracağınız konusunda daha iyi bir fikir edinmek için öğreticiden geçmenizi öneririm.

Yine de, daha fazla özellik için execute() ve here'un nasıl kullanılacağı konusunda look here yapabilirsiniz.

Webservers rolünden 's' bıraktığınız bir yazım hatası var. İkinci görevde istediğiniz zaman iyi bir ana bilgisayar dizesi bulunmadığı için bu durum hangisi olabilir.

Ancak, bununla birlikte, execute() komutunun kendisinde de rolleri ve ana bilgisayarları da ayarlayabilirsiniz.