Como fizemos amigos na infraestrutura bancária usando o ManageIQ

Há alguns anos, as principais tendências eram automação, práticas de DevOps e a aceleração da entrega de valores ao mercado. O Home Credit Bank decidiu acompanhar e se encaminhar para o desenvolvimento da tecnologia, tanto mais que o sussurro aberto de usuários que estavam cansados ​​de esperar vários dias para esperar novos recursos para seus importantes projetos se espalhava mais alto no espaço aberto.


Decidimos começar com o processo de aprovação de aplicativos pelos departamentos, que, como em muitas grandes empresas, exigiam tempo e esforço. Como primeira tarefa, escolhemos o processo de criação de uma máquina virtual, independentemente do ambiente de virtualização. Ao fazer uma lista de tarefas, percebemos que seria necessário integrar-se a outros sistemas usados ​​na infraestrutura de nosso banco, por exemplo, via API.


imagem


A solução mais adequada foi o ManageIQ . Este é um projeto que a Red Hat adquiriu em 2012 e com base nele criou o produto comercial Red Hat CloudForms . Ao mesmo tempo, o ManageIQ permaneceu no status de um produto de código aberto e está desenvolvendo paralelamente ao CloudForms.


O ManageIQ é escrito em Ruby e suporta um grande número de diferentes provedores de virtualização, nuvens públicas e containerização. No momento, estamos usando uma versão do Gaprindashvili na configuração de alta disponibilidade em casa.


Como o processo mudou


Anteriormente, cada equipe exigia configurações separadas em sua área de responsabilidade. Após a preparação preliminar, todos os dados foram coletados e enviados ao administrador, que implantou e configurou a máquina virtual. Em seguida, foi necessário informar, por exemplo, a equipe de monitoramento que um novo host havia aparecido e que precisava ser adicionado ao monitoramento. Atrasos na comunicação, carga de trabalho de especialistas, erros causados ​​pelo fator humano podem levar esse processo a vários dias.


Tendo encaixado todo o processo no ManageIQ, obtivemos os seguintes resultados:


Tipo de recurso virtualAntes de introduzir o ManageIQDepois de implementar o ManageIQ
Máquina virtual Linux no VMware / oVirtPara um~ 10 minutos
Ambiente de máquina virtual do Ranchertrabalhando~ 15 minutos
Máquina virtual do Windows no VMwaresemanas~ 25 minutos

A diferença de horário se deve ao fato de que, no segundo caso, é necessário tempo adicional para preparar o host para trabalhar com o Docker, fazer o download e integrar imagens para contêineres de infraestrutura do Artifactory, porque ainda não há acesso ao Docker Hub nesse estágio. No caso do Windows, a diferença é alcançada devido ao fato de que, em primeiro lugar, o tempo de criação de uma VM do Linux sem personalização é de aproximadamente 2 minutos e o de uma VM do Windows é de 6 minutos. Em segundo lugar, personalizar o próprio Windows leva cerca de 10 minutos, contra 2 minutos no Linux.


10 minutos não é tão rápido, já que aproximadamente 2 a 3 minutos são gastos diretamente no processo de criação de uma VM. Durante o tempo restante, o ManageIQ consegue fazer o seguinte:


  1. O sistema coleta os parâmetros especificados pelo usuário no formulário de pedido e os decompõe em variáveis.
  2. Uma nova solicitação de mudança é criada no sistema de gerenciamento de incidentes, que exibe dados sobre o novo recurso.
  3. O sistema de consulta de nome de recurso ManageIQ envia um valor para um novo recurso.
  4. O sistema de gerenciamento de endereços IP emite um novo endereço com base nos parâmetros inseridos.
  5. Um novo registro DNS é registrado no servidor DNS local.
  6. Com base nos parâmetros, ambiente e carga de recursos, o tipo de virtualização e cluster para posicionamento são selecionados.
  7. Em seguida, o processo de criação de uma máquina virtual com os parâmetros especificados.
  8. Quando a máquina virtual é implantada a partir do modelo, você precisa executar scripts que farão as configurações finais:
    • expansão de disco para um tamanho especificado,
    • gerando uma nova senha root, alterando-a em um host Linux e gravando em um gerenciador de senhas,
    • criando um arquivo YAML de configuração para o Puppet no GitLab,
    • execute runbooks que trazem as configurações e atualizações necessárias para VMs do Windows ou
    • Inicie o Puppet, que atualizará e configurará as máquinas Linux.
  9. Depois de tudo isso, a solicitação de alteração criada na etapa 2 é fechada. Dados novos são adicionados a ele, como o endereço IP e o nome do host.
  10. Uma nova unidade é registrada na Base de Gerenciamento de Recursos de Computação (CMDB).
  11. A máquina virtual é registrada no Zabbix e adicionada ao monitoramento.
  12. O cliente e outras partes interessadas recebem um e-mail com informações sobre a nova unidade criada usando o ManageIQ.

O que há dentro


Vamos nos aprofundar nos detalhes técnicos do produto. Por padrão, o ManageIQ pode criar uma máquina virtual a partir de um modelo. Como isso difere do que fazemos, por exemplo, no vCenter? A resposta correta é nada. O ManageIQ usa os mesmos métodos que os sistemas de virtualização, mas usa-o em um único local. Além disso, você pode adicionar seus próprios scripts que não se encaixam no conjunto padrão de recursos. Portanto, se você possui recursos, por exemplo, no Azure público, no vCenter, que é implantado em seu próprio hardware, e o cluster Kubernetes está girando em outro lugar, tudo isso pode ser gerenciado convenientemente no ManageIQ.


Além de uma ampla variedade de fornecedores para integração, o ManageIQ possui ferramentas convenientes para personalização. Por exemplo, criando formulários convenientes para resolver seu problema:



Graças a isso, foi possível construir uma interface completa para solicitar uma máquina virtual, ajustando todos os parâmetros necessários nela:



Selecionamos a quantidade de recursos de computação, SO, preenchemos todas as informações adicionais necessárias para a integração com sistemas externos. Além disso, usando mecanismos internos (sobre eles um pouco mais tarde), o sistema escolhe onde novos recursos serão colocados: o datacenter, cluster, host e armazenamento de dados são selecionados dependendo de todos os parâmetros inseridos e os recursos são carregados.


Não esqueça que as pessoas podem pedir muitos recursos ou nem o que realmente precisam. Aqui o sistema de solicitações e confirmações entra em jogo:



Quaisquer recursos solicitados pelo usuário devem ser aprovados pela pessoa responsável. Em casa, um grupo de arquitetos faz isso.


Estrutura de automação


Se você decompor todos os processos de automação no ManageIQ em pequenas partes, notará uma certa estrutura.


Automatizar domínio



O armazenamento de dados hospeda todos os domínios que o ManageIQ possui.


Por padrão, há um domínio ManageIQ, que está bloqueado e é como um modelo de referência. Se você precisar fazer alterações, outro domínio é criado, no qual os elementos do domínio ManageIQ são copiados e alterados para suas próprias tarefas.


Automatizar espaço para nome



No interior, os domínios são divididos em partes responsáveis ​​por processos individuais: essa pode ser a seção responsável pelo gerenciamento da infraestrutura (Infraestrutura) ou pelo trabalho com serviços (Serviço). Temos nosso próprio espaço para nome, que contém tudo relacionado aos sistemas do banco.


Considere a estrutura em mais detalhes usando o exemplo do processo de provisionamento para uma nova máquina virtual. É descrito na classe Automatizar chamada VMProvision_VM .


Automatizar Classe


A classe possui uma estrutura que inclui Instâncias , Métodos , Propriedades e Esquema . Do ponto de vista da automação, o esquema é de maior interesse:


O layout é semelhante ao pipeline nos sistemas de CI / CD. Ele descreve as etapas que serão executadas no processo de automação.


Automatizar instância



A classe descrita acima possui duas Instâncias de Automação. Cada um deles herda do circuito os estágios para os quais o Valor Padrão está definido. Os estágios que possuem valores nulos são descritos na instância.



Na instância, os valores apareceram para as etapas que estavam vazias na descrição do esquema. Você também pode ver quem e quando fez a última alteração.


Vamos ver o que um dos valores de valor representa:


Esta é uma classe Automatizar chamada Métodos, que possui uma Instância Automatizada. Seu diagrama descreve o atributo ipam_base_uri e o método execute . O método execute, por sua vez, chama o método Automatize adquirir_ip .


Método Automatizado


Este é um script Ruby que permite que uma máquina virtual se comunique via API REST com outros sistemas. Por exemplo, como é o caso do sistema de gerenciamento de espaço de endereço do IPAM. No IPAM, obtemos o endereço, a máscara, a sub-rede e a VLAN da VM. A dificuldade é que a máquina pode ser implantada em um ambiente de teste ou produtivo, para aplicativos ou bancos de dados. Ou talvez o serviço de segurança tenha decidido colocá-lo no loop PCI-DSS. Todas essas informações são coletadas no estágio de criação da VM ou transmitidas nos parâmetros da instância chamada (na captura de tela acima, você pode ver que o parâmetro contém a uri pela qual o método acessará o IPAM):


Aqui está um 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 é um método que retorna tudo o que pode ser armazenado no ManageIQ. Podem ser informações sobre o usuário, ambiente, variáveis, a solicitação atual ('miq_request'), etc. Estamos interessados ​​no atual processo de provisão.


Em seguida, podemos escolher os valores necessários: get_option (: site) escolhe o valor que foi transferido em um dos estágios anteriores e, por exemplo, get_option (: dialog_dropdown_list_information_system) seleciona o formulário que o usuário preenche ao solicitar novos recursos.
Todos os valores recebidos são transmitidos por variáveis ​​no corpo da solicitação no 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 esse conjunto de parâmetros, o IPAM determinará inequivocamente em qual VLAN a máquina virtual deve estar localizada e retornará os parâmetros de rede.


Além de receber dados para a configuração correta da VM, o ManageIQ também pode gerar informações adicionais para fazer algumas configurações no estágio do chamado pós-provisionamento (após a implantação e o lançamento da máquina virtual). Em Casa, usamos o Puppet para gerenciar configurações de host do Linux. Para cada unidade de computação, crie um arquivo GAML no YAML com um conjunto de grupos:


Um pouco mais 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 

Os grupos dependem do tipo de máquina virtual, do ambiente em que é criada e do sistema de informações.



Após a conclusão bem-sucedida do procedimento, o usuário recebe um email com informações:


O texto da carta também pode ser ajustado adicionando as informações necessárias.
Se ocorrer um erro em qualquer um dos estágios críticos do processo, você poderá adicionar uma condição que declare explicitamente que o processo deve ser interrompido. Se o erro não tiver consequências fatais, indique também o que pode ser continuado, apesar do problema.


Registo


O ManageIQ grava logs de tudo o que pode ser rastreado. O processo de automação é escrito em automation.log. Além disso, existem logs de API, vários provedores de nuvem, logs de segurança e até a saída do comando top é registrada.


Para cada evento no circuito, você pode configurar uma entrada de log do início e do fim:


Além disso, você pode escrever suas mensagens nos logs:


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

Isso é muito útil ao acessar sistemas pela API para entender por que algo deu errado. Ou, para acompanhar o status atual de um processo demorado, como a execução de um trabalho Jenkins ou o Runbook do SCCM:


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

Você pode usar as funções padrão para exceções para gravar nos logs:


 raise “VM not specified” if vm.nil? 

Por padrão, todos os logs são armazenados na seção / var / log / manageiq / *, mas, por experiência própria, posso dizer que procurar um problema através do tail e grep não é a solução mais conveniente. Como o ManageIQ grava muitos logs diferentes, você deve redirecionar os logs, por exemplo, para a pilha ELK.


API ManageIQ


Além de uma interface web amigável, o ManageIQ possui uma API funcional. Com isso, por exemplo, resolvemos o problema de determinar dinamicamente o identificador do modelo a ser especificado


ao criar uma 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 uma solicitação POST e especificando filtros para a pesquisa, obtemos o modelo desejado.
Além de resolver problemas internos, você pode criar novos métodos de API para uso por sistemas externos. No início do artigo, foi mostrado o processo de pedido de uma nova máquina virtual usando a interface da web. E é assim que parece se você fizer isso com


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

Conclusão


Prós:


  • Incrível flexibilidade: o ManageIQ não apenas permite que você personalize o processo de automação conforme necessário, mas também permite alterar sua parte visual adicionando botões, campos, etc.
  • Editor de código interno com destaque de sintaxe e validação de código. Pareceu-me uma solução muito boa, se você precisar consertar algo rapidamente.
  • Um grande número de fontes com as quais o sistema pode trabalhar. Nuvens: Amazon EC2, Google Compute Engine, Azure, OpenStack, VMware vCloud. Infraestrutura: Microsoft SCVMM, diretor da plataforma OpenStack, virtualização Red Hat, VMware vCenter. Recipientes: Kubernetes, OpenShift.

Contras:


  • Os grandes recursos da ferramenta também carregam um ponto negativo. Nem toda a documentação está bem estruturada e, às vezes, é difícil descobrir onde procurar o que você precisa. No entanto, vale ressaltar que a situação está mudando para melhor, a documentação é complementada e aprimorada.
  • Pequena comunidade. Se você encontrar algum problema muito específico, talvez não consiga "pesquisar" rapidamente a resposta. Ou não ter sucesso.
  • Um parágrafo que segue dos dois anteriores. Algumas coisas, configurações e cenários básicos podem ser encontrados na documentação ou na Internet, mas perguntas mais específicas e restritas exigiram muito tempo para serem compreendidas e estudadas, incluindo o método de cutucadas científicas: smile:

Como temos agora:


Devido ao fato de o ManageIQ poder aproveitar ao máximo a linguagem Ruby, pudemos integrá-la para trabalhar com as seguintes APIs:


  • Gerenciador de Senhas Ele gera uma senha root de acordo com os requisitos do serviço de segurança, grava-a em seu banco de dados e o ManageIQ a usa dentro do sistema operacional;
  • Serviços de orquestração do centro de serviços para gerenciar registros DNS e nomes de host;
  • Remédio BMC. Todo o processo é registrado como comentários sobre a solicitação. Após a execução bem-sucedida, a solicitação é fechada;
  • CMDB Informações sobre novas unidades de configuração são criadas no banco de dados com todos os dados necessários.
  • Zabbix Dependendo da afiliação com o sistema e o ambiente de informações, os hosts são adicionados aos grupos de monitoramento correspondentes.
  • Rancheiro. Implementou a criação de novos ambientes, a instalação de agentes e o registro de hosts nos ambientes existentes.
  • Jenkins Jenkins executa tarefas para configurar VMs no oVirt;
  • LDAP Crie novos grupos que são usados ​​para controlar o acesso em ambientes Rancher e para configurar políticas no Vault;
  • Vault Em Casa, a integração deste produto nos processos bancários está apenas começando, mas já criamos métodos para criar novos grupos, políticas e seções para armazenamento;
  • O Puppet e o IPAM foram mencionados anteriormente.

A funcionalidade e os recursos do sistema são muito extensos e eu me familiarizei com muitos deles e continuo me familiarizando no processo de implementação do sistema.
Por exemplo, não mencionei que o sistema tem a capacidade de criar seus próprios painéis com estatísticas, configurações de faturamento ou botões, aos quais você pode anexar scripts individuais ou scripts inteiros. Você pode adicionar seus próprios campos para registrar informações adicionais sobre serviços e máquinas virtuais etc.


O que o Lar busca:


  • Uma atualização para a versão Hammer, na qual no modo HA você pode tentar trabalhar com o Ansible embutido.
  • A transição da coordenação para cada unidade de recursos virtuais para o gerenciamento. As equipes poderão receber novas VMs ainda mais rapidamente se a cota não estiver esgotada.
  • Desenvolvimento de novos métodos para provisão adicional a sistemas externos.
  • Por exemplo, vários SaaS, como Jenkins, Logstash, etc.
  • Implementação de novos métodos de API em um portal existente para proprietários de sistemas de informação. Os usuários não precisarão pensar em como se integrar ao novo elemento de infraestrutura, apenas o usarão como um serviço para obter novos recursos ou alterar os existentes.

No final, gostaria de lembrar que as ferramentas são ótimas, mas não se esqueça da importância da interação entre equipes diferentes. As alterações descritas no artigo não seriam possíveis sem comunicação bem estabelecida e interação constante sobre questões emergentes de todas as partes interessadas.

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


All Articles