Bom dia Ansible foi mencionado mais de uma vez em Habré, mas não encontrei artigos sobre o teste de seus papéis usando a molécula, no entanto, acho essa estrutura extremamente conveniente e gostaria de compartilhar isso com o público de Habr.
Mas primeiro, um pouco sobre o que eu usei antes.
Anteriormente, para testar os papéis ansíveis que crio, usei o vagrant, dirigindo diretamente:
$ vagrant init debian/jessie64 $ vagrant up
Criando máquinas virtuais, depois das quais escrevi inventário e manual para iniciar o papel, até que um dia conheci a molécula.
O que a molécula pode oferecer?
- Inicialização inicial da função
- Motorista / provedor
- Testes de Idempotência
- Verificação
Inicialização inicial da função
Se uma nova função for especificada, cria uma estrutura de amostra para a função ansible
Motorista / provedor
A molécula nos permite usar um contêiner do Docker ou uma máquina virtual como cobaia usando o Vagrant. Isso é determinado pela indicação do driver durante a inicialização ou em molecule.yml. Porque Se eu tiver que testar as funções de orquestrar contêineres, o Vagrant continuará sendo o driver preferido para mim. Escolher o Vagrant como um driver também permite selecionar um provedor.
Estão disponíveis os seguintes:
- Libvirt
- Parallels
- VirtualBox (padrão)
- VMware Fusion
A seguir, consideraremos uma variante do Vagrant com o VirtualBox como provedor.
Testes de Idempotência
De acordo com o wiki:
A propriedade de um objeto ou operação ao aplicar a operação ao objeto novamente fornece o mesmo resultado de quando é único.
Em relação às funções ansíveis, quando a função é reiniciada, nenhuma alteração deve ser feita.
Verificação
Para garantir que a função funcione corretamente, não falhar em nenhuma das tarefas não é suficiente. Afinal, você precisa verificar se os serviços foram iniciados, as portas estão abertas etc.
As seguintes estruturas estão disponíveis para verificação:
- Goss
- Serverspec
- Testinfra (padrão)
Eu fui testado por Goss e Testinfra. Para mim, eu escolhi o Testinfra.
Exemplo de uso:
$ molecule init --role sample-role
Após executar este comando, obtemos um diretório de função de amostra com uma estrutura de função ansible típica e os arquivos yaml necessários:
defaults handlers meta molecule.yml // - molecule playbook.yml // README.md tasks tests // vars
Você pode iniciar sem especificar a opção --role; nesse caso, os arquivos molecule.yml e playbook.yml serão criados no diretório atual.
Acontece que você precisa garantir que a função funcione em várias distribuições nesse caso, em molecyle.yml, você deve especificar os nomes das caixas vagrantes (nas plataformas):
vagrant: platforms: - name: jessie64 box: debian/jessie64 - name: centos7 box: centos/7
Em seguida, adicione as ações / variáveis necessárias, etc. para a função, após o qual testamos em todas as plataformas específicas:
$ molecule test --platform all
Após esta molécula:
- se já houver máquinas virtuais criadas, ele será interrompido e excluído
- aumentará as máquinas virtuais necessárias
- testar nosso papel com ansible-lint
- cumprir nosso papel em contêineres recém-criados
- testará a idempotência
- executar testes
- excluirá máquinas virtuais criadas
Pode ser necessário alterar o comportamento da molécula ao executar o teste, por exemplo, não teste a idempotência; para isso, adicione o seguinte ao molecule.yml:
molecule: test: sequence: - destroy - syntax - create - converge - verify - destroy
Você também pode chamar cada uma das etapas correspondentes separadamente, usando o comando apropriado, por exemplo:
$ molecule create --platform all $ molecule syntax $ molecule create $ molecule converge $ molecule verify
Como uma opção, não exclua / crie uma nova máquina virtual antes de cada convergência.
Você pode especificar uma plataforma específica e testá-la separadamente:
$ molecule create --platform jessie64 $ molecule syntax $ molecule create $ molecule converge $ molecule verify
Obrigado pela atenção!