Skip To Content

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

Muchas organizaciones utilizan entornos de desarrollo, preparación y producción independientes para mantener la calidad de sus sitios web. Cuando se utilizan en su organización de ArcGIS Enterprise, estos entornos se configuran a menudo de la siguiente manera:

  • Desarrollo: se trata de un entorno aislado en el que puede probar sus aplicaciones y servicios sin que ello afecte a su entorno de desarrollo. Normalmente, el entorno de desarrollo se ejecuta en un pequeño equipo, desconectado del entorno ArcGIS Enterprise de producción. Una vez validados los cambios en el entorno de desarrollo, se aplican al entorno provisional.
  • Provisional: este entorno es un clon u otra aproximación del entorno de producción. Se utiliza un entorno provisional para crear y probar Aplicaciones de Valor Añadido y cachés de mapas, realizar pruebas de aceptación del usuario, rendimiento y carga de otro software de terceros, preparar nuevas actualizaciones de datos comerciales y llevar a cabo actividades de formación. Las pruebas a este nivel dan lugar a la decisión de aplicar los cambios en el entorno de producción o rechazarlos y esperar una nueva iteración del entorno de desarrollo. El sitio provisional solo se utiliza para realizar pruebas funcionales y de rendimiento, pero no para desarrollo. Esri proporciona licencias provisionales para ArcGIS Enterprise a un precio menor que las licencia de producción.
  • Producción: en este entorno no se lleva a cabo ningún tipo de desarrollo o prueba, ya que pueden acceder a él los usuarios del SIG (y, en algunos casos, el público en general). En el sitio de producción se aplican únicamente los cambios que han pasado el control de las pruebas en el sitio provisional.

Lo ideal es que los entornos de desarrollo, provisional y de producción utilicen bases de datos e infraestructuras diferentes. Cada organización tiene sus propias reglas respecto a cómo se prueban y aprueban los cambios en los entornos.

Trasladar un cambio de un entorno a otro puede suponer un reto logístico. En este tema de ayuda se ofrecen patrones y scripts para guiarle en el proceso, tanto si su sitio de ArcGIS Server está federado con un portal como si es independiente.

Nota:

En este tema se analizan las consideraciones para ArcGIS Server en los entornos de desarrollo, provisional y de producción. No se habla de otros componentes de ArcGIS Enterprise.

Configurar cada entorno

En cada entorno, instale ArcGIS Server, cree un sitio y configure la seguridad, las extensiones de objetos del servidor (SOE) y otros ajustes. La mayoría de estas tareas son más rápidas si se realizan manualmente, aunque también se pueden automatizar con un script.

Ponga a funcionar primero su sitio de desarrollo y cree el sitio provisional, seguido por el sitio de producción.

Implementar servicios

La clave para implementar servicios en múltiples entornos es registrar correctamente sus carpetas y bases de datos en ArcGIS Server y utilizar definiciones de servicio (SD) para su publicación.

Registrar carpetas y bases de datos en ArcGIS Server

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

  • La ruta del publicador es la ruta de datos en el equipo que se utilizará para crear los archivos SD. La ruta del publicador es siempre la misma cuando se registra un elemento en los servidores de desarrollo, provisional y de producción.
  • La ruta del servidor es la ruta de datos en el servidor. Esta ruta puede variar cuando se registra un elemento en los servidores de desarrollo, provisional y de producción.

Si tiene muchas carpetas de datos o bases de datos que registrar, puede plantearse utilizar scripts.

Servicios de publicación

Utilice los archivos SD cuando implemente sus servicios en varios entornos. El SD toma la información necesaria para publicar un servicio y la empaqueta en un archivo. Aunque es posible empaquetar los datos del SIG en el SD, probablemente le resulte más fácil precargar los datos en cada entorno y utilizar la función de réplica para mantenerlos sincronizados.

Cree archivos SD de conexión neutra (seleccione la opción No hay conexión disponible en el asistente Guardar una definición de servicio) para que sean lo suficientemente flexibles como para ser publicados en cualquier servidor. Cuando se publica un archivo SD, ArcGIS Server corrige automáticamente las rutas escritas en el SD para que se utilicen las rutas de su servidor. Un registro minucioso de los datos le permitirá implementar el mismo archivo SD en varios entornos.

La publicación de servicios es una tarea muy adecuada para crear scripts. Puede utilizar la función Cargar definición del servicio de ArcPy para crear un script que publicará cada SD.

Los archivos SD se implementan en los diferentes entornos mediante un script.

Después de desplegar sus servicios desde los SD, deben habilitarse las extensiones requeridas por los servicios. Puede hacerse manualmente o mediante scripts.

Otra tarea que se puede realizar mediante scripts es aplicar permisos a varios servicios, como se indica en un archivo de texto.

Actualizar servicios

A veces es posible que desee actualizar un servicio para utilizar nuevas propiedades o reflejar los cambios en el documento de origen. La forma recomendada de actualizar un servicio en varios entornos es guardar un nuevo archivo SD, eliminar el servicio y publicar el SD actualizado.

Cuando se adopta esta estrategia, el mismo script de ejemplo utilizado anteriormente para la publicación también puede realizar actualizaciones de servicio. Basta con modificar el archivo de entrada para incluir solo los servicios que se quieren actualizar. Si se detecta un servicio existente, el script lo elimina antes de cargar el SD.

Después de actualizar un servicio de este modo, se deben volver a habilitar los SOE utilizados por el servicio.

Como alternativa, puede realizar scripts en las propiedades del servicio (pero no el mapa ni el documento de origen) utilizando el API REST de ArcGIS.

Mantener los datos en sincronía

Asegúrese de que sus datos se mantienen sincronizados en sus distintos entornos. La replicación de la geodatabase puede ser de gran ayuda en este sentido. También se puede sustituir por completo el dataset antiguo por uno nuevo. Por ejemplo, se puede eliminar una geodatabase de archivos y sustituirla por una geodatabase de archivos actualizada.

Si decide reemplazar completamente las tablas o las geodatabases de archivos, recuerde que los servicios de ArcGIS Server bloquean de forma predeterminada los esquemas de los datasets subyacentes. Si el esquema está bloqueado, debe detener su servicio para poder reemplazar los datos. Con cierto grado de precaución, puede deshabilitar el bloqueo de esquema en los servicios de mapas, pero no puede deshabilitarlo para otros tipos de servicios.

Actualizar aplicaciones

Para transferir una aplicación entre los entornos de desarrollo, provisional y de producción, copie los archivos de la aplicación de un sitio al otro y actualice las direcciones URL de los servicios web en su código para que apunten al nuevo sitio. Utilice los archivos de configuración para definir las URL de sus servicios.

El siguiente script le ayuda a actualizar las URL en su código. El código busca recursivamente archivos en una carpeta proporcionada, busca una cadena de caracteres en particular como http://myDevServer/arcgis, y la reemplaza por la ubicación del sitio de presentación o producción, como http://myProdServer/arcgis.

Antes de iniciar este script, haga una copia de seguridad de los archivos originales de la aplicación. Tenga en cuenta también que el script le permite especificar la extensión de los archivos de texto que desea procesar, por ejemplo, .js y .html para los archivos de ArcGIS API for JavaScript.

Una vez que haya reemplazado las direcciones URL con el script, copie los archivos de la aplicación en el siguiente servidor del flujo de trabajo (provisional o de 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