งาน Python Fabric สามารถเรียกใช้งานอื่นและเคารพรายชื่อโฮสต์ได้หรือไม่

ฉันมี fabfile ดังต่อไปนี้:

@hosts('host1')
def host1_deploy():
    """Some logic that is specific to deploying to host1"""

@hosts('host2')
def host2_deploy():
    """Some logic that is specific to deploying to host2"""

def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()

ฉันอยากจะทำ

fab deploy

และให้เทียบเท่ากับ

fab host1_deploy host2_deploy

กล่าวอีกนัยหนึ่ง ให้รันงานย่อยแต่ละงาน และสำหรับแต่ละงานให้ใช้รายการโฮสต์ที่งานระบุ อย่างไรก็ตาม สิ่งนี้ไม่ได้ผล แต่งานปรับใช้() ต้องการรายชื่อโฮสต์ของตัวเองที่จะเผยแพร่ไปยังงานย่อยทั้งหมดแทน

มีวิธีอัปเดตงาน upload() ที่นี่เพื่อให้ทำสิ่งที่ฉันต้องการในขณะที่ปล่อยงานย่อยไว้ตามลำพังเพื่อให้สามารถรันทีละงานได้หรือไม่


person fabricquestion    schedule 17.03.2011    source แหล่งที่มา


คำตอบ (4)


ตั้งแต่ Fabric 1.3 ตอนนี้ execute helper ก็พร้อมสำหรับการดำเนินการนี้แล้ว มีเอกสารประกอบอยู่ที่นี่: ดำเนินการอย่างชาญฉลาด งานที่มีการดำเนินการ

นี่คือตัวอย่างที่พวกเขาใช้:

from fabric.api import run, roles, execute

env.roledefs = {
    'db': ['db1', 'db2'],
    'web': ['web1', 'web2', 'web3'],
}

@roles('db')
def migrate():
    # Database stuff here.
    pass

@roles('web')
def update():
    # Code updates here.
   pass

จากนั้นให้เรียกใช้ทั้ง migrate และ web จากงานอื่น deploy:

def deploy():
    execute(migrate)
    execute(update)

และนี่จะเคารพบทบาทและรายการโฮสต์ที่มีงานเหล่านั้น

person Mitchell    schedule 17.11.2011
comment
เป็นไปได้ไหมที่จะเพิ่มบทบาทให้กับวิธีการเรียน? ฉันใช้คลาสสำหรับงานผ้า - person Francesco Della Vedova; 28.11.2013
comment
ลิงก์ไปยังเอกสารประกอบใช้งานไม่ได้ นี่คือเวอร์ชันล่าสุด: docs.fabfile .org/en/1.8/usage/ - person krd; 22.05.2014

มันง่อย แต่ใช้งานได้ตั้งแต่ Fabric 1.1.2

def host1_deploy():
    """Some logic that is specific to deploying to host1"""
    if env.host in ["host1"]:
        pass #this is only on host2

def host2_deploy():
    """Some logic that is specific to deploying to host2"""
    if env.host in ["host2"]:
        pass #this is only on host2

def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()

นี่คือรหัสทดสอบของฉัน:

@task
@roles(["prod_web","prod_workers"])
def test_multi():
    test_multi_a()
    test_multi_b()

def test_multi_a():
    if env.host in env.roledefs["prod_web"]:
        run('uname -a')

def test_multi_b():
    if env.host in env.roledefs["prod_workers"]:
        run('uname -a')
person Evan R.    schedule 12.07.2011

อาจมีวิธีที่ดีกว่าในการจัดการ แต่คุณสามารถส่งโฮสต์ทั้งสองเพื่อปรับใช้() จากนั้นใน host1_deploy() และ host2_deploy() ตรวจสอบ env.host:

def host1_deploy():
    if env.host in ['host1']:
         run(whatever1)

def host2_deploy():
    if env.host in ['host2']:
         run(whatever2)

@hosts('host1','host2')
def deploy():
    host1_deploy()
    host2_deploy()
person pwan    schedule 18.03.2011

ลองอันนี้. แน่นอนว่าคุณต้องการแทนที่ local ด้วย run หรือ sudo กุญแจสำคัญคือตัวตกแต่ง @hosts ที่ว่างเปล่าสำหรับ deploy

from fabric.api import local
from fabric.decorators import hosts

@hosts('host1')
def host1_deploy():
    """Some logic that is specific to deploying to host1"""
    local('echo foo')

@hosts('host2')
def host2_deploy():
    """Some logic that is specific to deploying to host2"""
    local('echo bar')

@hosts('')
def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()
person Charles Hooper    schedule 28.06.2011