Comment nous nous sommes fait des amis dans l'infrastructure bancaire à l'aide de ManageIQ

Il y a quelques années, les principales tendances étaient l'automatisation, les pratiques DevOps et l'accélération de la livraison de valeurs sur le marché. Home Credit Bank a décidé de suivre le rythme et de se diriger vers le développement technologique, d'autant plus que le murmure ouvert d'utilisateurs fatigués d'attendre plusieurs jours pour attendre de nouvelles ressources pour leurs importants projets se répandait plus fort sur l'espace ouvert.


Nous avons décidé de commencer par le processus d'approbation des demandes par les départements, ce qui, comme dans de nombreuses grandes entreprises, a nécessité du temps et des efforts. Comme première tâche, nous avons choisi le processus de création d'une machine virtuelle quel que soit l'environnement de virtualisation. En dressant une liste de tâches, nous avons réalisé qu'il serait nécessaire de s'intégrer à d'autres systèmes utilisés dans l'infrastructure de notre banque, par exemple, via l'API.


image


La solution la plus appropriée était ManageIQ . Il s'agit d'un projet que Red Hat a acquis en 2012 et sur la base de celui-ci a créé le produit commercial Red Hat CloudForms . Dans le même temps, ManageIQ est resté dans le statut de produit open source et se développe en parallèle avec CloudForms.


ManageIQ est écrit en Ruby et prend en charge un grand nombre de fournisseurs différents de virtualisation, de clouds publics et de conteneurisation. Pour le moment, nous utilisons une version de Gaprindashvili en configuration haute disponibilité dans Home.


Comment le processus a changé


Auparavant, chaque équipe avait besoin de paramètres distincts dans son domaine de responsabilité. Après une préparation préliminaire, toutes les données ont été collectées et envoyées à l'administrateur, qui a déployé et configuré la machine virtuelle. Il a ensuite fallu informer, par exemple, l'équipe de surveillance qu'un nouvel hôte était apparu et qu'il fallait l'ajouter à la surveillance. Les retards de communication, la charge de travail des spécialistes, les erreurs dues au facteur humain, pourraient étirer ce processus à plusieurs jours.


Après avoir intégré l'ensemble du processus dans ManageIQ, nous avons obtenu les résultats suivants:


Type de ressource virtuelleAvant de présenter ManageIQAprès avoir implémenté ManageIQ
Machine virtuelle Linux dans VMware / oVirtÀ un~ 10 minutes
Environnement de machine virtuelle Ranchertravail~ 15 minutes
Machine virtuelle Windows dans VMwaresemaines~ 25 minutes

La différence de temps est due au fait que dans le second cas, un temps supplémentaire est nécessaire pour préparer l'hôte à travailler avec Docker, télécharger et intégrer des images pour les conteneurs d'infrastructure d'Artifactory, car à ce stade, il n'y a toujours pas accès au Docker Hub. Dans le cas de Windows, la différence est obtenue du fait que, tout d'abord, le temps de création d'une machine virtuelle Linux sans personnalisation est d'environ 2 minutes, et celui d'une machine virtuelle Windows est de 6 minutes. Deuxièmement, la personnalisation de Windows lui-même prend environ 10 minutes, contre 2 minutes pour Linux.


10 minutes n'est pas si rapide, étant donné qu'environ 2-3 minutes sont consacrées directement au processus de création d'une machine virtuelle. Pour le temps restant, ManageIQ parvient à effectuer les opérations suivantes:


  1. Le système collecte les paramètres spécifiés par l'utilisateur dans le bon de commande et les décompose en variables.
  2. Une nouvelle demande de modification est créée dans le système de gestion des incidents, qui affiche des données sur la nouvelle ressource.
  3. Le système de requête de nom de ressource ManageIQ envoie une valeur pour une nouvelle ressource.
  4. Le système de gestion des adresses IP émet une nouvelle adresse en fonction des paramètres saisis.
  5. Un nouvel enregistrement DNS est enregistré sur le serveur DNS local.
  6. En fonction des paramètres, de l'environnement et de la charge des ressources, le type de virtualisation et le cluster à placer sont sélectionnés.
  7. Ensuite, le processus de création d'une machine virtuelle avec les paramètres spécifiés.
  8. Lorsque la machine virtuelle est déployée à partir du modèle, vous devez exécuter des scripts qui définiront les paramètres finaux:
    • extension du disque à une taille spécifiée,
    • générer un nouveau mot de passe root, le changer sur un hôte Linux et écrire dans un gestionnaire de mots de passe,
    • créer un fichier de configuration YAML pour Puppet dans GitLab,
    • exécuter des runbooks qui apportent les paramètres et les mises à jour nécessaires pour les machines virtuelles Windows ou
    • lancez Puppet, qui mettra à jour et configurera les machines Linux.
  9. Après tout cela, la demande de changement créée à l'étape 2 est fermée. De nouvelles données y sont ajoutées, telles que l'adresse IP et le nom d'hôte.
  10. Une nouvelle unité est enregistrée dans la base de gestion des ressources de calcul (CMDB).
  11. La machine virtuelle est enregistrée dans Zabbix et ajoutée à la surveillance.
  12. Le client et les autres parties intéressées reçoivent un e-mail contenant des informations sur la nouvelle unité créée à l'aide de ManageIQ.

À l'intérieur


Explorons les détails techniques du produit. Par défaut, ManageIQ peut créer une machine virtuelle à partir d'un modèle. En quoi cela diffère-t-il de ce que nous faisons, par exemple, dans vCenter? La bonne réponse n'est rien. ManageIQ utilise les mêmes méthodes que les systèmes de virtualisation, mais le fait à partir d'un seul endroit. En plus de cela, vous pouvez ajouter vos propres scripts qui ne correspondent pas à l'ensemble de fonctionnalités standard. Ainsi, si vous avez des ressources, par exemple, dans Azure public, dans vCenter, qui est déployé sur votre propre matériel, plus le cluster Kubernetes tourne ailleurs, alors tout cela peut être facilement géré à partir de ManageIQ.


En plus d'une grande variété de fournisseurs d'intégration, ManageIQ dispose d'outils pratiques de personnalisation. Cela, par exemple, en créant des formulaires pratiques pour résoudre votre problème:



Grâce à cela, il a été possible de construire une interface à part entière pour commander une machine virtuelle, en y intégrant tous les paramètres nécessaires:



Nous sélectionnons la quantité de ressources informatiques, OS, remplissons toutes les informations supplémentaires nécessaires à l'intégration avec des systèmes externes. De plus, en utilisant des mécanismes internes (à leur sujet un peu plus tard), le système choisit où les nouvelles ressources seront placées: le centre de données, le cluster, l'hôte et le magasin de données sont sélectionnés en fonction de tous les paramètres saisis et les ressources sont chargées.


N'oubliez pas que les gens peuvent commander trop de ressources ou pas du tout ce dont ils ont vraiment besoin. Ici, le système de demandes et de confirmations entre en jeu:



Toutes les ressources commandées par l'utilisateur doivent être approuvées par la personne responsable. Dans Home, un groupe d'architectes le fait.


Structure d'automatisation


Si vous décomposez tous les processus d'automatisation dans ManageIQ en petites parties, vous remarquerez une certaine structure.


Automatiser le domaine



Le magasin de données héberge tous les domaines de ManageIQ.


Par défaut, il existe un domaine ManageIQ, qui est verrouillé et ressemble à un modèle de référence. Si vous devez apporter des modifications, un autre domaine est créé, dans lequel les éléments du domaine ManageIQ sont copiés et modifiés pour vos propres tâches.


Automatiser l'espace de noms



À l'intérieur, les domaines sont divisés en parties responsables des processus individuels: il peut s'agir de la section responsable de la gestion de l'infrastructure (Infrastructure) ou de l'utilisation des services (Service). Nous avons notre propre espace de noms, qui contient tout ce qui concerne les systèmes de la banque.


Examinez la structure plus en détail à l'aide de l'exemple du processus d'approvisionnement pour une nouvelle machine virtuelle. Il est décrit dans la classe Automate appelée VMProvision_VM .


Automatiser la classe


La classe a une structure qui comprend des instances , des méthodes , des propriétés et un schéma . Du point de vue de l'automatisation, Schema présente le plus d'intérêt:


La disposition est similaire au pipeline dans les systèmes CI / CD. Il décrit les étapes qui seront effectuées dans le processus d'automatisation.


Automatiser l'instance



La classe décrite ci-dessus a deux instances d'automatisation. Chacun d'eux hérite du circuit des étapes pour lesquelles la valeur par défaut est définie. Les étapes qui ont des valeurs nulles sont décrites dans l'instance.



Dans l'instance, des valeurs sont apparues pour les étapes qui étaient vides dans la description du schéma. Vous pouvez également voir qui et quand avez effectué la dernière modification.


Voyons ce que représente l'une des valeurs Value:


Il s'agit d'une classe Automate appelée Méthodes, qui possède une instance Automate. Son diagramme décrit l'attribut ipam_base_uri et la méthode d' exécution . La méthode d'exécution, à son tour, appelle la méthode Automate acquérir_ip .


Automatiser la méthode


Il s'agit d'un script Ruby qui permet à une machine virtuelle de communiquer via l'API REST avec d'autres systèmes. Par exemple, comme c'est le cas avec le système de gestion de l'espace d'adressage IPAM. Dans IPAM, nous obtenons l'adresse, le masque, le sous-réseau et le VLAN pour la machine virtuelle. La difficulté est que la machine peut être déployée dans un environnement de test ou productive, pour des applications ou des bases de données. Ou peut-être que le service de sécurité a décidé de le placer dans la boucle PCI-DSS. Toutes ces informations sont collectées au stade de la création de la VM ou transmises dans les paramètres de l'instance appelée (dans la capture d'écran ci-dessus, vous pouvez voir que le paramètre contient l'URI par lequel la méthode accède à IPAM):


Voici du code 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 est une méthode qui renvoie tout ce qui peut être stocké dans ManageIQ. Il peut s'agir d'informations sur l'utilisateur, l'environnement, les variables, la requête en cours ('miq_request'), etc. Nous sommes intéressés par le processus de fourniture actuel.


Ensuite, nous pouvons récupérer les valeurs nécessaires: get_option (: site) récupère la valeur qui a été transférée à l'une des étapes précédentes, et, par exemple, get_option (: dialog_dropdown_list_information_system) récupère à partir du formulaire que l'utilisateur remplit lors de la commande de nouvelles ressources.
Toutes les valeurs reçues sont transmises par des variables dans le corps de la requête au format 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, } 

En utilisant cet ensemble de paramètres, IPAM déterminera sans ambiguïté dans quel VLAN la machine virtuelle doit être située et renverra les paramètres réseau.


En plus d'obtenir des données pour la configuration de machine virtuelle correcte, ManageIQ peut également générer des informations supplémentaires afin de définir certains paramètres au stade de ce que l'on appelle le post-approvisionnement (après le déploiement et le lancement de la machine virtuelle). Dans Home, nous utilisons Puppet pour gérer les configurations d'hôte Linux. Pour chaque unité informatique, créez un fichier GAML en YAML avec un ensemble de groupes:


Un peu plus de code 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 

Les groupes dépendent du type de machine virtuelle, de l'environnement dans lequel elle est créée et du système d'information.



Une fois la procédure terminée avec succès, l'utilisateur reçoit un e-mail contenant des informations:


Le texte de la lettre peut également être ajusté en ajoutant les informations nécessaires.
Si une erreur se produit à l'une des étapes critiques du processus, vous pouvez ajouter une condition qui indique explicitement que le processus doit être interrompu. Si l'erreur n'a pas de conséquences fatales, indiquez également ce qui peut être poursuivi malgré le problème.


Journalisation


ManageIQ écrit des journaux de tout ce qui peut être suivi. Le processus d'automatisation est écrit dans automation.log. En outre, il existe des journaux d'API, divers fournisseurs de cloud, des journaux de sécurité, même la sortie de la commande supérieure est enregistrée.


Pour chaque événement du circuit, vous pouvez configurer une entrée de journal de leur début et de leur fin:


De plus, vous pouvez écrire vos messages dans les journaux:


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

Ceci est très utile lors de l'accès aux systèmes par API pour comprendre pourquoi quelque chose s'est mal passé. Ou, pour suivre l'état actuel d'un long processus, tel que l'exécution d'un travail Jenkins ou du Runbook SCCM:


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

Vous pouvez utiliser les fonctions standard des exceptions pour écrire dans les journaux:


 raise “VM not specified” if vm.nil? 

Par défaut, tous les journaux sont stockés dans la section / var / log / manageiq / *, mais d'après ma propre expérience, je peux dire que rechercher un problème via tail et grep n'est pas la solution la plus pratique. Étant donné que ManageIQ écrit de nombreux journaux différents, vous devez prendre soin de rediriger les journaux, par exemple, vers la pile ELK.


API ManageIQ


En plus d'une interface Web conviviale, ManageIQ dispose d'une API fonctionnelle. Avec lui, par exemple, nous avons résolu le problème de la détermination dynamique de l'identifiant du modèle à spécifier


lors de la création d'une 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 

En utilisant une requête POST et en spécifiant des filtres pour la recherche, nous obtenons le modèle souhaité.
En plus de résoudre des problèmes internes, vous pouvez créer de nouvelles méthodes API à utiliser par des systèmes externes. Au début de l'article, le processus de commande d'une nouvelle machine virtuelle à l'aide de l'interface Web a été montré. Et voici à quoi ça ressemble si vous le faites avec


Demande 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": "-" } }' 

Conclusion


Avantages:


  • Flexibilité incroyable: ManageIQ vous permet non seulement de personnaliser le processus d'automatisation selon vos besoins, mais permet également de changer sa partie visuelle en ajoutant des boutons, des champs, etc.
  • Éditeur de code intégré avec mise en évidence de la syntaxe et validation du code. Cela m'a semblé une très bonne solution, si vous avez besoin de réparer rapidement quelque chose.
  • Un grand nombre de sources avec lesquelles le système peut fonctionner. Clouds: Amazon EC2, Google Compute Engine, Azure, OpenStack, VMware vCloud. Infrastructure: Microsoft SCVMM, OpenStack Platform Director, Red Hat Virtualization, VMware vCenter. Conteneurs: Kubernetes, OpenShift.

Inconvénients:


  • Les grandes capacités de l'outil comportent également un point négatif. Toute la documentation n'est pas bien structurée et il est parfois difficile de savoir où chercher ce dont vous avez besoin. Cependant, il convient de noter que la situation évolue pour le mieux, la documentation est complétée et améliorée.
  • Petite communauté. Si vous rencontrez un problème très spécifique, vous ne pourrez peut-être pas rapidement "google" la réponse. Ou pas du tout réussir.
  • Un paragraphe qui découle des deux précédents. Certaines choses de base, paramètres et scénarios peuvent être trouvés dans la documentation ou sur Internet, mais des questions plus spécifiques et plus étroites ont nécessité beaucoup de temps pour comprendre et étudier, y compris la méthode de piquer scientifique: sourire:.

Comme nous l'avons maintenant:


Étant donné que ManageIQ peut tirer pleinement parti du langage Ruby, nous avons pu l'intégrer pour qu'il fonctionne avec les API suivantes:


  • Gestionnaire de mots de passe Il génère un mot de passe root conformément aux exigences du service de sécurité, l'écrit dans sa base de données et ManageIQ l'utilise dans le système d'exploitation;
  • Services Service Center Orchestration pour la gestion des enregistrements DNS et des noms d'hôte;
  • BMC Remedy. L'ensemble du processus est enregistré sous forme de commentaires sur la demande. Après une exécution réussie, la demande est fermée;
  • CMDB Des informations sur les nouvelles unités de configuration sont créées dans la base de données avec toutes les données nécessaires.
  • Zabbix Selon l'affiliation au système d'information et à l'environnement, des hôtes sont ajoutés aux groupes de surveillance correspondants.
  • Rancher. Implémentation de la création de nouveaux environnements, l'installation d'agents et l'enregistrement des hôtes dans les environnements existants.
  • Jenkins Jenkins exécute des travaux pour configurer les machines virtuelles dans oVirt;
  • LDAP Créez de nouveaux groupes qui sont utilisés pour contrôler l'accès dans les environnements Rancher et pour configurer les stratégies dans Vault;
  • Vault Chez Home, l'intégration de ce produit dans les processus bancaires vient de commencer, mais nous avons déjà élaboré des méthodes pour créer de nouveaux groupes, politiques et sections de stockage;
  • Puppet et IPAM ont été mentionnés précédemment.

Les fonctionnalités et les capacités du système sont très étendues, et je me suis familiarisé avec bon nombre d'entre elles et continue de me familiariser avec le processus de mise en œuvre du système.
Par exemple, je n'ai pas mentionné que le système a la possibilité de créer vos propres tableaux de bord avec des statistiques, des paramètres de facturation ou des boutons, auxquels vous pouvez attacher des scripts individuels ou des scripts entiers. Vous pouvez ajouter vos propres champs pour enregistrer des informations supplémentaires sur les services et les machines virtuelles, etc.


Ce que Home s'efforce de faire:


  • Une mise à niveau vers la version Hammer, dans laquelle en mode HA, vous pouvez essayer de travailler avec Ansible intégré.
  • Le passage de la coordination de chaque unité de ressources virtuelles à la gestion. Les équipes pourront recevoir de nouvelles VM encore plus rapidement si le quota n'est pas épuisé.
  • Développement de nouvelles méthodes pour la fourniture ultérieure à des systèmes externes.
  • Par exemple, divers SaaS comme jenkins, logstash, etc.
  • Implémentation de nouvelles méthodes API dans un portail existant pour les propriétaires de systèmes d'information. Les utilisateurs n'auront pas besoin de réfléchir à la manière de s'intégrer au nouvel élément d'infrastructure, ils l'utiliseront simplement comme un service pour obtenir de nouvelles ressources ou modifier celles existantes.

À la toute fin, je voudrais vous rappeler que les outils sont excellents, mais n'oubliez pas l'importance de l'interaction entre les différentes équipes. Les changements décrits dans l'article n'auraient pas été possibles sans une communication bien établie et une interaction constante sur les questions émergentes de toutes les parties intéressées.

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


All Articles