chef - ¿Cómo está la gente probando libros de cocina opsworks?
aws-opsworks (6)
Tengo un despliegue bastante complejo de instancias configuradas dinámicamente de una aplicación ferroviaria en nginx que utiliza pasajeros para los que actualmente uso Capistrano. Estoy tratando de automatizar todo el proceso en Opsworks desde la creación de la pila, las capas, las instancias y el despliegue dinámico de aplicaciones. Ninguna de las recetas de Opsworks existentes se acerca a lo que necesito, así que comencé mis propios libros de cocina personalizados. Estoy tratando de probarlos usando Test-Kitchen y Vagrant, pero los libros de cocina de Opsworks tienen demasiadas dependencias personalizadas para ser usadas localmente. Así que parece que estoy atascado, ya sea reinventando la rueda usando solo mis propias recetas que no dependen de los libros de cocina de Opsworks o intentando probar mis libros de cocina en AWS, que es lento y costoso.
¿Alguien está haciendo algún desarrollo de libro de recetas personalizado en Opsworks y si es así, cómo lo está probando? ¿Está utilizando libros de cocina de la comunidad y, si es así, qué tan dolorosos han sido al comenzar a trabajar en Opsworks?
Al buscar en Travis-ci y sous-chef, puede encontrar esto adecuado para probar libros de cocina, etc. y también tienen una configuración de despliegue para trabajos en línea.
https://github.com/michaelklishin/sous-chef http://docs.travis-ci.com/user/deployment/opsworks/
Estamos utilizando Opsworks con una gran cantidad de libros de cocina personalizados, y vagrant también. Si bien la cobertura de prueba está lejos de ser perfecta, funciona bastante bien, y también adapta los libros de cocina de la comunidad. Nuestro repositorio de libros de cocina es público: https://github.com/till/easybib-cookbooks
Los bits interesantes de este repo son:
- Utilizamos una receta de rol como punto de entrada para cada capa en lugar de especificar varias recetas con la capa en opsworks: https://github.com/till/easybib-cookbooks/blob/master/easybib/recipes/role-nginxapp-api.rb
- Verificamos si la receta se ejecuta en AWS o en Vagrant usando una función de biblioteca personalizada: https://github.com/till/easybib-cookbooks/blob/master/easybib/libraries/easybib.rb#L208-L216
- Todos los libros de cocina / proveedores específicos de opsworks generalmente solo se utilizan en el libro de cocina de implementación, que solo incluimos cuando
is_aws
es verdadero; de lo contrario, recurrimos a una implementación de aplicación predeterminada.
Navegar por nuestros libros de cocina debería darle algunos consejos más para sus preguntas. Probamos nuestros libros de cocina con Travis y no probamos en absoluto los libros de cocina de opsworks. Aunque debo tener en cuenta que actualmente estoy jugando con algunas ideas de cómo integrarlas en nuestras pruebas, ya que sin sus proveedores, probar nuestro libro de recetas de implementación es prácticamente imposible.
Hay muchas sugerencias útiles en esta página, pero recomendaría ALTAMENTE a todos, eche un vistazo al blog de Mike Greiling Simplifique OpsWorks Development With Packer y su github repo opsworks-vm que le ayudan a burlarse de toda la pila de opsworks, incluida la instalación del agente de opsworks para que también pueda probar las recetas de implementación de la aplicación, varias capas, varias instancias al mismo tiempo, etc. Es extremadamente impresionante.
Inicio rápido en Ubuntu 14.04
NOTA: Esto NO se puede hacer desde una máquina virtual de ubuntu porque virtualbox no admite la virtualización anidada de máquinas de 64 bits.
- Instalar ChefDK
-
mkdir /tmp/packages && cd /tmp/packages
-
wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.8.1-1_amd64.deb
-
sudo dpkg -i chefdk_0.8.0-1_amd64.deb
-
cd /opt/chefdk/
-
chef verify
-
which ruby
-
echo ''eval "$(chef shell-init bash)"'' >> ~/.bash_profile && source ~/.bash_profile
-
- Instalar VirtualBox
-
echo ''deb http://download.virtualbox.org/virtualbox/debian vivid contrib'' > /etc/apt/sources.list.d/virtualbox.list
-
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
-
sudo apt-get update -qqy
-
sudo apt-get install virtualbox-5.0 dkms
-
- Instalar Vagrant
-
cd /tmp/packages
-
wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.deb
-
sudo dpkg -i vagrant_1.7.4_x86_64.deb
-
vagrant plugin install vagrant-berkshelf
-
vagrant plugin install vagrant-omnibus
-
vagrant plugin list
-
- Instala Packer
-
mkdir /opt/packer && cd /opt/packer
-
wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_linux_amd64.zip
-
unzip packer_0.8.6_linux_amd64.zip
-
echo ''PATH=$PATH:/opt/packer'' >> ~/.bash_profile && source ~/.bash_profile
-
- Cree la imagen de la opsworks-vm virtual de opsworks-vm Mike Greiling usando Packer
-
mkdir ~/packer && cd ~/packer
-
git clone https://github.com/pixelcog/opsworks-vm.git
-
cd opsworks-vm
-
rake build install
- Esto instalará un nuevo virtualbox vm en ~ / .vagrant.d / boxes / ubuntu1404-opsworks /
-
Para burlarse de una sola instancia de opsworks, cree un nuevo archivo Vagrantfile así:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu1404-opsworks"
config.vm.provision :opsworks, type: ''shell'', args: ''path/to/dna.json''
end
La dna.json
archivo dna.json
se establece en relación con el Vagrantfile y debe contener todos los datos JSON que desee enviar a OpsWorks Chef.
Por ejemplo:
{
"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]"
]
}
}
Para simular varias instancias de opsworks e incluir capas, vea su Ejemplo de "Introducción" de AWS OpsWorks que incluye el stack.json continuación.
Vagrantfile (para múltiples instancias)
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"
}
}
}
Para aquellos que no están familiarizados con vagrant, simplemente haga un vagrant up
para iniciar la (s) instancia (s). Luego, puede modificar su libro de cocina localmente y cualquier cambio puede aplicarse al volver a ejecutar chef en contra de las instancias existentes con vagrant provision.
Puedes hacer un vagrant destroy
y vagrant up
comenzar desde cero.
Los libros de cocina de Opsworks se basan en sus cajas personalizadas, por lo que obtener un VM local donde pueda ejecutar sus libros de cocina junto con el suyo es un desafío.
Afortunadamente, su caja de Ubuntu ha sido recreada por este proyecto. https://github.com/wwestenbrink/vagrant-opsworks
Sobre esta base, he creado un entorno local desagradable que ejecuta los libros de cocina de Opsworks y uno de los míos. https://github.com/erupenkman/opsworks-example
Con esto, puede probar en un entorno local casi idéntico antes de la implementación.
Opsworks ahora es compatible con Chef 11.10 y Berkshelf ( http://berkshelf.com/ ) para administrar las dependencias, lo que facilita el uso de libros de cocina personalizados. mucho. más fácil.
Estoy muy contento con Test Kitchen ( https://github.com/test-kitchen/test-kitchen ) con Vagrant & Chef Solo para las pruebas locales.
Además, puede ejecutar manualmente recetas particulares en una pila de Opsworks desde la página de configuración de la pila. Eche un vistazo aquí: http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-manual.html .
También puede ejecutar pruebas de libros de cocina durante una implementación de Opsworks con algunos JSON personalizados: http://docs.aws.amazon.com/opsworks/latest/userguide/troubleshoot-debug-test.html
Pude resolver este problema usando Chef + Kitchen + Vagrant
Aquí está mi envoltorio: https://github.com/elitechance/opsworks-cookbooks-wrapper
A continuación se muestra cómo probar
git clone https://github.com/elitechance/opsworks-cookbooks-wrapper.git
git clone https://github.com/aws/opsworks-cookbooks.git
cd opsworks-cookbooks-wrapper
cp .kitchen.sample.yml .kitchen.yml
cp Berksfile.sample Berksfile
cp metadata.sample.rb metadata.rb
El último comando simulará las recetas de instalación de OpsWorks NodeJs, consulte .kitchen.sample.yml
para obtener más información.
$ chef exec kitchen setup
Errores conocidos
La primera vez que ejecute la $ chef exec kitchen setup
, encontrará errores que dicen:
Controladores en ejecución: [2016-04-08T17: 08: 34 + 00: 00] ERROR: Ejecución de controladores de excepciones Los controladores en ejecución completan [2016-04-08T17: 08: 34 + 00: 00] ERROR: Los controladores de excepciones completaron el Cliente Chef. 43 recursos actualizados en 01 minutos 02 segundos [2016-04-08T17: 08: 34 + 00: 00] FATAL: Stacktrace descargado a /tmp/kitchen/cache/chef-stacktrace.out [2016-04-08T17: 08: 34 +00: 00] FATAL: proporcione el contenido del archivo stacktrace.out si presenta un informe de error [2016-04-08T17: 08: 34 + 00: 00] ERROR: ruby_blockFallback for remote_file [/tmp/rubygems-2.2 .2.tgz] tenía un error: NoMethodError: remote_file / tmp / rubygems-2.2.2.tgz tenía un error: NoMethodError: método indefinido `to_sym ''para [: create]: Array [2016-04-08T17: 08: 34 +00: 00] FATAL: Chef :: Excepciones :: ChildConvergeError: El proceso de ejecución del Chef salió sin éxito (código de salida 1)
Sólo ejecuta de nuevo:
$ chef exec kitchen setup