Sou um novo usuário ansible, mudando de uma coleção de scripts de shell para manuais ansible. Meu sistema de gerenciamento de usuários atual permite adicionar um usuário a um sistema somente se esse usuário tiver recebido acesso a essa classe de servidor, local e ambiente (ou se algum deles estiver definido como curinga/qualquer).
A classe, localização e ambiente do servidor são armazenados localmente no próprio servidor cliente, na forma de um arquivo (somente legível/gravável pela raiz) que se parece com:
LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"
Encontrei alguns exemplos que considero semelhantes ao que desejo, ainda não tenho certeza de como obter as variáveis do cliente ansible e também de como garantir que todos os três requisitos de classe, localização e ambiente sejam atendidos antes de adicionar o usuário. Eu imagino um arquivo variável como este:
users:
-name: user1
uid: 60001
gid: 60001
class: app
location: any
env: dev
-name: user2
uid: 60002
gid: 60002
class: app
location: dfw
env: prod
Com uma entrada de módulo de usuário semelhante a esta com base nas variáveis coletadas do cliente ansible que estou configurando (observe o pseudocódigo porque não tenho certeza de como realmente conseguiria isso):
- user:
name: '{{ item.name }}'
state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
uid: '{{ item.uid }}'
with_items: users
Eu preferiria não confiar em funções ansible, mas em vez disso obter os dados de classe, localização e ambiente do próprio cliente ansible, pelo menos parcialmente porque este é o sistema que temos atualmente e nos ajuda a fazer uma transição fácil para o ansible, mantendo alguns ferramentas existentes e familiares. O que procuro é possível?
Responder1
Existe um recurso chamadofatos locaisem Ansible:
Modifique seu arquivo de "propriedades" para ter a seguinte aparência, armazene-o em
/etc/ansible/facts.d/server_meta.fact
e aplique as permissões conforme desejar:[settings] ld_class=app ld_loc=dfw ld_env=prod
Em seguida, execute seu manual e consulte esses fatos no
state
parâmetro:state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"