ArcGIS Server en entornos de desarrollo, integración y producción

Muchas organizaciones utilizan entornos de desarrollo, integración y producción distintos para mantener la calidad de sus sitios Web. A continuación se muestra cómo son estos entornos cuando está implicado ArcGIS Server:

Idealmente, los entornos de desarrollo, integración y producción utilizan bases de datos e infraestructuras distintas. Cada organización tiene sus propias normas sobre cómo se prueban y aprueban los cambios en los distintos sitios.

Pasar un cambio de un sitio a otro puede plantear retos logísticos. Este tema de ayuda proporciona patrones y secuencias de comandos para guiarle por el proceso.

Configurar cada entorno

En cada entorno deberá instalar ArcGIS Server, crear un sitio y configurar la seguridad, las extensiones de objetos del servidor (SOE) y otros ajustes. La mayoría de estas tareas se realizan más rápidamente si se hacen a mano aunque se puede usar una secuencia de comandos como este Ejemplo: Crear usuarios y roles a partir de dos archivos de texto.

En primer lugar, ponga en marcha el sitio de desarrollo. A continuación, cree el sitio de integración y, después, el de producción.

Implementar servicios

La clave de la implementación de servicios en múltiples entornos es registrar las carpetas y las bases de datos correctamente en ArcGIS Server y usar definiciones de servicios (SD) para la publicación.

Registrar carpetas y bases de datos en ArcGIS Server

Al registrar una carpeta o una base de datos en ArcGIS Server, se proporciona la ruta del publicador hasta los datos y la ruta del servidor.

  • La ruta del publicador es la ruta de datos en el equipo que se vaya a usar para preparar los archivos SD. La ruta del publicador siempre es la misma al registrar un elemento en los servidores de desarrollo, integración y producción.
  • La ruta en el servidor es la ruta de los datos en el servidor. Esta ruta puede variar al registrar un elemento en los servidores de desarrollo, integración y producción.

Si tiene muchas carpetas de datos o bases de datos para registrar, puede pensar en la opción de usar secuencias de comandos. Ejemplo: Registrar carpetas y bases de datos listadas en un archivo de texto utiliza la función de ArcPy AddDataStoreItem para registrar una lista de conexiones con carpetas y bases de datos indicada en un archivo de texto. El archivo de texto se adapta a cada entorno.

Servicios de publicación

Utilice archivos SD al implementar servicios en múltiples entornos. SD toma la información necesaria para publicar un servicio y la empaqueta en un archivo cómodo de usar. Aunque es posible empaquetar los datos de SIG dentro de SD, probablemente sea más fácil realizar una carga previa de los datos en cada entorno y usar la replicación para mantenerlos sincronizados.

Cree archivos SD independientes de la conexión (seleccione la opción No hay ninguna conexión disponible en el asistente Guardar una definición del servicio) para que sean lo suficientemente flexibles como para publicarlos en cualquier servidor. Al publicar un archivo SD, ArcGIS Server corrige automáticamente las rutas escritas en el SD para que se utilicen las rutas del servidor. Así pues, con un registro cuidadoso de los datos se puede implementar el mismo archivo SD en múltiples entornos.

Publicar servicios es una tarea adecuada para usar secuencias de comandos. Ejemplo: Publicar definiciones de servicios listados en un archivo de texto lee un archivo de texto y publica todos los SD listados. La secuencia de comandos utiliza la función de ArcPy Cargar definición de servicio para publicar cada SD.

Los archivos de SD se implementan en distintos entornos mediante una secuencia de comandos.

Después de implementar los servicios de los SD, es necesario habilitar todos los SOE necesarios para los servicios. Esto se puede hacer manualmente o mediante secuencias de comandos.

Aplicar permisos es otra tarea que se puede realizar mediante secuencias de comandos. Ejemplo: Aplicar permisos desde un archivo de texto utiliza la API REST de ArcGIS para aplicar permisos a diversos servicios indicados en un archivo de texto.

Actualizar servicios

A veces tal vez quiera actualizar un servicio para usar nuevas propiedades o reflejar cambios en el documento de fuente, como un conjunto de ediciones permanentes en la simbología de un documento de ArcMap (MXD). La forma recomendada de actualizar un servicio en múltiples entornos es guardar un nuevo archivo SD y, a continuación, eliminar el servicio y publicar el SD actualizado.

De este modo, la misma secuencia de comandos que se ha utilizado anteriormente para publicar también puede realizar actualizaciones en los servicios. Basta con modificar el archivo de entrada para incluir solamente los servicios que desee actualizar. Si se encuentra un servicio existente, la secuencia de comandos lo elimina antes de cargar el SD.

Después de actualizar un servicio de este modo, es necesario rehabilitar todos los SOE que utilice el servicio.

Alternativamente se pueden realizar secuencias de comandos para actualizar propiedades de servicios (pero no el mapa ni el documento de origen) utilizando la operación Editar servicio de la API REST de ArcGIS.

Mantener los datos sincronizados

Deberá asegurarse de que los datos se mantengan sincronizados entre todos sus entornos. La replicación de geodatabases puede ayudarle en esta tarea. Alternativamente, puede sustituir el dataset antiguo completamente por uno nuevo. Por ejemplo, tal vez quiera eliminar una geodatabase de archivos y sustituirla por otra actualizada.

Si opta por sustituir completamente las tablas o las geodatabases de archivos, tenga en cuenta que los servicios de ArcGIS Server bloquean los esquemas de los datasets subyacentes de forma predeterminada. Si el esquema está bloqueado, deberá detener el servicio antes de sustituir los datos. Con cierto grado de precaución puede deshabilitar el bloqueo de esquemas en servicios de mapas, pero no se puede deshabilitar en otros tipos de servicios.

Actualizar aplicaciones

Para mover una aplicación de un entorno de desarrollo a integración y producción, se copian los archivos de la aplicación de un sitio a otro y, a continuación, se actualizan las direcciones URL de los servicios web del código para que apunten al sitio nuevo. Utilice archivos de configuración para definir las direcciones URL de los servicios.

La secuencia de comandos siguiente ayuda a actualizar las direcciones URL del código. El código busca recursivamente en los archivos de una carpeta indicada, busca una cadena de caracteres en particular como http://miServidorDeDesarrollo/arcgis, y la sustituye por la ubicación del sitio de integración o de producción, como http://miServidorDeProduccion/arcgis.

Antes de iniciar esta secuencia de comandos debería hacer copias de seguridad de los archivos originales de la aplicación. Tenga en cuenta también que la secuencia de comandos permite especificar la extensión de los archivos de texto que se desea procesar; por ejemplo, .xml para los archivos de configuración de ArcGIS Viewer for Flex , .js y .html para los archivos de ArcGIS API for JavaScript, etc.

Después de sustituir las direcciones URL con la secuencia de comandos, se pueden copiar los archivos de aplicación en el servidor siguiente del flujo de trabajo (de integración o producción).

import os
import sys
import shutil
import traceback

def dirEntries(dir_name, subdir, *args):
    '''Return a list of file names found in directory 'dir_name'
    If 'subdir' is True, recursively access subdirectories under 'dir_name'.
    Additional arguments, if any, are file extensions to match filenames. Matched
        file names are added to the list.
    If there are no additional arguments, all files found in the directory are
        added to the list.
    Example usage: fileList = dirEntries(r'H:\TEMP', False, 'txt', 'py')
        Only files with 'txt' and 'py' extensions will be added to the list.
    Example usage: fileList = dirEntries(r'H:\TEMP', True)
        All files and all the files in subdirectories under H:\TEMP will be added
        to the list.
    '''
    fileList = []
    for file in os.listdir(dir_name):
        dirfile = os.path.join(dir_name, file)
        if os.path.isfile(dirfile):
            if not args:
                fileList.append(dirfile)
            else:
                if os.path.splitext(dirfile)[1][1:] in args:
                    fileList.append(dirfile)
        # recursively access file names in subdirectories
        elif os.path.isdir(dirfile) and subdir:
            print "Accessing directory:", dirfile
            fileList.extend(dirEntries(dirfile, subdir, *args))
    return fileList

def updateString(infileName, srchString,rplString):
    bakFileName = os.path.splitext(infileName)[0] + ".bak"
    if not os.path.exists(bakFileName):
        # copy the original file
        shutil.copy(infileName, bakFileName)

    # Open the backup (= original) file to read
    inFileHndl = open(bakFileName,"r")
    outFileHndl = open(infileName,"w")  

    for line in inFileHndl:
        if line.find(searchString) > 0:
            line = line.replace(searchString, replaceString)
        outFileHndl.write(line)
        
    outFileHndl.close()
    inFileHndl.close()
    # remove the backup (=original content file)
    os.remove(bakFileName)

if __name__ == '__main__':

    try:
        inFolder = r"C:\inetpub\wwwroot\viewer"  # path to search
        searchString = "http://mydevserver"      # string to find
        replaceString = "http://mystgserver"     # string - replace searchString with replaceString
        
        fList = dirEntries(inFolder, True, 'xml')
        for f in fList:
            updateString(f, searchString, replaceString)
            
        print '\n\n\n' + 'Process Complete'

    except:
        # Return any python specific errors as well as any errors from the geoprocessor
        #
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]
        pymsg = "PYTHON ERRORS:\nTraceback Info:\n" + tbinfo + "\nError Info:\n    " + \
                str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"
        print '\n\n\n' + pymsg
5/12/2014