lunes, 31 de marzo de 2014

Cocinando un entorno de desarrollo de Oracle BPM Suite con Chef en 8 minutos!

Situación

Luego de haber instalado Oracle SOA y BPM una y otra vez, empiezas a darte cuenta que estas tareas son repetitivas y no generan gran valor al solo ser el paso inicial para construir una aplicaciones SOA y BPM.

En este post voy a presentar los pasos para automatizar estos procedimientos haciendo uso de Chef. Chef es una herramienta de provisionamiento de software que nos va a permitir transformar infraestructura en código.

Objetivos


El objetivo de este post es preparar un entorno de desarrollo de Oracle BPM Suite con los siguientes componentes:
- Oracle WebLogic Server 10.3.6
- Oracle SOA Suite 11.1.1.7 (SOA, BPM y BAM)
- Dominio de BPM con un servidor que incluye SOA, BPM y EM, y otro servidor con BAM (opcional)

Similar a lo realizado en mi post anterior: goo.gl/nGZsTS pero automatizado :-)

Solución

Chef

Chef, como su nombre da a entender, permite la creación de "Libros de Comida" que incluyen "Recetas". Cada "Recetas" incluye un conjunto de procedimientos llamados "Recursos". Esto "Recursos" son los elementos más básicos. Representan la suma de un Componente y un Estado deseado, por ejemplo:

Literal:
Se requiere que el servicio de Apache HTTP se encuentre iniciado.


Chef:
 service "apache" do  
  action :start  
 end  

Luego, como un cocinero, podemos combinar estas recetas para "cocinar" nuestra infraestructura. A estas ejecuciones se les llama "lista de ejecución".

Chef cuenta con dos tipos de enfoques, "Cliente/Servidor" y "Solo". Para un enfoque de Cliente/Servidor se puede utilizar la infraestructura en la nube de Opscode, o tener una instalación propia del servidor. El cliente de Chef contiene los ejecutables para conectarse e interactuar con el servidor y para funcionar de forma autónoma, "Solo". En este post utilizaremos el método "Solo".

Así como Chef, existen herramientas muy buenas como Puppet y Ansible que permiten realizar provisionamiento.

Requisitos

  • JDK 1.7 instalado
  • Oracle XE (o Enterprise Edition) instalado
  • Esquemas SOA/BPM creados con RCU
  • Chef Client

Pasos

Con Chef he creado las recetas para instalar dos productos: Oracle WebLogic Server y Oracle SOA Suite, y una receta adicional para crear un dominio de desarrollo.

Estructura de Directorio de Chef

Luego de instalar el cliente de Chef se puede utilizar el utilitario "Knife" para crear la estructura de directorio de los Cookbooks:

Por ejemplo para crear el cookbook de dominios de Fusion Middleware, se puede utilizar el siguiente comando:


Las carpetas principales son:

  • recipes: donde se encuentran las recetas
  • attributes: donde están los los atributos y propiedades utilizadas en las recetas.
  • templates: plantillas para generar documentos de forma dinámica desde las recetas.

Cookbooks

Para este post, he creado 3 cookbooks:


  • oracle-weblogic: Incluye recetas sobre instalación y configuración de Oracle WebLogic Server.
  • oracle-soa-suite: lo mismo para Oracle SOA Suite
  • oracle-fmw-domain: incluye recetas para crear dominios con los distintos productos de Oracle Fusion Middleware.

Recetas

Cada Cookbook puede tener varias recetas. Por ejemplo, en el cookbook de WebLogic, puedes tener una receta para instalar la versión 10.3.5, otra receta para instalar la versión 10.3.6, otra para configurar el parche 10.3.6.0.7, y así sucesivamente.

Para nuestro caso, he creado las siguientes recetas:

  • oracle-weblogic::install-wls-10.3.6: Cookbook: oracle-weblogic, Receta: install-wls-10.3.6. Como su nombre lo indica, la receta es para instalar la versión 10.3.6 de WebLogic Server.
  • oracle-soa-suite::install-soa-11.1.1.7: Instala la última versión de SOA Suite.
  • oracle-fmw-domain::create-domain-soabpm-dev: Crea un dominio de SOA y BPM para desarrollo.
Estas recetas están probadas en Windows 8 y Windows 7.

Vayamos a revisar el código de las recetas para luego probarlo y tener listo nuestro entorno de desarrollo para aplicaciones compuestas.

Recurso: Template

Los Templates nos permite crear nuevos archivos basados en plantillas. Por ejemplo: Para instalar WebLogic en modo silencioso, se necesita de un archivo XML que contenga la información de las ubicaciones donde se instalará el producto.

Podemos crear una plantilla como esta:
 <bea-installer>   
    <input-fields>  
     <data-value name="BEAHOME" value="<%= @middleware_home %>" />  
     <data-value name="WLS_INSTALL_DIR" value="<%= @weblogic_home %>" />  
     <data-value name="COMPONENT_PATHS"  
     value="WebLogic Server/Core Application Server|WebLogic Server/Administration Console|WebLogic Server/Configuration Wizard and Upgrade Framework|WebLogic Server/Web 2.0 HTTP Pub-Sub Server|WebLogic Server/WebLogic SCA|WebLogic Server/WebLogic JDBC Drivers|WebLogic Server/Third Party JDBC Drivers|WebLogic Server/WebLogic Server Clients|WebLogic Server/WebLogic Web Server Plugins|WebLogic Server/UDDI and Xquery Support|WebLogic Server/Server Examples|Oracle Coherence/Coherence Product Files" />  
     <data-value name="INSTALL_NODE_MANAGER_SERVICE" value="false" />  
     <data-value name="NODEMGR_PORT" value="5559" />  
     <data-value name="INSTALL_SHORTCUT_IN_ALL_USERS_FOLDER" value="false"/>  
        <data-value name="LOCAL_JVMS" value="<%= @java_home %>"/>  
   </input-fields>   
 </bea-installer>  

Donde cada <%= @variable %> va a ser reemplazada con los datos de la receta:

 template weblogic_response do  
      source "weblogic_response.erb"  
      rights :full_control, user  
      variables({  
           :middleware_home => node["wls_installation"]["middleware_home"],  
           :weblogic_home => node["wls_installation"]["weblogic_home"],  
           :java_home => node["wls_installation"]["java_home"]  
      })  
 end  

Y a su vez, estos valores provienen de los archivos de atributos:
 default["wls_installation"]["middleware_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7"  
 default["wls_installation"]["weblogic_home"] = node["wls_installation"]["middleware_home"] + "/wlserver_10.3"  
 default["wls_installation"]["java_home"] = "C:/oracle/java/jdk1.7.0_51"  

Recurso: Execute

Otro recurso importante es Execute que permite ejecutar comandos en el sistema operativo. Por ejemplo: los comandos para iniciar una instalación, o ejecutar algún script.
 # Install script  
 run_command = node["soa_installation"]["soa_tmp_dir"] + "/Disk1/install/win64/setup.exe -jreLoc " + node["soa_installation"]["java_home"] + " -silent -response " + oracle_soa_response  
 ##  
 # Run installer  
 ##  
 execute run_command do  
      action :run  
      not_if do   
           FileTest.directory?(node["soa_installation"]["oracle_soa_home"])   
      end  
 end  

Aquí, se define el comando que inicia la instalación de Oracle SOA Suite "run_command" y lo ejecuta, siempre y cuando no exista el directorio de Oracle SOA dentro del Middleware Home.
De esta manera se han implementado todos los pasos para la instalación de un dominio de SOA y BPM para desarrollo, como se creo de forma manual en mi anterior post.

Ejecución 

Para ejecutar la instalación, primero se debe tener instalado Chef Client y los requisitos definidos anteriormente.
Luego se deben revisar si los atributos concuerdan con nuestro entorno y las necesidades de nuestro entorno.
Para esto, primero entremos al Cookbook de WebLogic y revisemos los atributos:

 # User who installs the software  
 default["wls_installation"]["user"] = "JEQO"  
 # Where weblogic would be installed  
 default["wls_installation"]["directories"] = [  
      "C:/u01",  
      "C:/u01/oracle",  
      "C:/u01/oracle/fmw",  
      "C:/u01/oracle/fmw/soabpm",  
      "C:/u01/oracle/fmw/soabpm/11.1.1.7",  
      "C:/u01/oracle/fmw/soabpm/11.1.1.7/tmp"  
 ]  
 # Oracle Homes  
 default["wls_installation"]["middleware_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7"  
 default["wls_installation"]["weblogic_home"] = node["wls_installation"]["middleware_home"] + "/wlserver_10.3"  
 default["wls_installation"]["java_home"] = "C:/oracle/java/jdk1.7.0_51"  
 # WebLogic installer http://download.oracle.com/otn/nt/middleware/11g/wls/1036/wls1036_generic.jar  
 default["wls_installation"]["installer"] = "C:/oracle/fmw/installers/wls/wls1036_generic.jar"  

Primero esta definido el usuario que realiza la instalación, luego los directorios de instalación, y finalmente la ruta del instalador de WebLogic.

Ahora revisemos los atributos de la instalación de SOA:

 # Oracle Homes  
 default["soa_installation"]["middleware_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7"  
 default["soa_installation"]["oracle_soa_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7/oracle_soa"  
 default["soa_installation"]["java_home"] = "C:/oracle/java/jdk1.7.0_51"  
 default["soa_installation"]["soa_tmp_dir"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7/tmp/soa"  
 default["soa_installation"]["directories"] = [  
      "C:/u01",  
      "C:/u01/oracle",  
      "C:/u01/oracle/fmw",  
      "C:/u01/oracle/fmw/soabpm",  
      "C:/u01/oracle/fmw/soabpm/11.1.1.7",  
      "C:/u01/oracle/fmw/soabpm/11.1.1.7/tmp",  
      "C:/u01/oracle/fmw/soabpm/11.1.1.7/tmp/soa"  
 ]  
 # Installers. http://www.oracle.com/technetwork/middleware/bpm/downloads/index.html  
 default["soa_installation"]["installer_zips"] = [  
      "C:/oracle/fmw/installers/soa/ofm_soa_generic_11.1.1.7.0_disk1_1of2.zip",  
      "C:/oracle/fmw/installers/soa/ofm_soa_generic_11.1.1.7.0_disk1_2of2.zip"  
 ]  
 # User who installs the software  
 default["soa_installation"]["user"] = "JEQO"  

Casi lo mismo, carpetas, instaladores y usuario.

Para los atributos de creación del dominio si se requiere un poco más de información:


 # Oracle Homes  
 default["fmw_domain"]["middleware_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7"  
 default["fmw_domain"]["oracle_common_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7/oracle_common"
 default["fmw_domain"]["oracle_soa_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7/oracle_soa"
 default["fmw_domain"]["weblogic_home"] = "C:/u01/oracle/fmw/soabpm/11.1.1.7/wlserver_10.3"  
 default["fmw_domain"]["java_home"] = "C:/oracle/java/jdk1.7.0_51"  
 # BPM server  
 default["fmw_domain"]["bpm_server_name"] = "bpm_server01"  
 default["fmw_domain"]["bpm_server_port"] = 7001  
 # Domain info  
 default["fmw_domain"]["domain_name"] = "dev_soabpm_domain"  
 default["fmw_domain"]["domain_directory"] = "C:/u01/oracle/work/soabpm/11.1.1.7/domains"  
 default["fmw_domain"]["app_directory"] = "C:/u01/oracle/work/soabpm/11.1.1.7/apps"  
 # Metadata schemas  
 default["fmw_domain"]["db_host"] = "localhost"  
 default["fmw_domain"]["db_port"] = 1521  
 default["fmw_domain"]["db_service"] = "xe"  
 default["fmw_domain"]["db_schema_prefix"] = "DEVBPM"  
 # BAM?  
 default["fmw_domain"]["bam_enabled"] = true  
 # User  
 default["fmw_domain"]["user"] = "JEQO"  


Agregar la información de los Homes de Oracle, los datos del dominio, de los esquemas creados con RCU. Se está considerando el usuario administrador: "weblogic" con password: "welcome1". También aquí se define si se requiere o no un servidor de BAM.

Por ultimo, validar que tenemos los ejecutables de Chef-Client en nuestro PATH para ejecutar el script "install_soabpm.cmd" que contiene el siguiente comando:

 chef-solo -c solo.rb -j node_soabpm.json  

Donde solo.rb contiene parámetros básicos de Chef, y el archivo JSON contiene el "run list" de recetas a ejecutar:

 {  
      "run_list": [   
           "recipe[oracle-weblogic::install-wls-10.3.6]",   
           "recipe[oracle-soa-suite::install-soa-11.1.1.7]",  
           "recipe[oracle-fmw-domain::create-domain-soabpm-dev]"  
      ]  
 }  

Para ejecutar la instalación, simplemente abran una línea de comandos en Windows como Administrador y ejecuten el comando install_soabpm.cmd:

.
.
.
.


Conclusiones

Con herramientas como Chef o Puppet que provisionan software, y Vagrant que provisiona máquinas virtuales, es posible automatizar casi todas las tareas de instalación y configuración, trasladando conocimiento en código reutilizable y mejorable en el tiempo.
Pruébenlo y disfruten del tiempo libre mientras su entorno de desarrollo se va creando.

Gracias a Edwin Biemond por los recursos de Puppet compartidos en GitHub, fueron de gran utilidad!

Recursos

El código fuente esta publicado en GitHub: https://github.com/jeqo/cookbooks
Los mejores recursos que he encontrado para aprender Chef están en https://learnchef.opscode.com/

Sería genial automatizar también la instalación del JDK 7 y Oracle XE, tal vez para un próximo post.

Dejenme saber sus comentarios!

English version: sysco.no/blogg/oracle-soa-bpm-chef-windows/