Muchas organizaciones utilizan entornos de desarrollo, provisional 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:
- Desarrollo: se trata de un sitio ArcGIS Server aislado para desarrollo donde puede probar libremente sus aplicaciones y servicios. Por lo general, el sitio de desarrollo se ejecuta en un equipo pequeño con la licencia de Red de desarrolladores de Esri (EDN) de ArcGIS for Server. Después de validar los cambios en el sitio de desarrollo, se aplican en el sitio provisional.
- Provisional: este sitio de ArcGIS es un clon del sitio de producción. Las pruebas a este nivel dan como resultado la decisión de aplicar los cambios en el sitio de producción o rechazarlos y esperar a una nueva iteración del sitio de desarrollo. El sitio provisional no se utiliza para desarrollo. Solo para pruebas de rendimiento y funcionalidad. Esri proporciona licencias provisionales a los usuarios de ArcGIS Server con un coste menor que las de producción.
- Producción: este es el sitio que realmente soporta los flujos de trabajo del negocio, el sitio al cual acceden los usuarios reales. En este sitio no de produce ninguna tarea de desarrollo ni de pruebas. En el sitio de producción solo se aplican cambios que hayan superado el escrutinio de las pruebas del sitio provisional.
Idealmente, los entornos de desarrollo, provisional 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, instale ArcGIS for Server, cree un sitio y configure 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 y cree el sitio provisional 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 for 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 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, provisional 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, provisional 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. Con un registro cuidadoso de los datos se puede implementar el mismo archivo SD en varios 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.
Después de implementar los servicios de los SD, habilite todas las extensiones necesarias 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 varios entornos es guardar un nuevo archivo SD, eliminar el servicio y, a continuación, 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, rehabilite 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
Asegúrese 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, recuerde que los servicios de ArcGIS for Server bloquean los esquemas de los datasets subyacentes de forma predeterminada. Si el esquema está bloqueado, detenga 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 provisional y producción, copie los archivos de la aplicación de un sitio a otro y actualice 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 provisional o de producción, como http://miServidorDeProduccion/arcgis.
Antes de iniciar esta secuencia de comandos, haga 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, .js y .html para los archivos de ArcGIS API for JavaScript.
Después de sustituir las direcciones URL con la secuencia de comandos, copie los archivos de 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