Ansible - Criação de usuário quando os critérios de classe do servidor são atendidos

Ansible - Criação de usuário quando os critérios de classe do servidor são atendidos

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.facte 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 stateparâ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') }}"
    

informação relacionada