2012-05-01 34 views
8

Tôi đang tự hỏi nếu có ai có kinh nghiệm triển khai nhiều máy chủ đằng sau một cân bằng tải trên EC2 với fabricTriển khai nhiều máy chủ EC2 với Vải

Tôi đã sử dụng vải trong một thời gian bây giờ, và không có vấn đề với nó, hoặc triển khai cho nhiều máy chủ, nhưng những gì tôi muốn làm trong kịch bản này là (cho phép nói rằng tôi có mười trường hợp đang chạy) bỏ đăng ký một nửa (5) hộp từ trình cân bằng tải của tôi, triển khai mã của tôi cho chúng và chạy khói kiểm tra, và nếu mọi thứ có vẻ tốt, đăng ký chúng với bộ cân bằng tải một lần nữa và de-đăng ký 5 trường hợp còn lại và triển khai cho họ, và sau đó đăng ký chúng trở lại cân bằng tải.

Tôi không gặp vấn đề gì khi thực hiện bất kỳ tác vụ riêng lẻ nào (không đăng ký, chạy thử nghiệm, triển khai v.v.), tôi không biết cách tổ chức máy chủ của mình một cách đơn giản để tôi có thể triển khai nửa đầu, sau đó là nửa thứ hai. Vải dường như được thiết lập để chạy cùng một tác vụ trên tất cả các máy chủ theo thứ tự (tác vụ 1 trên máy chủ 1, nhiệm vụ 1 trên máy chủ 2, tác vụ 2 trên máy chủ 1, tác vụ 2 trên máy chủ 2 v.v.)

Suy nghĩ đầu tiên của tôi là tạo một nhiệm vụ để xử lý phần đầu tiên của việc đăng ký, triển khai và thử nghiệm, sau đó đặt env.hosts cho nửa thứ hai của các máy chủ, nhưng tôi cảm thấy điều này có vẻ hơi hokey.

Có ai đã mô hình hóa một cái gì đó tương tự như vậy với Fabric trước đây không?

+0

Từ expe hạn chế của tôi rience with Fabric, nghe có vẻ giống như những gì bạn muốn làm. Cách duy nhất tôi nghĩ rằng đó là hokey là nếu bạn muốn làm một số lựa chọn ngẫu nhiên của 5 hộp. –

+0

Như một cách khác, 'ansible' làm một cái gì đó như thế này ra khỏi hộp. Đáng xem: http://docs.ansible.com/guide_rolling_upgrade.html#the-rolling-upgrade –

Trả lời

5

Bạn có thể đơn giản hóa điều này bằng cách xác định vai trò (được sử dụng để tổng hợp máy chủ) và thực hiện nhiệm vụ của bạn trên một vai trò, sau đó chạy thử nghiệm và triển khai vai trò thứ hai.

Ví dụ về roledefs:

env.roledefs = { 
    'first_half': ['host1', 'host2'], 
    'second_half': ['host3', 'host4'], 
} 

def deploy_server(): 
    ... 
    # deploy one host from current role here 

def deploy(): 
    # first role: 
    env.roles = ['first_half'] 
    execute('deploy_server') 
    test() # here test deployed servers 
    # second role: 
    env.roles = ['second_half'] 
    execute('deploy_server') 

Thêm liên kết:

+0

chỉ vì tò mò, tại sao bạn sử dụng 'execute' vs gọi' deploy_server' trực tiếp – MattoTodd

+0

Ngoài ra, bạn đang sử dụng thực thi sai ở đó. Bạn cho nó một nhiệm vụ như một hàm được truyền, không phải là một chuỗi với tên của nó. Điều đó và thực hiện có thể có vai trò: thực thi (deploy_server, roles = ['first_half']) – Morgan

+1

@Morgan: Không chính xác. Vui lòng xem liên kết tài liệu mà tôi đã đưa vào câu trả lời ban đầu. 'execute' chấp nhận cả tên gọi và tên tác vụ (chuỗi). Tuy nhiên, bạn có quyền về khả năng thiết lập các vai trò cần được thực hiện trên (cũng thấy điều này trong tài liệu). – Tadeck

0

Vải không được thiết lập để chạy các tác vụ tương tự trên tất cả máy chủ.

Ngoài thực tế là bạn có thể thiết lập một cách rõ ràng các host cho một nhiệm vụ cụ thể với các tham số dòng lệnh -H, bạn có thể sử dụng this mẫu và this mới mô hình để thực hiện chính xác những gì bạn muốn.

Cập nhật: Here nó cho thấy làm thế nào bạn có thể sử dụng roles

+0

vì vải sử dụng env.hosts theo mặc định, làm cách nào để bạn chỉ định vai trò cụ thể trong một trong các tác vụ của mình? – MattoTodd

+0

Tôi đã cập nhật câu trả lời của mình. – rantanplan

+0

danke schon !!!! – MattoTodd

-1

Thay vì can thiệp với env.hosts, bạn có thể vượt qua một danh sách (hoặc bất kỳ iterable) để đội chủ nhà trang trí. Một cái gì đó như:

def deploy(half_my_hosts): 
    @hosts(half_my_hosts) 
    def mytask(): 
     # ... 
    mytask() 

Sau đó, bạn có thể chia env.hosts của bạn trong bất kỳ cách nào bạn thích và vượt qua nó để triển khai()

+0

hiện tại đang thực thi() cho các nhiệm vụ phụ và có thông số máy chủ. – Morgan

+0

Ah, cảm ơn, tốt để biết. Đó chắc chắn là một giải pháp sạch hơn. – spinlok

3

Bạn muốn sử dụng các chức năng execute(). Điều này sẽ cho phép bạn làm điều gì đó như thế này:

def update(): 
    deallocate() 
    push_code() 
    smoke_test() #could fail fast 
    reallocate() 

def deploy(): 
    execute(update, hosts=first_five) 
    execute(update, hosts=last_five) 

Bạn cũng có thể làm cho mỗi người trong số các deallocate, push_code, và smoke_test, nhiệm vụ một thực() cuộc gọi trong triển khai, và sau đó bạn muốn chạy tất cả các deallocates sau đó chạy tất cả các mã đẩy, v.v.

Sau đó, kiểm tra một số loại và sau đó tiếp tục với những người khác đang chạy tác vụ đã nói.

1

Tôi đã kết hợp thành công Fabric với boto. Tôi điền danh sách máy chủ bằng boto. Bạn có thể sử dụng trang trí @parallel để giới hạn số lượng máy chủ để thực thi trong một lần. Lệnh này trông như sau;

fab running deploy

Mã trông như vậy;

@task 
@runs_once 
def running(): 
    ec2conn = ec2.connect_to_region(region) 
    reservations = ec2conn.get_all_instances(filters={'instance-state-name': 'running'}) 
    instances = list(chain.from_iterable(map(lambda r: r.instances, reservations))) 
    env.hosts = list(chain.from_iterable(map(lambda i: i.public_dns_name, instances))) 

@task 
@parallel(pool_size=5) 
def deploy(): 
    # do stuff on n<=5 hosts in parallel 

Nếu bạn cần xử lý một phần phụ của máy chủ, tôi khuyên bạn nên sử dụng thẻ.

+0

lưu ý ngẫu nhiên: bạn phải cẩn thận không tái sử dụng cùng một đối tượng kết nối ec2 trong các tác vụ song song, vì boto không phải là chủ đề an toàn (đó là một câu hỏi nhận thức luận cho dù thư viện python đã cho là "thread safe") có nghĩa là boto được biết là vỡ khi sử dụng theo cách này) – jberryman

0

Hoặc bạn chỉ có thể viết một phương pháp mà đặt ra một số biến, ví dụ:

def live(): 
    global PATH, ENV_PATH 
    env.hosts = ["22.2.222.2"] 
    env.user = 'test' 
    PATH = '/path/to/project' 
    # optional, is using virtualenv 
    ENV_PATH = '/path/to/virtualenv' 
    # overwri 

te bất cứ điều gì variabled bạn cần thay đổi trên máy hiện tại

và trước khi chạy lệnh triển khai, chạy:

fab live deploy 

chi tiết: http://simionbaws.ro/programming/deploy-with-fabric-on-multiple-servers/

Các vấn đề liên quan