Eu tenho usado o Ansible, com grande sucesso, por cerca de 3 anos para gerenciar um grupo cada vez maior de sistemas Linux. Antes de mergulhar na minha pergunta, preciso definir algum contexto.
Como parte do meu trabalho diário, faço design, implantação e manutenção de sistemas para várias empresas que operam sob a égide de um único empreendimento/empresa incubadora. Há muita polinização cruzada entre as empresas de nosso portfólio e, como tal, não podemos dizer que apenas os usuários A, B e C precisarão de acesso aos sistemas da empresa X. Eles também podem precisar de acesso aos sistemas da empresa Y. Isso é complicado pelo fato de que o ambiente ansible de cada empresa reside em um repositório git diferente. Isso significa que há muita duplicação de código para implantar usuários em diferentes sistemas da empresa. Acabo copiando/colando blocos de código como este para implantar usuários nos sistemas de uma determinada empresa:
- name: add several users
user: >
name={{ item.name }}
state=present
groups={{ item.groups }}
uid={{ item.uid }}
password={{ item.password }}
shell=/bin/bash
with_items:
- { name: 'user1', groups: 'ssh-access,sudo', uid: '501', password: '<redacted>' }
- { name: 'user2', groups: 'ssh-access,sudo', uid: '502', password: '<redacted>' }
tags: users
- name: authorized_keys - user1
action: authorized_key user=user1 key="{{ lookup('file', 'pubkeys/user1') }}" manage_dir=yes
tags:
- pubkeys
- users
- name: authorized_keys - user2
action: authorized_key user=user2 key="{{ lookup('file', 'pubkeys/user2') }}" manage_dir=yes
tags:
- pubkeys
- users
Isso funcionou bem quando eu tinha <5 usuários para gerenciar, mas à medida que a base de usuários cresce, torna-se cada vez mais oneroso manter as coisas atualizadas com rotação de chaves, novas senhas etc.
Com a história de fundo e o contexto definidos, vamos à minha pergunta:
Supondo que usar um sistema de autenticação centralizado (LDAP, etc.) não seja uma opção, como eu poderia criar um banco de dados de usuários centralizado que vários playbooks ansible poderiam consumir? Eu adoraria ser capaz de manter uma lista central de usuários, uids, hashes de senha e chaves públicas e, em seguida, poder implantar os usuários (com associações de grupos personalizadas por host) para os hosts de cada empresa.
Estou imaginando algum tipo de estrutura de jogo como:
- name: Deploy users
user_management:
- { name: "user1", groups: "sudo" }
- { name: "user1", groups: "sudo" }
...onde o uid, hash e chave pública de cada usuário seriam extraídos da lista central e implantados como de costume.
Então, que opções eu tenho? Eu tenho refletido sobre isso por um bom tempo e não consegui pensar em nada melhor do que o que já estou fazendo. Eu poderia fazer algo com um arquivo de fatos personalizado para manter meu banco de dados de usuários?
Você precisa separar suas jogadas e seus dados.
Tenho um único repositório com todas as minhas funções, fatos etc. que são implantados em uma ampla variedade de sistemas de clientes. Garanto que todas as funções são reutilizáveis e livres de dados. Em
host_vars/fqdn.yml
ougroup_vars/customer_name.yml
defino os dados exclusivos desse cliente ou sistema remoto.A maioria das minhas funções são expandidas ao longo do tempo conforme necessário e, em vez de fazer tudo o
from roles/foo/main.yml
que tenhoroles/foo/debian-foo.yml
eroles/foo/openbsd-foo.yml
que só são incluídas quando o sistema operacional ou outra condição corresponde.Simplificado,
roles/adduser/main.yml
poderia incluir isto:e
group_vars/ACME.yml
poderia incluir isto:No seu caso, pode ser bom ter ambientes ansible separados em cada repositório git, desde que a pasta de funções seja um submódulo compartilhado idêntico em todos os seus clientes.