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.