jueves, 8 de febrero de 2018

Crear Oracle Standby 12c usando Vagrant/Ansible en Windows 10

Este es otro ejemplo de cómo crear rápidamente y de forma automatizada un ambiente de pruebas Oracle con Vagrant y Ansible. En un post anterior mostraba como crear un RAC de dos nodos en windows 7, y en este vamos a ver como crear y configurar Oracle 12c con dataguard (un server primario y otro standby).

Otra vez voy a usar el repositorio de oravirt, que hizo un gran laburo y tiene varios repos con distintas configurationes, reusando la mayor parte del código.

Incluyo en este artículo todos los ajustes que tuve que hacer por usarlo en Windows 10.
Seguramente no sean necesarios si tratan de hacer esta misma instalación en un host linux.

Actualicé todas las versiones en mi PC desde el post anterior al usar RAC.
Ahora tengo:
    Microsoft Windows [Version 10.0.16299.192]
    (c) 2017 Microsoft Corporation. All rights reserved.

    D:\GitHub> git --version
    git version 2.11.0.windows.3

    D:\GitHub> VBoxManage --version
    5.2.6r120293

    D:\GitHub> vagrant --version
    Vagrant 2.0.1

Pasos a seguir:

1) Instalar el repositorio


oravirt tiene varios repositorios preconfigurados para distintos escenarios.
Me interesa crear Oracle single instance usando ASM, para luego configurar dataguard con dos máquinas. Así que el repo indicado es vagrant-vbox-si-asm.

Para instalarlo:

    D:\github> git clone --recursive https://github.com/oravirt/vagrant-vbox-si-asm
    Cloning into 'vagrant-vbox-si-asm'...
    remote: Counting objects: 87, done.
    remote: Total 87 (delta 0), reused 0 (delta 0), pack-reused 87
    Unpacking objects: 100% (87/87), done.
    Submodule 'extra-provision/ansible-oracle' (https://github.com/oravirt/ansible-oracle.git) registered for path 'extra-provision/ansible-oracle'
    Cloning into 'D:/GitHub/vagrant-vbox-si-asm/extra-provision/ansible-oracle'...
    remote: Counting objects: 2464, done.
    remote: Total 2464 (delta 0), reused 0 (delta 0), pack-reused 2464
    Receiving objects: 100% (2464/2464), 581.92 KiB | 320.00 KiB/s, done.
    Resolving deltas: 100% (1210/1210), done.
    Submodule path 'extra-provision/ansible-oracle': checked out '852ca12ad5f8025761529c19315b4e7198250740'


2) Ajustes a los archivos de configuracion


Se necesitan ajustes menores a la configuración por defecto de este repo para crear un entorno standby: queremos dos VMs y connectividad entre ellas.
Siempre hay que poner las versiones de Oracle y OS que queremos usar.
En este ejemplo me interesa probar Oracle 12.1.0.2 y Oracle Enterprise Linux 6.8

Los archivos y código a modificar son:

  • \vagrant-vbox-si-asm\hosts.yml

        basename_vm: ora12c-si-asm-oel68
        num_vm: 2
        base_priv_ip: 172.16.56.30                   # (esto es una IP arbiraria)

  • \vagrant-vbox-si-asm\extra-provision\ansible-oracle\group_vars

        oracle_install_version_gi: 12.1.0.2
        oracle_version_db: 12.1.0.2           

Esto es todo lo necesario para mi prueba.
Se pueden cambiar más cosas, como por ejemplo: nombre y cantidad de diskgroups, IPs, claves de usuarios root y oracle, etc.
Todo está muy bien documentado en el repositorio, tanto en el readme como en cada archivo de configuración.

3) Copiar archivos de instalación de Oracle


En el directorio \vagrant-vbox-si-asm\swrepo se deben copiar los archivos de instalación de Oracle para la versión que queremos instalar.
Estos archivos se bajan de OTN, previo registro gratuito.

    D:\GitHub\vagrant-vbox-si-asm\swrepo>dir
     Volume in drive D is externo
     Volume Serial Number is 88CD-FFE4

     Directory of D:\GitHub\vagrant-vbox-si-asm\swrepo

    01/20/2018  09:36 PM              .
    01/20/2018  09:36 PM              ..
    01/20/2018  09:36 PM                 0 .keep
    01/20/2018  07:07 PM     1,151,304,589 p13390677_112040_Linux-x86-64_2of7.zip
    01/20/2018  07:08 PM     1,205,251,894 p13390677_112040_Linux-x86-64_3of7.zip
    01/20/2018  07:07 PM     1,395,582,860 p13390677_112040_Linux-x86-64_1of7.zip
    07/29/2016  09:48 PM     1,747,021,273 linuxamd64_12102_grid_1of2.zip
    07/29/2016  11:28 PM       646,969,279 linuxamd64_12102_grid_2of2.zip
    07/29/2016  09:35 PM     1,673,519,571 linuxamd64_12102_database_1of2.zip
    07/29/2016  09:27 PM     1,014,527,110 linuxamd64_12102_database_2of2.zip
                   8 File(s)  8,834,176,576 bytes
                   2 Dir(s)  378,020,823,040 bytes free


Como ven tengo Oracle 11.2.0.4 y 12.1.0.2, pero en este artículo vamos a usar sólo los archivos de 12.1.0.2.

4) Ajustes para prevenir errores


Los problemas que siguen me dieron al intentar ejecutar el paso 5.
Acá me estoy adelantando y les digo como resolverlos, así pueden hacer los ajustes antes de empezar y ahorrase problemas.

a) lvol.py


El primer intento de crear las VMs me dio este error:

TASK [orahost : filesystem | create lv] ****************************************
    An exception occurred during task execution. To see the full traceback, use -vvv. The error was: SyntaxError: invalid syntax
    fatal: [ora12c-si-asm-oel681]: FAILED! => {"failed": true, "msg": "Unexpected failure during module execution.", "stdout": ""}
            to retry, use: --limit @/vagrant/ansible-oracle/vbox-si-asm-install.retry

    PLAY RECAP *********************************************************************
    ora12c-si-asm-oel681                    : ok=13   changed=11   unreachable=0    failed=1

    Ansible failed to complete successfully. Any error output should be
    visible above. Please fix these errors and try again.

Reporté el problema y tuve pronta respuesta de Mickael, el creador del repositorio. Pero el error no pudo ser reproducido usando versiones similares. Así que es posible que no le pase a todos.
Despues de investigar un poco, esto era causado por el archivo lvol.py incluido en el directorio library de este repo.

La solución en mi caso fue borrar el archivo \vagrant-vbox-si-asm\extra-provision\ansible-oracle\library\lvol.py.

b) variables de ambiente


Otro problema fue que el paso de provisioning no se ejecutaba.

El comando 'vagrant up' terminaba sin instalar el software, y 'vagrant provision' tampoco hacía nada.

    D:\GitHub\vagrant-vbox-si-asm> set setup=true
    D:\GitHub\vagrant-vbox-si-asm> vagrant provision
    ==> ora12c-si-asm-oel681: Running provisioner: ansible_local...
    Vagrant has automatically selected the compatibility mode '2.0'
    according to the Ansible version installed (2.2.1.0).

    Alternatively, the compatibility mode can be specified in your Vagrantfile:
    https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mode
        ora12c-si-asm-oel681: Running ansible-playbook...

    PLAY [all] *********************************************************************

    TASK [setup] *******************************************************************
    ok: [ora12c-si-asm-oel681]

    TASK [init : Install packages] *************************************************
    ok: [ora12c-si-asm-oel681] => (item=[u'ntp', u'dnsmasq'])

    TASK [init : Make sure ntp is running] *****************************************
    ok: [ora12c-si-asm-oel681]

    TASK [init : Generate /etc/hosts] **********************************************
    ok: [ora12c-si-asm-oel681]

    TASK [init : Generate /etc/resolv.conf] ****************************************
    ok: [ora12c-si-asm-oel681]

    TASK [init : Generate dnsmasq config] ******************************************
    ok: [ora12c-si-asm-oel681]

    TASK [init : Start and enable dnsmasq] *****************************************
    ok: [ora12c-si-asm-oel681]

    PLAY RECAP *********************************************************************
    ora12c-si-asm-oel681                   : ok=7    changed=0    unreachable=0    failed=0
   
    D:\GitHub\vagrant-vbox-si-asm>

El problema es con Vagrant usando variables de ambiente en Windows 10, ya que en otras versiones de Windows se ha probado y funciona bien.
Este error me dio con Powershell y cmd.

Lo arreglé comentado el código que valida la variable para decidir si ejecutar el provisionamiento, así lo ejecute siempre.
Hay que tener este cambio presente si volvemos a ejecutar y no queremos que haga provisioning. No es nuestro caso, yo siempre que tuve problemas borre y empecé de nuevo, así que siempre lo necesité.

Estas son las dos líneas a modificar en el archivo Vagrantfile (notar el agregado del # al principio para comentar el código):

    (line 166)    #            if provisioning and ENV['setup'] == 'true'
    ...
    (line 190)    #            end # end provisioning

5) Ahora sí, creando nuestro ambiente


Luego de los dos cambios anteriores, un solo comando crea las VM, las configura e instala el software:

    D:\github\vagrant-vbox-si-asm> vagrant up
    Bringing machine 'ora12c-si-asm-oel681' up with 'virtualbox' provider...
    ==> ora12c-si-asm-oel681: Box 'oravirt/ol68' could not be found. Attempting to find and install...
        ora12c-si-asm-oel681: Box Provider: virtualbox
        ora12c-si-asm-oel681: Box Version: >= 0
    ==> ora12c-si-asm-oel681: Loading metadata for box 'oravirt/ol68'
        ora12c-si-asm-oel681: URL: https://vagrantcloud.com/oravirt/ol68
    ==> ora12c-si-asm-oel681: Adding box 'oravirt/ol68' (v20170418) for provider: virtualbox
        ora12c-si-asm-oel681: Downloading: https://vagrantcloud.com/oravirt/boxes/ol68/versions/20170418/providers/virtualbox.box
        ora12c-si-asm-oel681:
    ==> ora12c-si-asm-oel681: Successfully added box 'oravirt/ol68' (v20170418) for 'virtualbox'!
    ==> ora12c-si-asm-oel681: Importing base box 'oravirt/ol68'...
    ...

Notar que la primera ejecución descarga la imagen del SO a usar, de 968Mb.
El tamaño cmabia según la versión de SO que hayan elegido.

Si tenemos que ejecutar el mismo comando (luego de corregir algún error) sólo se valida que la imagen ya exista y se reusa.

    D:\GitHub\vagrant-vbox-si-asm> vagrant up
    Bringing machine 'ora12c-si-asm-oel681' up with 'virtualbox' provider...
    ==> ora12c-si-asm-oel681: Importing base box 'oravirt/ol68'...

Volviendo a la ejecución original: tomó un par de horas completar la instalación en mi máquina (Intel i7, 16Gb RAM, HD 1Tb). Este tiempo varía si usan un disco SSD.

El output es largo, así son las líneas finales si anduvo todo bien:
...
PLAY RECAP *********************************************************************
ora12c-si-asm-oel681            : ok=109  changed=77   unreachable=0    failed=0
ora12c-si-asm-oel682            : ok=109  changed=77   unreachable=0    failed=0


6) Conectando a las VM


Esta es la parte fácil, si todo anduvo bien las VM estan corriendo y con el software instalado:

    D:\GitHub\vagrant-vbox-si-asm> vagrant box list
    kikitux/oracle6-racattack (virtualbox, 16.01.01)
    oravirt/ol68              (virtualbox, 20170418)

    D:\GitHub\vagrant-vbox-si-asm> vagrant ssh ora12c-si-asm-oel681
    Last login: Wed Jan 24 15:56:58 2018 from 192.168.9.70

    ----------------------------------------
    Welcome to ora12c-si-asm-oel681
    OracleLinux 6.8 x86_64

    FQDN: ora12c-si-asm-oel681.internal.lab
    IP:   10.0.2.15

    Processor: Intel(R) Core(TM) i7-4600M CPU @ 2.90GHz
    #CPU's:    1
    Memory:    3254 MB
    Kernel:    4.1.12-37.4.1.el6uek.x86_64

    ----------------------------------------
    [vagrant@ora12c-si-asm-oel681 ~]$ ps -eaf | grep pmon
    oracle   15488     1  0 15:46 ?        00:00:04 ora_pmon_orclcdb
    oracle   24473     1  0 14:03 ?        00:00:04 asm_pmon_+ASM
    vagrant  27939 27921  0 21:22 pts/0    00:00:00 grep pmon

En caso de necesitar recrear el ambiente para hacer ajustes en los scripts, se pueden borrar cada VM con un comando:

  D:\github\vagrant-vbox-si-asm> vagrant destroy ora12c-si-asm-oel681
        ora12c-si-asm-oel681: Are you sure you want to destroy the 'ora12c-si-asm-oel681' VM? [y/N] y
    ==> ora12c-si-asm-oel681: Destroying VM and associated drives...


7) Configurar la base standby


Este paso lo hice manual, ya que ambas VMs quedaron configuradas iguales con una base Oracle corriendo de nombre orcldb, y no hay repositorios todavía con un playbook de ansible para hacer esta configuración.

Son varios pasos extra, así que lo dejo para el próximo post para mantener ambos de fácil referencia



Resumen


Si no necesitan instalar distintas versiones de forma frecuente, y ya saben como instalar todo de forma manual, hacer todo este proceso la primera vez les puede llevar el mismo tiempo.

El valor de este procedimiento es que hace todo con un solo comando, y una vez que estamos familiarizados con la configuración, crear ambientes a medida es muy simple, libre de errores, y rápido.