2012-01-09 18 views
6

Tôi có một ứng dụng được viết bằng PHP, MySQL, v.v. Ứng dụng có một số phụ thuộc như beanstalkd, Solr và một vài phần mở rộng PHP.Nhiều cài đặt ứng dụng của tôi - cách tôi xử lý ứng dụng

Đối với mỗi khách hàng, chúng tôi có cài đặt ứng dụng riêng biệt, trên máy chủ được chia sẻ với các khách hàng khác hoặc trên máy chủ chỉ với khách hàng đó.

Hiện tại, chúng tôi đang sử dụng tập lệnh Con rối để khởi động khách hàng mới và sau đó chúng tôi tự chuyển đến từng khách hàng để thực hiện lệnh kéo git, cập nhật db, v.v. bất cứ khi nào có thay đổi.

Những gì chúng ta đang tìm kiếm thực sự là một công cụ mà có càng nhiều các tính năng sau đây càng tốt:

  1. giao diện web cho phép chúng ta nhìn thấy tất cả các khách hàng và phiên bản hiện tại của họ
  2. Khả năng bootstrap lắp đặt mới
  3. Khả năng cập nhật cài đặt hiện có để một phiên bản cụ thể hoặc chi nhánh

chúng tôi không tìm kiếm một công cụ để bootstrap máy chủ mới - chúng tôi vẫn làm điều đó bằng tay. Thay vào đó, chúng tôi đang tìm cách tự động hóa thiết lập của khách hàng trên một máy chủ hiện có.

Đầu bếp hay con rối sẽ đủ cho việc này, có công cụ phù hợp hơn không hoặc bạn có nên giới thiệu bản thân mình?

Trả lời

10

Tôi là nhà phát triển toàn thời gian làm việc trên Puppet tại Puppet Labs. Tôi cũng là đồng tác giả của Pro Puppet.

Rối chắc chắn là đủ cho mục tiêu của bạn. Đây là một cách để giải quyết vấn đề này bằng cách sử dụng Puppet. Trước tiên, tôi sẽ giải quyết việc quản lý phụ thuộc vì chúng chỉ nên được quản lý một lần bất kể có bao nhiêu phiên bản của ứng dụng đang được quản lý. Sau đó, tôi sẽ giải quyết cách xử lý nhiều cài đặt ứng dụng của bạn bằng cách sử dụng một loại tài nguyên được xác định trong Múa rối và loại tài nguyên vcsrepo.

Đầu tiên, liên quan đến việc tổ chức mã con rối để xử lý nhiều cài đặt của cùng một ứng dụng. Các phụ thuộc mà bạn đề cập đến như beanstalkd, solr và các phần mở rộng PHP nên được mô hình hóa bằng cách sử dụng một lớp Múa rối. Lớp này sẽ được bao gồm trong danh mục cấu hình chỉ một lần, bất kể có bao nhiêu bản sao của ứng dụng được quản lý trên nút. Ví dụ về lớp học này có thể giống như sau:

# <modulepath>/site/manifests/app_dependencies.pp 
class site::app_dependencies { 
    # Make all package resources in this class default to 
    # being managed as installed on the node 
    Package { ensure => installed } 
    # Now manage the dependencies 
    package { 'php': } 
    package { 'solr': } 
    package { 'beanstalk': } 
    # The beanstalk worker queue service needs to be running 
    service { 'beanstalkd': 
    ensure => running, 
    require => Package['beanstalk'], 
    } 
} 

Bây giờ bạn có phụ thuộc vào lớp học, bạn có thể chỉ cần đưa lớp này vào nơi ứng dụng của bạn sẽ được triển khai. Điều này thường xảy ra trong tệp site.pp hoặc trong Trang tổng quan con rối nếu bạn đang sử dụng giao diện web.

# $(puppet config print confdir)/manifests/site.pp 
node www01 { 
    include site::app_dependencies 
} 

Tiếp theo, bạn cần một cách để khai báo nhiều phiên bản của ứng dụng trên hệ thống. Thật không may, không có cách nào dễ dàng để thực hiện việc này từ giao diện web ngay bây giờ nhưng có thể sử dụng tệp kê khai Rối và loại tài nguyên được xác định. Giải pháp này sử dụng tài nguyên vcsrepo để quản lý thanh toán kho git cho ứng dụng.

# <modulepath>/myapp/manifests/instance.pp 
define myapp::instance($git_rev='master') { 
    # Resource defaults. The owner and group might be the web 
    # service account instead of the root account. 
    File { 
    owner => 0, 
    group => 0, 
    mode => 0644, 
    } 
    # Create a directory for the app. The resource title will be copied 
    # into the $name variable when this resource is declared in Puppet 
    file { "/var/lib/myapp/${name}": 
    ensure => directory 
    } 
    # Check out the GIT repository at a specific version 
    vcsrepo { "/var/lib/myapp/${name}/working_copy": 
    ensure => present, 
    provider => git, 
    source => 'git://github.com/puppetlabs/facter.git', 
    revision => $git_rev, 
    } 
} 

Với điều này định nghĩa loại tài nguyên, bạn có thể khai báo nhiều bản cài đặt của ứng dụng của bạn như sau:

# $(puppet config print confdir)/manifests/site.pp 
node www01 { 
    include site::app_dependencies 
    # Our app instances always need their dependencies to be managed first. 
    Myapp::Instance { require => Class['site::app_dependencies'] } 

    # Multiple instances of the application 
    myapp::instance { 'jeff.acme.com': git_rev => 'tags/1.0.0' } 
    myapp::instance { 'josh.acme.com': git_rev => 'tags/1.0.2' } 
    myapp::instance { 'luke.acme.com': git_rev => 'tags/1.1.0' } 
    myapp::instance { 'teyo.acme.com': git_rev => 'master' } 
} 

Thật không may, không có hiện một cách dễ dàng để sử dụng ra khỏi con đường hộp để làm cho thông tin này có thể nhìn thấy từ một giao diện web. Nó chắc chắn có thể làm, tuy nhiên, bằng cách sử dụng API phân loại nút bên ngoài. Để biết thêm thông tin về kéo dữ liệu bên ngoài vào Múa rối hãy xem các nguồn lực:

Hope thông tin này giúp.

+0

Tôi đang cố gắng làm một cái gì đó rất giống nhau, sử dụng một giao diện mẫu nhà máy nhưng tôi đang có một thời gian helluva đối phó với các thư mục được chia sẻ trên các trường hợp, bạn có thể kiểm tra câu hỏi của tôi @ http://serverfault.com/questions/ 442520/con rối-có thể-để-sử dụng-phần mềm-thiết kế-mô-đun-trong-mô-đun –