Cómo nos hicimos amigos en la infraestructura bancaria usando ManageIQ

Hace un par de años, las principales tendencias fueron la automatización, las prácticas de DevOps y la aceleración de la entrega de valores al mercado. Home Credit Bank decidió mantenerse al día y se dirigió al desarrollo de la tecnología, más aún cuando el susurro abierto de los usuarios que estaban cansados ​​de esperar varios días para esperar nuevos recursos para sus importantes proyectos se extendió más en el espacio abierto.


Decidimos comenzar con el proceso de aprobación de solicitudes por departamentos, que, como en muchas grandes empresas, requería tiempo y esfuerzo. Como primera tarea, elegimos el proceso de creación de una máquina virtual independientemente del entorno de virtualización. Al hacer una lista de tareas, nos dimos cuenta de que sería necesario integrarlo con otros sistemas utilizados en la infraestructura de nuestro banco, por ejemplo, a través de API.


imagen


La solución más adecuada fue ManageIQ . Este es un proyecto que Red Hat adquirió en 2012 y basado en él creó el producto comercial Red Hat CloudForms . Al mismo tiempo, ManageIQ se mantuvo en el estado de un producto de código abierto y se está desarrollando en paralelo con CloudForms.


ManageIQ está escrito en Ruby y admite una gran cantidad de proveedores diferentes de virtualización, nubes públicas y contenedorización. Por el momento, estamos utilizando una versión de Gaprindashvili en la configuración de alta disponibilidad en el hogar.


Cómo ha cambiado el proceso


Anteriormente, cada equipo requería configuraciones separadas en su área de responsabilidad. Después de la preparación preliminar, todos los datos se recopilaron y se enviaron al administrador, quien implementó y configuró la máquina virtual. Luego fue necesario informar, por ejemplo, al equipo de monitoreo de que había aparecido un nuevo host que necesitaba ser agregado al monitoreo. Los retrasos en la comunicación, la carga de trabajo de los especialistas, los errores causados ​​por el factor humano, podrían extender este proceso a varios días.


Habiendo encajado todo el proceso en ManageIQ, obtuvimos los siguientes resultados:


Tipo de recurso virtualAntes de presentar ManageIQDespués de implementar ManageIQ
Máquina virtual Linux en VMware / oVirtA uno~ 10 minutos
Entorno de máquina virtual de ranchertrabajando~ 15 minutos
Máquina virtual de Windows en VMwaresemanas~ 25 minutos

La diferencia horaria se debe al hecho de que, en el segundo caso, se requiere tiempo adicional para preparar el host para trabajar con Docker, descargar e integrar imágenes para contenedores de infraestructura de Artifactory, porque en esta etapa todavía no hay acceso al Docker Hub. En el caso de Windows, la diferencia se logra debido al hecho de que, en primer lugar, el tiempo de creación de una VM Linux sin personalización es de aproximadamente 2 minutos, y el de una VM de Windows es de 6 minutos. En segundo lugar, la personalización de Windows en sí lleva unos 10 minutos, frente a 2 minutos para Linux.


10 minutos no es tan rápido, dado que se gastan aproximadamente 2-3 minutos directamente en el proceso de creación de una VM. Para el tiempo restante, ManageIQ logra hacer lo siguiente:


  1. El sistema recopila los parámetros especificados por el usuario en el formulario de pedido y los descompone en variables.
  2. Se crea una nueva solicitud de cambio en el sistema de gestión de incidentes, que muestra datos sobre el nuevo recurso.
  3. El sistema de consulta de nombre de recurso ManageIQ envía un valor para un nuevo recurso.
  4. El sistema de administración de direcciones IP emite una nueva dirección basada en los parámetros ingresados.
  5. Se registra un nuevo registro DNS en el servidor DNS local.
  6. Según los parámetros, el entorno y la carga de recursos, se selecciona el tipo de virtualización y el clúster para la ubicación.
  7. A continuación, el proceso de creación de una máquina virtual con los parámetros especificados.
  8. Cuando la máquina virtual se implementa desde la plantilla, debe ejecutar scripts que realizarán la configuración final:
    • expansión de disco a un tamaño especificado,
    • generar una nueva contraseña de root, cambiarla en un host de Linux y escribir en un administrador de contraseñas,
    • creando un archivo YAML de configuración para Puppet en GitLab,
    • ejecutar runbooks que traen las configuraciones y actualizaciones necesarias para máquinas virtuales de Windows o
    • inicie Puppet, que actualizará y configurará máquinas Linux.
  9. Después de todo esto, la solicitud de cambio creada en el paso 2 se cierra. Se le agregan datos nuevos, como la dirección IP y el nombre de host.
  10. Se registra una nueva unidad en la Base de administración de recursos informáticos (CMDB).
  11. La máquina virtual se registra en Zabbix y se agrega a la supervisión.
  12. El cliente y otras partes interesadas reciben un correo electrónico con información sobre la nueva unidad creada con ManageIQ.

Que hay dentro


Profundicemos en los detalles técnicos del producto. De manera predeterminada, ManageIQ puede crear una máquina virtual a partir de una plantilla. ¿Cómo difiere esto de lo que hacemos, por ejemplo, en vCenter? La respuesta correcta es nada. ManageIQ utiliza los mismos métodos que los sistemas de virtualización, pero lo hace desde un solo lugar. Además de esto, puede agregar sus propios scripts que no se ajustan al conjunto estándar de características. Por lo tanto, si tiene recursos, por ejemplo, en Azure público, en vCenter, que se implementa en su propio hardware, además de que el clúster de Kubernetes está girando en otro lugar, todo esto se puede administrar convenientemente desde ManageIQ.


Además de una amplia variedad de proveedores para la integración, ManageIQ tiene herramientas convenientes para la personalización. Esto, por ejemplo, creando formas convenientes para resolver su problema:



Gracias a esto, fue posible construir una interfaz completa para ordenar una máquina virtual, ajustando todos los parámetros necesarios en ella:



Seleccionamos la cantidad de recursos informáticos, SO, completamos toda la información adicional que se necesita para la integración con sistemas externos. Además, utilizando mecanismos internos (sobre ellos un poco más tarde), el sistema elige dónde se colocarán los nuevos recursos: el centro de datos, el clúster, el host y el almacén de datos se seleccionan en función de todos los parámetros ingresados ​​y los recursos se cargan.


No olvides que las personas pueden pedir demasiados recursos o nada de lo que realmente necesitan. Aquí entra en juego el sistema de solicitudes y confirmaciones:



Cualquier recurso solicitado por el usuario debe ser aprobado por la persona responsable. En Home, un grupo de arquitectos hace esto.


Estructura de automatización


Si descompone todos los procesos de automatización en ManageIQ en partes pequeñas, notará una cierta estructura.


Automatizar Dominio



El almacén de datos aloja todos los dominios que ManageIQ tiene.


Por defecto, hay un dominio ManageIQ, que está bloqueado y es algo así como un modelo de referencia. Si necesita realizar cambios, se crea otro dominio, en el que los elementos del dominio ManageIQ se copian y cambian para sus propias tareas.


Automatizar espacio de nombres



En el interior, los dominios se dividen en partes que son responsables de los procesos individuales: esta puede ser la sección responsable de administrar la infraestructura (Infraestructura) o de trabajar con los servicios (Servicio). Tenemos nuestro propio espacio de nombres, que contiene todo lo relacionado con los sistemas del banco.


Considere la estructura con más detalle utilizando el ejemplo del proceso de aprovisionamiento para una nueva máquina virtual. Se describe en la clase Automatizar llamada VMProvision_VM .


Automatizar clase


La clase tiene una estructura que incluye instancias , métodos , propiedades y esquema . Desde el punto de vista de la automatización, Schema es de gran interés:


El diseño es similar a la tubería en los sistemas CI / CD. Describe los pasos que se realizarán en el proceso de automatización.


Instancia automatizada



La clase descrita anteriormente tiene dos instancias de automatización. Cada uno de ellos hereda del circuito las etapas para las que se establece el Valor predeterminado . Las etapas que tienen valores nulos se describen en la instancia.



En la instancia, los valores aparecieron para los pasos que estaban vacíos en la descripción del esquema. También puede ver quién y cuándo realizó el último cambio.


Veamos qué representa uno de los valores de Valor:


Esta es una clase de automatización llamada métodos, que tiene una instancia de automatización. Su diagrama describe el atributo ipam_base_uri y el método de ejecución . El método de ejecución, a su vez, llama al Método de Automate adquirir_ip .


Método de automatización


Este es un script Ruby que permite que una máquina virtual se comunique a través de la API REST con otros sistemas. Por ejemplo, como es el caso con el sistema de gestión de espacio de direcciones IPAM. En IPAM obtenemos la dirección, la máscara, la subred y la VLAN para la VM. La dificultad es que la máquina se puede implementar en un entorno de prueba o productivo, para aplicaciones o bases de datos. O tal vez el servicio de seguridad decidió colocarlo en el bucle PCI-DSS. Toda esta información se recopila en la etapa de creación de la VM o se transmite en los parámetros de la instancia llamada (en la captura de pantalla anterior, puede ver que el parámetro contiene la uri por la cual el método accederá a IPAM):


Aquí hay un código Ruby
base_uri = $evm.object['ipam_base_uri'] prov = $evm.root["miq_provision"] site = prov.get_option(:site) app = prov.get_option(:dialog_dropdown_list_information_system) crq = prov.get_option(:crq) descr = prov.get_option(:dialog_textarea_box_usernotes) owner = $evm.root['user'].name scope = prov.get_option(:dialog_dropdown_scope) environment = prov.get_option(:landscape) 

$ evm.root es un método que devuelve todo lo que se puede almacenar en ManageIQ. Puede ser información sobre el usuario, el entorno, las variables, la solicitud actual ('miq_request'), etc. Estamos interesados ​​en el proceso de provisión actual.


A continuación, podemos recoger los valores necesarios: get_option (: site) recoge el valor que se transfirió en una de las etapas anteriores y, por ejemplo, get_option (: dialog_dropdown_list_information_system) recoge del formulario que el usuario llena al solicitar nuevos recursos.
Todos los valores recibidos son transmitidos por variables en el cuerpo de la solicitud en formato JSON:


 options = { verify: false, headers: {"Content-Type" => "application/json"}, body: { "site" => "#{site}", "env" => "#{env}", "app" => "#{app}", "scope" => "#{scope}", "role" => "#{role}", "crq" => "#{crq}", "descr" => "#{descr}", "owner" => "#{owner}", }.to_json, } 

Usando este conjunto de parámetros, IPAM determinará inequívocamente en qué VLAN debe ubicarse la máquina virtual y devolverá los parámetros de red.


Además de recibir datos para la configuración correcta de VM, ManageIQ también puede generar información adicional con el fin de realizar algunas configuraciones en la etapa del llamado aprovisionamiento posterior (después de que la máquina virtual se implemente y se inicie). En Home, utilizamos Puppet para administrar las configuraciones de host de Linux. Para cada unidad informática, cree un archivo GAML en YAML con un conjunto de grupos:


Un poco más de código Ruby
 options = { headers: {"Private-Token" => "#{api_token}", "Content-Type" => "application/json"}, } body = { "branch" => "#{branch}", "author_email" => "email@your.domain", "author_name" => "ManageIQ Bot", "content" => "", "commit_message" => "New host created by ManageIQ", } descr = prov.get_option(:long_description) if descr.include?('rancher') && descr.include?('test') then body[:content] = "---\ngroups:\n - #{yaml_server}\n - rancher\n - user-devops-UDCR" end unless descr.include?('test') then if descr.include?('rancher') then body[:content] = "---\ngroups:\n - #{yaml_server}\n - rancher\n" end end unless descr.include?('rancher') then body[:content] = "---\ngroups:\n - #{yaml_server}\n - #{$is_id}" end 

Los grupos dependen del tipo de máquina virtual, el entorno en el que se crea y el sistema de información.



Después de completar con éxito el procedimiento, el usuario recibe un correo electrónico con información:


El texto de la carta también se puede ajustar agregando la información necesaria.
Si se produce un error en cualquiera de las etapas críticas del proceso, puede agregar una condición que indique explícitamente que el proceso debe interrumpirse. Si el error no tiene consecuencias fatales, indique también qué se puede continuar, a pesar del problema.


Registro


ManageIQ escribe registros de todo lo que se puede rastrear. El proceso de automatización está escrito en automation.log. Además, hay registros de API, varios proveedores de nube, registros de seguridad, incluso se registra la salida del comando superior.


Para cada evento en el circuito, puede configurar una entrada de registro de su inicio y finalización:


Además, puede escribir sus mensajes en los registros:


 $evm.log(:info, "Call job status uri: #{item_uri}/#{job_id}/api/json") 

Esto es muy útil cuando se accede a los sistemas por API para comprender por qué algo salió mal. O, para rastrear el estado actual de un proceso largo, como ejecutar un trabajo de Jenkins o un Runbook de SCCM:


 $evm.log(:info, "acquire_osname --- naming jobStatus: #{jobStatus}") break if jobStatus.to_s == "Completed" 

Puede usar las funciones estándar para excepciones para escribir en los registros:


 raise “VM not specified” if vm.nil? 

Por defecto, todos los registros se almacenan en la sección / var / log / manageiq / *, pero desde mi propia experiencia puedo decir que buscar un problema a través de tail y grep no es la solución más conveniente. Dado que ManageIQ escribe muchos registros diferentes, debe tener cuidado de redirigir los registros, por ejemplo, a la pila ELK.


API ManageIQ


Además de una interfaz web fácil de usar, ManageIQ tiene una API funcional. Con él, por ejemplo, resolvimos el problema de determinar dinámicamente el identificador de la plantilla que se especificará


al crear una VM:
 def get_template(vendor, os, ems) user = '#{user}' pass = '#{pass}' options = { verify: false, headers: {"Accept" => "*/*", "accept-encoding" => "gzip, deflate"}, basic_auth: { username: "#{user}", password: "#{pass}" }, } response = HTTParty.get("#{host}/api/templates?filter[]=vendor=%27#{vendor}%27&filter[]=name=%27%2A#{os}%2A%27&filter[]=ems_id=%27#{ems}%27", options).to_s link = JSON.parse(response) link["resources"].each do |r| $url = r["href"] end response = HTTParty.get($url,options).to_s template = ["#{JSON.parse(response)['id']}"+", "+"#{JSON.parse(response)['name']}"] return template end 

Usando una solicitud POST y especificando filtros para la búsqueda, obtenemos la plantilla deseada.
Además de resolver problemas internos, puede crear nuevos métodos API para uso de sistemas externos. Al comienzo del artículo, se mostró el proceso de ordenar una nueva máquina virtual utilizando la interfaz web. Y así es como se ve si lo haces con


Solicitud POST:
 curl -X POST \ http://Manageiq.hostname/api/service_catalogs/4/service_templates/31 \ -H 'Authorization: Basic Token-Value' \ -H 'Content-Type: application/json' \ -d '{ "action": "order", "resource": { "radio_button_vcpu": "a_2", "radio_button_vram": "a_2", "hdd_size": "40", "dropdown_os": "CentOS", "text_box_filter": "dns", "dropdown_list_information_system": "DNS ", "text_box_validator": "OK (DNS )", "textarea_box_usernotes": " ", "dropdown_env": "production", "date_control_retirement_dt": "2022-05-21", "dropdown_scope": "-" } }' 

Conclusión


Pros:


  • Flexibilidad increíble: ManageIQ no solo le permite personalizar el proceso de automatización según lo necesite, sino que también le permite cambiar su parte visual agregando botones, campos, etc.
  • Editor de código incorporado con resaltado de sintaxis y validación de código. Me pareció una muy buena solución, si necesitas arreglar algo rápidamente.
  • Una gran cantidad de fuentes con las que el sistema puede trabajar. Nubes: Amazon EC2, Google Compute Engine, Azure, OpenStack, VMware vCloud. Infraestructura: Microsoft SCVMM, OpenStack Platform Director, Red Hat Virtualization, VMware vCenter. Contenedores: Kubernetes, OpenShift.

Contras:


  • Las grandes capacidades de la herramienta también tienen un punto negativo. No toda la documentación está bien estructurada y, a veces, es difícil determinar dónde buscar lo que necesita. Sin embargo, vale la pena señalar que la situación está cambiando para mejor, la documentación se complementa y mejora.
  • Pequeña comunidad Si encuentra algún problema muy específico, es posible que no pueda "googlear" rápidamente la respuesta. O no tener éxito en absoluto.
  • Un párrafo que se sigue de los dos anteriores. Algunas cosas básicas, configuraciones y escenarios se pueden encontrar en la documentación o en Internet, pero las preguntas más específicas y limitadas requieren mucho tiempo para comprender y estudiar, incluido el método de búsqueda científica: sonrisa:.

Como tenemos ahora:


Debido al hecho de que ManageIQ puede aprovechar al máximo el lenguaje Ruby, pudimos integrarlo para trabajar con las siguientes API:


  • Administrador de contraseñas Genera una contraseña raíz de acuerdo con los requisitos del servicio de seguridad, la escribe en su base de datos y ManageIQ la usa dentro del sistema operativo;
  • Centro de servicios Servicios de orquestación para administrar registros DNS y nombres de host;
  • Remedio BMC. Todo el proceso se registra como comentarios en la solicitud. Después de una ejecución exitosa, la solicitud se cierra;
  • CMDB La información sobre las nuevas unidades de configuración se crea en la base de datos con todos los datos necesarios.
  • Zabbix Dependiendo de la afiliación con el sistema de información y el entorno, los hosts se agregan a los grupos de monitoreo correspondientes.
  • Ranchero. Implementé la creación de nuevos entornos, la instalación de agentes y el registro de hosts en entornos existentes.
  • Jenkins Jenkins ejecuta trabajos para configurar máquinas virtuales en oVirt;
  • LDAP Cree nuevos grupos que se utilizan para controlar el acceso en entornos Rancher y para configurar políticas en Vault;
  • Bóveda En Home, la integración de este producto en los procesos bancarios acaba de comenzar, pero ya hemos creado métodos para crear nuevos grupos, políticas y secciones para el almacenamiento;
  • Puppet e IPAM se mencionaron anteriormente.

La funcionalidad y las capacidades del sistema son muy amplias, y me familiaricé con muchas de ellas y sigo familiarizándome con el proceso de implementación del sistema.
Por ejemplo, no mencioné que el sistema tiene la capacidad de crear sus propios paneles con estadísticas, configuraciones de facturación o botones, a los que puede adjuntar guiones individuales o guiones completos. Puede agregar sus propios campos para registrar información adicional sobre servicios y máquinas virtuales, etc.


Para qué se esfuerza Home:


  • Una actualización a la versión Hammer, en la que en el modo HA puede intentar trabajar con el Ansible incorporado.
  • La transición de la coordinación para cada unidad de recursos virtuales a la gestión. Los equipos podrán recibir nuevas máquinas virtuales aún más rápido si la cuota no se agota.
  • Desarrollo de nuevos métodos para su posterior suministro a sistemas externos.
  • Por ejemplo, varios SaaS como jenkins, logstash, etc.
  • Implementación de nuevos métodos API en un portal existente para propietarios de sistemas de información. Los usuarios no necesitarán pensar en cómo integrarse con el nuevo elemento de infraestructura, solo lo usarán como un servicio para obtener nuevos recursos o cambiar los existentes.

Al final, me gustaría recordarles que las herramientas son excelentes, pero no olviden la importancia de la interacción entre los diferentes equipos. Los cambios descritos en el artículo no habrían sido posibles sin una comunicación bien establecida y una interacción constante sobre temas emergentes de todas las partes interesadas.

Source: https://habr.com/ru/post/461891/


All Articles