Как вы имитируете определенные службы / зависимости OpsWorks при локальной разработке с помощью Kitchen и Chef?

Я пишу Chef обертки для некоторых из встроенных кулинарных книг OpsWorks. Я использую Berkshelf для клонирования кулинарных книг OpsWorks из их репозитория на github.

Это мой Berksfile:

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:

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

Проблема в том, что когда я пытаюсь переопределить атрибуты, зависящие от ключа opsworks в хэше node, я получаю:

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

В OpsWorks есть множество зависимостей перед рецептами, которые создают эти ключи и выполняют большую часть их настройки. Я хотел бы найти способ либо задействовать эти службы и запустить их на моих экземплярах Kitchen, либо издеваться над ними таким образом, чтобы я действительно мог проверить свои рецепты.

Есть ли способ сделать это?


person davepgreene    schedule 19.09.2014    source источник


Ответы (2)


Вам придется делать это вручную. Вы можете добавлять произвольные атрибуты в свой .kitchen.yml, просто зайдите на машину OpsWorks и запишите нужные вам значения и либо используйте их напрямую, либо адаптируйте их к работоспособным тестовым данным.

person coderanger    schedule 19.09.2014
comment
Это все еще не решает проблему тестирования рецептов, которые зависят от встроенных рецептов Amazon. Вы предлагаете, чтобы я использовал Berkshelf для извлечения всех рецептов OpsWorks, запуска их, а затем выполнения моих рецептов? Что, если я хочу, например, установить mysql::client, для чего требуется node[:opsworks][:layers][:db-master] или node[:opsworks][:stack][:rds_instances][i][:engine] == 'mysql'? Я понимаю, как использовать эти рецепты, но как мне проверить их соответствие с помощью chefspec? - person davepgreene; 20.09.2014
comment
Да, ваш существующий файл Berksfile верен в том, что касается правильных кулинарных книг. ChefSpec - это просто модульное тестирование, поэтому зависимости, как правило, не имеют значения, но вы должны сделать то же самое, что и с Test Kitchen, с консервированными данными узлов. - person coderanger; 21.09.2014
comment
Я понимаю. Я отмечаю это как ответ, потому что вы указали мне правильное направление. Спасибо! - person davepgreene; 22.09.2014

Я НАСТОЯТЕЛЬНО рекомендую вам ознакомиться с сообщением в блоге Майка Грейлинга Упростите разработку OpsWorks с помощью Packer и его репозиторий github opsworks-vm , которые помогут вам издеваться над всем Стек opsworks, включая установку агента opsworks, чтобы вы также могли тестировать рецепты развертывания приложений, несколько уровней, несколько экземпляров одновременно и т. д.. Это очень впечатляет.

Быстрый старт в Ubuntu 14.04

ПРИМЕЧАНИЕ. Это НЕЛЬЗЯ сделать с виртуальной машины ubuntu, потому что virtualbox не поддерживает вложенную виртуализацию 64-битных машин.

  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 Vagrant
    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. Build Mike Greiling's opsworks-vm virtualbox image using 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. Это установит новый виртуальный ящик vm в ~ / .vagrant.d / boxs / ubuntu1404-opsworks /

Чтобы смоделировать отдельный экземпляр opsworks, создайте новый Vagrantfile следующим образом:

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

Путь к файлу dna.json устанавливается относительно Vagrantfile и должен содержать любые данные JSON, которые вы хотите отправить в OpsWorks Chef.

Например:

{
  "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]"
    ]
  }
}

Чтобы смоделировать несколько экземпляров opsworks и включить слои, см. Его пример «Приступая к работе» с AWS OpsWorks, который включает stack.json ниже.

Vagrantfile (для нескольких экземпляров)

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"
    }
  }
}

Для тех, кто не знаком с vagrant, просто выполните vagrant up, чтобы запустить экземпляр (ы). Затем вы можете изменить свою кулинарную книгу локально, и любые изменения могут быть применены, повторно запустив chef для существующих экземпляров с помощью vagrant provision.. Вы можете выполнить vagrant destroy и vagrant up, чтобы начать с нуля.

person Peter M    schedule 08.10.2015