5

Tôi đang viết Trình bao bọc đầu bếp xung quanh một số sách dạy nấu ăn OpsWorks được tích hợp sẵn. Tôi đang sử dụng Berkshelf để sao chép các sách dạy nấu ăn OpsWorks từ repo github của họ.Làm thế nào để bạn giả lập các dịch vụ/phụ thuộc cụ thể của OpsWorks khi phát triển cục bộ với Nhà bếp và Đầu bếp?

Đây là Berksfile tôi:

source 'https://supermarket.getchef.com' 

metadata 

def opsworks_cookbook(name) 
    cookbook name, github: 'aws/opsworks-cookbooks', branch: 'release-chef-11.10', rel: name 
end 

%w(dependencies scm_helper mod_php5_apache2 ssh_users opsworks_agent_monit 
    opsworks_java gem_support opsworks_commons opsworks_initial_setup 
    opsworks_nodejs opsworks_aws_flow_ruby 
    deploy mysql memcached).each do |cb| 
    opsworks_cookbook cb 
end 

metadata.rb của tôi:

depends 'deploy' 
depends 'mysql' 
depends 'memcached' 

Vấn đề là, khi tôi cố gắng để ghi đè các thuộc tính phụ thuộc vào các opsworks then chốt trong node băm, tôi get a:

NoMethodError 
------------- 
undefined method `[]=' for nil:NilClass 

OpsWorks có toàn bộ phụ thuộc trước công thức mà tạo ra các phím và làm rất nhiều thiết lập của họ. Tôi muốn tìm cách để kéo vào các dịch vụ đó và chạy chúng chống lại các trường hợp Bếp của tôi hoặc thử chúng theo cách mà tôi có thể thực sự kiểm tra công thức nấu ăn của tôi.

Có cách nào để thực hiện việc này không?

Trả lời

0

Bạn sẽ phải thực hiện thủ công. Bạn có thể thêm các thuộc tính tùy ý vào .kitchen.yml, chỉ cần truy cập vào máy tính OpsWorks và ghi lại các giá trị bạn cần và sử dụng trực tiếp hoặc điều chỉnh chúng thành dữ liệu thử nghiệm khả thi.

+0

Điều đó vẫn không thực sự giải quyết vấn đề thử nghiệm đối với công thức nấu ăn phụ thuộc vào công thức nấu ăn được xây dựng của Amazon. Bạn có gợi ý rằng tôi sử dụng Berkshelf để kéo tất cả các công thức nấu ăn của OpsWorks, chạy chúng, sau đó chạy công thức nấu ăn của tôi? Nếu tôi muốn, ví dụ, cài đặt 'mysql :: client' yêu cầu' nút [: opsworks] [: lớp] [: db-master] 'hoặc' nút [: opsworks] [: stack] [: rds_instances] [i] [: engine] == 'mysql''? Tôi hiểu cách chạy các công thức nấu ăn này, nhưng làm cách nào để kiểm tra chúng bằng cách sử dụng cookspec? – davepgreene

+1

Có, Berksfile hiện tại của bạn là chính xác như xa như kéo trong sách dạy nấu ăn phù hợp. ChefSpec chỉ là thử nghiệm đơn vị nên các phụ thuộc không nên quan trọng, nhưng bạn sẽ làm điều tương tự như với Test Kitchen với dữ liệu nút được đóng hộp. – coderanger

+1

Tôi hiểu. Tôi đánh dấu đây là câu trả lời vì bạn đã chỉ cho tôi đúng hướng. Cảm ơn! – davepgreene

3

Tôi rất muốn giới thiệu bạn hãy kiểm tra bài viết trên blog Mike Greiling của Simplify OpsWorks Development With Packer và repo github mình opsworks-vmđó giúp bạn để thử toàn bộ opsworks ngăn xếp bao gồm các cài đặt của đại lý opsworks vì vậy bạn cũng có thể ứng dụng thử nghiệm triển khai công thức nấu ăn, nhiều lớp, nhiều phiên bản cùng một lúc, v.v.. Nó cực kỳ ấn tượng.

Quick Start trên Ubuntu 14.04

Chú ý: Đây có thể KHÔNG được thực hiện từ một máy ảo ubuntu vì VirtualBox không hỗ trợ ảo hóa lồng nhau của các máy 64-bit.

  1. Install ChefDK
    1. mkdir /tmp/packages && cd /tmp/packages
    2. wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.8.1-1_amd64.deb
    3. sudo dpkg -i chefdk_0.8.0-1_amd64.deb
    4. cd /opt/chefdk/
    5. chef verify
    6. which ruby
    7. echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile && source ~/.bash_profile
  2. Install VirtualBox
    1. echo 'deb http://download.virtualbox.org/virtualbox/debian vivid contrib' > /etc/apt/sources.list.d/virtualbox.list
    2. wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
    3. sudo apt-get update -qqy
    4. sudo apt-get install virtualbox-5.0 dkms
  3. Install 01.
    1. cd /tmp/packages
    2. wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.deb
    3. sudo dpkg -i vagrant_1.7.4_x86_64.deb
    4. vagrant plugin install vagrant-berkshelf
    5. vagrant plugin install vagrant-omnibus
    6. vagrant plugin list
  4. Install Packer
    1. mkdir /opt/packer && cd /opt/packer
    2. wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_linux_amd64.zip
    3. unzip packer_0.8.6_linux_amd64.zip
    4. echo 'PATH=$PATH:/opt/packer' >> ~/.bash_profile && source ~/.bash_profile
  5. xây dựng hình ảnh opsworks-vm VirtualBox Mike Greiling bằng cách sử dụng Packer
    1. mkdir ~/packer && cd ~/packer
    2. git clone https://github.com/pixelcog/opsworks-vm.git
    3. cd opsworks-vm
    4. rake build install
    5. này sẽ cài đặt một máy ảo VirtualBox mới tới ~/.vagrant.d/hộp/ubuntu1404-opsworks/

Để thử một opsworks trường hợp duy nhất, tạo ra một Vagrantfile mới như vậy:

Vagrant.configure("2") do |config| 
    config.vm.box = "ubuntu1404-opsworks" 
    config.vm.provision :opsworks, type: 'shell', args: 'path/to/dna.json' 
end 

Đường dẫn dna.json tập tin được thiết lập tương đối so với Vagrantfile và nên chứa bất kỳ dữ liệu JSON nào bạn muốn gửi tới OpsWorks Chef.

Ví dụ:

{ 
    "deploy": { 
    "my-app": { 
     "application_type": "php", 
     "scm": { 
     "scm_type": "git", 
     "repository": "path/to/my-app" 
     } 
    } 
    }, 
    "opsworks_custom_cookbooks": { 
    "enabled": true, 
    "scm": { 
     "repository": "path/to/my-cookbooks" 
    }, 
    "recipes": [ 
     "recipe[opsworks_initial_setup]", 
     "recipe[dependencies]", 
     "recipe[mod_php5_apache2]", 
     "recipe[deploy::default]", 
     "recipe[deploy::php]", 
     "recipe[my_custom_cookbook::configure]" 
    ] 
    } 
} 

Để thử nhiều opsworks trường và bao gồm các lớp thấy AWS OpsWorks "Getting Started" Example mình trong đó bao gồm các stack.json dưới đây.

Vagrantfile (đối với nhiều trường hợp)

Vagrant.configure("2") do |config| 

    config.vm.box = "ubuntu1404-opsworks" 

    # Create the php-app layer 
    config.vm.define "app" do |layer| 

    layer.vm.provision "opsworks", type:"shell", args:[ 
     'ops/dna/stack.json', 
     'ops/dna/php-app.json' 
    ] 

    # Forward port 80 so we can see our work 
    layer.vm.network "forwarded_port", guest: 80, host: 8080 
    layer.vm.network "private_network", ip: "10.10.10.10" 
    end 

    # Create the db-master layer 
    config.vm.define "db" do |layer| 

    layer.vm.provision "opsworks", type:"shell", args:[ 
     'ops/dna/stack.json', 
     'ops/dna/db-master.json' 
    ] 

    layer.vm.network "private_network", ip: "10.10.10.20" 
    end 
end 

stack.json

{ 
    "opsworks": { 
    "layers": { 
     "php-app": { 
     "instances": { 
      "php-app1": {"private-ip": "10.10.10.10"} 
     } 
     }, 
     "db-master": { 
     "instances": { 
      "db-master1": {"private-ip": "10.10.10.20"} 
     } 
     } 
    } 
    }, 
    "deploy": { 
    "simple-php": { 
     "application_type": "php", 
     "document_root": "web", 
     "scm": { 
     "scm_type": "git", 
     "repository": "dev/simple-php" 
     }, 
     "memcached": {}, 
     "database": { 
     "host": "10.10.10.20", 
     "database": "simple-php", 
     "username": "root", 
     "password": "correcthorsebatterystaple", 
     "reconnect": true 
     } 
    } 
    }, 
    "mysql": { 
    "server_root_password": "correcthorsebatterystaple", 
    "tunable": {"innodb_buffer_pool_size": "256M"} 
    }, 
    "opsworks_custom_cookbooks": { 
    "enabled": true, 
    "scm": { 
     "repository": "ops/cookbooks" 
    } 
    } 
} 

Đối với những người không quen thuộc với lang thang bạn chỉ cần làm một vagrant up để bắt đầu dụ (s). Sau đó, bạn có thể sửa đổi sách dạy nấu ăn của mình tại địa phương và bất kỳ thay đổi nào có thể được áp dụng bởi bếp trưởng chạy lại đối với (các) cá thể hiện tại với vagrant provision. Bạn có thể làm vagrant destroyvagrant up để bắt đầu từ đầu.

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