Como atribuir deterministicamente e de forma reprodutível um número crescente de portas no Ansible?

12

Eu sou novo no Ansible, mas preciso manter um conjunto de playbooks, que correspondem aos serviços a serem configurados em um determinado ambiente. Eles precisam receber uma porta, certificados etc. Isso resulta em muitos arquivos com listas essencialmente sempre com os mesmos nomes e uma atribuição a eles.

Em muitos casos, acho que posso reutilizar facilmente o service_name como variável, mas ao mapear para IPs, portas ou outros identificadores numéricos, ainda não descobri uma maneira de atribuir deterministicamente a eles números diferentes de uma maneira que seja reproduzível e, de preferência, permaneça o mesmo quando novos serviços são adicionados. Eu considerei usar um banco de dados SQLite para armazenar os serviços e gerar os valores de seus IDs, mas não tenho idéia de como integrá-lo ao Ansible.

Presumo que atribuir números de porta crescentes não é algo totalmente novo; é algo que muitos administradores de sistemas usam diariamente, portanto, deve haver alguma maneira de fazer isso.

Edit : Adicionamos diretamente os números de porta, etc., group_vars/all.ymlassim:

ports:
    service1:1024
    service2:1025
    service3:1026

O inventário é gerado automaticamente, pois criamos cadeias adicionais (BSD) e depende das funções que serão executadas.

midor
fonte
2
Como você provavelmente precisa adicionar o serviço ao inventário, o que está impedindo você de adicionar manualmente um número de porta específico? Ou se o seu inventário é gerado automaticamente, então você provavelmente deve resolver o problema ao nível da geração de inventário
SztupY
Você poderia incluir alguns trechos Ansible? Não está claro se você está usando group_varsou adicionando variáveis ​​diretamente nos arquivos de inventário. Também não está claro como o seu inventário está sendo gerado.
Woodland Hunter
Você já pensou em usar uma ferramenta de descoberta de serviços como o Consul da HashiCorp?
Foghorn CTO

Respostas:

5

Isenção de responsabilidade: não estou usando o Ansible.

O que eu faria é usar um número "previsível" aleatório. De acordo com o documento Ansible, você pode propagar o gerador de números aleatórios:

A partir da versão 2.3 do Ansible, também é possível inicializar o gerador de números aleatórios a partir de uma semente. Dessa forma, você pode criar números aleatórios, mas idempotentes:

"{{59 | random (seed = nome_do_host_de_ inventário)}} * * * * raiz / script / de / cron"

Portanto, no seu caso, para um número de porta (presumo sem privilégios), eu usaria uma variável com algo como:

port="{{ 32767 |random(start=1024,seed=service_name) }}"

Max em 32767 para evitar conflitos com qualquer porta iniciada pelo cliente (consulte Porta Efêmera) para obter o motivo).

Tensibai
fonte
Essa é uma boa ideia, que eu considerei, mas torna impossível a parte crescente. Ter certos serviços que estão logicamente relacionados em um determinado intervalo de portas é provavelmente muito desejável.
Midor