Usando ansible para implantar ambiente de teste dockerizado e Ubuntu simples para produção

Usando ansible para implantar ambiente de teste dockerizado e Ubuntu simples para produção

Preciso de ajuda para implantar um sistema no qual trabalho há um ano e meio. Para que vocês entendam a minha preocupação, vou explicar um pouco sobre a nossa infraestrutura.

Temos um servidor (vamos chamá-lo de TESTING_SERVER) onde temos diferentes ambientes de testes para nosso sistema. Cada um desses ambientes está sendo executado inteiramente com docker. Cada instância de um ambiente de teste consiste em: 1. Contêiner Docker com nginx atuando como proxy 2. Contêiner Docker com uma web Django 3. Contêiner Docker com mysql

Cada vez que precisamos construir um novo ambiente para fins de teste (ou seja: o controle de qualidade deseja testar um novo recurso), usamos um manual ansible que executa estas tarefas em TESTING_SERVER:

  1. Crie uma rede docker
  2. Criar contêiner de banco de dados
  3. Clone ou atualize o repositório git do Django em algum lugar em TESTING_SERVER
  4. Criar contêiner Django
  5. Execute o comando django collectstatic dentro do contêiner django
  6. Execute o comando Django Migrate dentro do contêiner Django
  7. Criar contêiner nginx

Em nosso ambiente de produção temos um servidor Ubuntu simples (PRODUCTION_SERVER) rodando mysql, django e nginx. Cada vez que precisamos implantar em produção, executamos um manual ansible que (quase) repete as etapas listadas acima:

  1. verifique a conexão mysql (db está em outro servidor)
  2. Clone ou atualize o repositório git do Django em algum lugar do PRODUCTION_SERVER
  3. Verifique e reinicie o gunicorn (é o equivalente a criar o contêiner Django)
  4. execute Django Collectstatic
  5. execute django migrar
  6. verifique a configuração do nginx

Esses dois manuais são diferentes, embora tenham muito em comum. Eu estava pensando em converter cada etapa em uma tarefa ansible e usar uma condicional para saber quais tarefas (dockerizadas ou diretas) deveriam ser executadas. Mas ainda terei tarefas diferentes para cada etapa (mesmo manual, mas parece um pouco complicado).

Minha pergunta é: existe uma maneira de "mesclar" esses manuais para ter apenas um sem nos repetirmos?

Responder1

Eu criaria uma função por "tarefa" e a usaria no manual, semelhante ao descrito no documento de práticas recomendadas.

http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#directory-layout

por exemplo

roles/  
  create_a_docker_network/  
    tasks/  
      main.yml  
  create_database_container/...
  ...  
  Create_nginx_container/

e no manual chame os papéis

testando.yml

- hosts: testserver
  roles:
    - create_a_docker_network
    - create_database_container
    - ...

informação relacionada