Como atribuir um nome de DNS a uma variável em Ansible?

1

Estou portando alguns scripts de automação que usavam ansible com inventários estáticos para usar inventário dinâmico (temos uma pilha do AWS Cloudformation por ambiente e parece tolo atualizar arquivos estáticos toda vez que recriamos uma pilha).

Existe um único nó principal por pilha e vários nós de trabalho. Para discriminar entre mestre ou trabalhadores nas listas de reprodução, estou usando uma tag personalizada (por exemplo, tag_node_type_master ou tag_node_type_worker ) como o grupo de hosts (e usando --limit tag_env_XXX para restringir a um ambiente específico).

O problema surge quando eu preciso deixar os nós trabalhadores saberem qual é o seu nó mestre. Atualmente, há um modelo que faz referência a uma variável definida estaticamente com o nome DNS privado do nó mestre, e essa não é mais uma opção aceitável.

Estou tentando fazer algo na seção vars como master_node: {{tag_node_type_master[0]}} (escolha o primeiro e único elemento desse grupo de hosts), mas isso não funciona (ele diz que a variável é indefinida, o que faz sentido porque não é uma variável, mas um grupo de hosts).

    
por fortran 20.10.2015 / 01:44

1 resposta

0

Não sou especialista em Ansible, mas estou bastante familiarizado com a AWS e outros sistemas de gerenciamento de configuração. Eu sugeriria fazer isso:

1) Você pode passar o endereço IP privado do nó mestre ou o nome DNS para a instância EC2 pela propriedade UserData da instância no modelo CloudFormation ( link ). Se você quiser torná-lo mais genérico, colocaria um ELB privado na frente do seu nó mestre para que você não precise lidar com endereços IP ou alterações de nomes DNS quando a instância for, por exemplo, Relançado. O CloudFormation tem a função intrínseca disponível Fn::GetAtt que você pode usar para obter tais parâmetros ( link ).

2) Eu salvaria esses parâmetros por UserData como fatos locais Ansible (Ansible > = 1.3, link ). Um snippet para UserData:

FACTS=/etc/ansible/facts.d/preferences.fact
echo [MasterNode] > $FACTS
echo Elb={ "Fn::GetAtt" : [ "MasterELB", "DNSName" ]} >> $FACTS
echo Dns={ "Fn::GetAtt" : [ "MasterInstance", "PrivateDnsName" ]} >> $FACTS
echo Ip={ "Fn::GetAtt" : [ "MasterInstance", "PrivateIp" ]} >> $FACTS

3) Eu usaria tais fatos locais personalizados em seus playbooks

{{ ansible_local.preferences.MasterNode.Elb }}
{{ ansible_local.preferences.MasterNode.Dns }}
{{ ansible_local.preferences.MasterNode.Ip }}

Esta não é uma solução completa. Você ainda precisa ter um procedimento para inicializar instâncias do EC2, para criar o diretório de fatos, etc. Eu uso um procedimento similar com o SaltStack e ele funciona bem. Quaisquer comentários são bem-vindos.

    
por 22.10.2015 / 14:16