Teste-me se puder. Os desenvolvedores de YML sonham em testar ansible?

esquema da cozinha-ci


É a versão em texto da apresentação 25-04-2018 no Saint-Petersburg Linux User Group . O exemplo de configuração localiza-se em https://github.com/ultral/ansible-role-testing


Suponho que você faça o gerenciamento da configuração, não o bash . Isso significa que você tem que testar de alguma forma. Você já testou papéis ansíveis? Como você faz isso?


Como fazer isso?


No meu caso, temos:


  • Muitos papéis diferentes.
  • O Hyper-V hospeda como um hypervisor.
  • Uma nuvem privada com possibilidade limitada de criar VMs sob demanda.
  • Um proxy para acesso à Internet.
  • A incapacidade testa funções ansible dentro da janela de encaixe, devido a uma função = configuração da VM inteira.
  • Decisão de implementar a política de construção verde para o repositório git com funções ansible.

Vamos comparar as soluções existentes para teste.


NomeCozinha de testeMoléculaCriar novo
Linguagemrubipythonbash / ruby
Observadores1321260 0
Estrelas141311541
Forquilhas5021742
LicençaApache 2.0MITQualquer
Confirma192912640 0
Lançamentos1011210 0
Contribuintes109825

NometestinfraserverspecinspecGoss
Githubphilpep / testinframizzy / serverspecchef / inspecaelsabbahy / goss
Linguagempythonrubirubivai
Observadores9314516567
Estrelas997210511672170
Forquilhas138361330156
LicençaApache 2.0MITApache 2.0Apache 2.0
Confirma38018544609309
Lançamentos3528234647
Contribuintes4311015931

Decidimos não reinventar a roda e obter a solução pronta para produção. Nossa equipe de infra-estrutura possuía fortes habilidades em rubi e ótima experiência com rubi. Como resultado, escolhemos Test Kitchen & inspec


Kitchen-ci


esquema da cozinha-ci


A idéia principal é criar uma nova VM, aplicar um papel ansível e fazer alguns testes de fumaça.


Política de construção verde


Esquema de política de construção verde


Além disso, implementamos a política de construção verde. Executamos testes para cada confirmação na ramificação principal e, se os testes estiverem corretos, ao aplicar funções ansible.


Virtualização aninhada


Como você se lembra, tínhamos uma nuvem privada com possibilidade limitada de criar VMs sob demanda. Decidimos criar VMs dentro de VMs.


precisamos ir mais fundo


Primeiro, tentamos executar o Virtualbox x32 sem aninhados. Foi uma má ideia por causa do pânico do kernel. Também a grande maioria de nossas VMs em nossa infraestrutura é x86_64, por isso decidimos continuar a pesquisa. Como resultado, decidimos usar a virtualização aninhada. Espero que tenha sido suportado pelos nossos servidores host.


Questões enfrentadas


Eu estava implementando o testkitchen e me deparei com alguns problemas.


Passe configurações de proxy do host para a VM convidada testkitchen


Em alguns fatos de teste, definimos as configurações do cliente proxy na VM criada pelo testkitchen. No entanto, o proxy não foi configurado no host testkitchen e o ansible não pode usar variáveis ​​extras com valores vazios


Solução: crie um modelo erb para configurar o proxy padrão se as variáveis ​​ENV não estiverem definidas


<%= ENV['http_proxy'].to_s.empty? ? 'http://proxy.example.com:3128' : ENV['http_proxy'] %> 

Gerenciar configurações de rede via playbook


Algumas funções configuram interfaces de rede. O traje de teste era parecido com:


  • Implantar configurações de rede em VMs
  • Recarregar rede
  • Falhou

Solução: adicione interfaces às VMs


Falha se os casos do processo contiverem "-" no nome


O Virtualbox não pode usar "_" em um nome de vm


Solução: renomeie as malas "vm_" => "vm-"


O teste do Oracle falha sem "." no final do nome da VM


Usamos papel na produção, no entanto, quando decidimos testá-lo, ele falhou. Nós o reproduzimos.


Eu gostaria de mostrar uma pista.


 [root@vm-oracle vagrant]# getent ahosts vm-oracle 127.0.0.1 STREAM vm-oracle 127.0.0.1 DGRAM 127.0.0.1 RAW [root@vm-oracle vagrant]# getent ahosts vm-oracle. fe80::a00:27ff:febd:bd6a STREAM vm-oracle fe80::a00:27ff:febd:bd6a DGRAM fe80::a00:27ff:febd:bd6a RAW 10.0.2.15 STREAM 10.0.2.15 DGRAM 10.0.2.15 RAW [root@oracle vagrant]# getent ahosts oracle.example.com. 192.168.128.182 STREAM oracle.example.local 192.168.128.182 DGRAM 192.168.128.182 RAW 

Você tem alguma idéia do que está acontecendo?


É um bug complicado:


  1. ativamos o IPv4 de escuta apenas nas configurações do ouvinte da oracle
  2. Oracle usado FQDN
  3. O linux contém o banco de dados especial "myhostname" para resolver o nome do host, é usado após a resolução do / etc / hosts & dns
  4. VM criada pelo Vagrant e /etc/hosts atualizados

Eu gostaria de esclarecer um pouco mais:
O que aconteceu no caso vm-oracle ?


  1. vagabundo criado vm
  2. vagrant atualizado /etc/hosts ( vm-oracle x2)
  3. ouvinte oracle ouviu IPv4
  4. ouvintes da oracle resolvidos vm-oracle. e obteve IPv6
  5. FALHOU

O que aconteceu no caso vm-oracle. ?


  1. vagabundo criado vm
  2. vagrant atualizado / etc / hosts ( vm-oracle e vm-oracle. )
  3. ouvinte oracle ouviu IPv4
  4. ouvintes da oracle resolvidos vm-oracle. e obtém IPv4
  5. Ok

OOM está chegando


OOM aleatoriamente estava matando VMs. O Testkitchen falhou com erros estranhos.


Solução: aumentar a RAM


Construções lentas


Estava trabalhando devagar


Soluções:


  • Packer . Caixa vagabunda pré-construída com tarefas comuns
  • Concorrência

Conclusão


Por um lado, a implementação atual funciona, mas por outro lado, existem alguns problemas


  • não é fácil de usar.
  • nós misturamos ruby ​​e python.
  • não há verificação de independência.
  • funciona devagar.
  • é difícil rastrear logs em um único trabalho.

Como resultado, molécula e janela de encaixe podem ser uma solução bastante interessante.


Alguns links relacionados


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


All Articles