Ansible: creación de usuarios cuando se cumplen los criterios de clase de servidor

Ansible: creación de usuarios cuando se cumplen los criterios de clase de servidor

Soy un nuevo usuario de Ansible y estoy cambiando de una colección de scripts de shell a guías de Ansible. Mi sistema de administración de usuarios actual permite agregar un usuario a un sistema solo si a ese usuario se le ha otorgado acceso a esa clase de servidor, ubicación y entorno (o si alguno de ellos está configurado como comodín/cualquiera).

La clase, la ubicación y el entorno del servidor se almacenan localmente en el propio servidor cliente, en forma de un archivo (solo legible/escribible desde la raíz) que tiene este aspecto:

LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"

Encontré algunos ejemplos que creo que son similares a lo que quiero, todavía no estoy seguro de cómo obtener las variables del cliente ansible y también de cómo asegurarme de que se cumplan los 3 requisitos de clase, ubicación y entorno antes de agregar. el usuario. Me imagino un archivo variable 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 

Con una entrada de módulo de usuario que se parece a esta según las variables recopiladas del cliente ansible que estoy configurando (tenga en cuenta el pseudocódigo porque no estoy seguro de cómo lograría esto):

- 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

Preferiría no depender de los roles de ansible, sino obtener los datos de clase, ubicación y entorno del propio cliente de ansible, al menos parcialmente porque este es el sistema que tenemos actualmente y nos ayuda a realizar una transición fácil a ansible mientras mantenemos algunos herramientas existentes y familiares. ¿Es posible lo que estoy buscando?

Respuesta1

Hay una característica llamadahechos localesen Ansible:

  • Modifique su archivo de "propiedades" para que se vea como el siguiente, guárdelo en /etc/ansible/facts.d/server_meta.facty aplique los permisos que desee:

    [settings]
    ld_class=app
    ld_loc=dfw
    ld_env=prod
    
  • Luego ejecute su libro de jugadas y consulte esos datos en el 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') }}"
    

información relacionada