VROPS REST API desde Ansible

Todos los scripts y variables YAML, de esta entrada los tenéis disponibles en

https://github.com/Vidanez/VROPS-REST-API-ANSIBLE

Realizando otras tareas me he encontrado en la curiosa situación de tener que administrar VROPS usando solo cuentas locales, y varios VROPS a sincronizar.

En principio pensé en la opción de usar Powercli o Python API pero ninguno funcionaba para este cometido.

POWERCLI

Powercli Dispone de los comandos:

https://developer.vmware.com/docs/powercli/latest/products/vrealizeoperationsmanager/

Desafortunadamente OMuser solo nos permite la action GET y no la opción SET. Por tanto podemos listar usuarios pero no añadir o editar.

PS /Users/jvidanez/Workspace> Get-OMUser
WARNING: PowerCLI scripts should not use the 'Uid' property.
The property will be removed in a future release.

Name                                      Enabled
----                                     -------
maintenanceAdmin                          True
automationAdmin                           True
migrationAdmin                            True
admin                                     True

PYTHON API

Por su parte la versión the Python API no investigue demasiado por mi malas experiencias usando la librería que nos ofrece llamada Nagini.

JAVA API

También observe que hay una Java API pero mis conocimientos en ese campo y la documentación existente, me hacían imposible incluso planteármela.

REST API

Asi que esto me llevo a usar REST API desde Ansible con su modulo “URI” https://docs.ansible.com/ansible/latest/collections/ansible/builtin/uri_module.html

Lo primero que tendriamos que hacer es autenticarnos y oftener un token que nos valide la sesion.

Para ello usamos un usuario con credenciales de administrador o que permitan crear usuarios de la siguiente forma:

- name: Login VROPS as admin
      uri:
        url: "{{ auth_api_url }}"
        validate_certs: no
        method: POST
        body_format: json
        headers:
          Content-Type: application/json
          Accept: application/json 
        body: {"username":"{{ admin_vrops }}","authSource":"{{authSource_vrops }}","password":"{{ passadmin_vrops }}","others":[],"otherAttributes":{}} 
        return_content: yes
      register: full_login

Con ello volcamos el output de la acción de login a “full_login”. Desde aquí lo filtramos para solo sacarle lo que necesitamos que es el token “{{ full_login[‘json’][‘token’] }}” Y posteriormente volvemos a usar el modulo URI, usando headers para pasar la autenticación y los usuarios a crear

 - name: Adding Users
      uri:
        url: "{{ add_api_url }}"
        validate_certs: no
        method: POST
        body_format: json
        status_code: 201
        headers:
          Content-Type: application/json
          Accept: application/json
          Authorization: vRealizeOpsToken {{ full_login['json']['token'] }}
        body: {"username":"{{ item.username }}","firstName":"{{ item.firstName }}","lastName":"{{ item.lastName }}","emailAddress":"{{ item.emailAddress}}","password":"{{ item.password }}","enabled":"{{ item.enabled }}","role-permissions":[{"roleName":"{{ item.roleName }}","allowAllObjects":"{{ item.allowAllObjects }}"}],"otherAttributes":{"pswdChangeState":"true"}}
      with_items: "{{ users }}"

Siguiendo el mismo principio podriamos realizar cualquier otra acción que que necesitemos.

Como ves uso muchas variables, la password la pregunto como un “var prompt” y asi me salvo tenerla en texto plano o en un vault y sacarla. Como cualquier codigo siempre es susceptible de ser mejorado.

Para llamarlo desde el “command line” y usar el ansible en local queda:

ansible-playbook -i localhost vcops-users

Espero que os sea util y el codigo completo queda como sigue pero tienes los ejemplos en github.

---
  - name: "Using with VCOPS REST API"
    hosts: localhost
    connection: local
    vars_prompt:
     - name: vrops
       prompt: Select VROPS -- Type file name without .yml 
       private: no
     - name: passadmin_vrops
       prompt: What is admin VROPS password?
    pre_tasks:
    - name: Include Variable Files
      include_vars: "{{ item }}"
      with_items:
        - vars/{{vrops}}.yml
        - vars/userlist.yml
    tasks:
    - name: Login VROPS as admin
      uri:
        url: "{{ auth_api_url }}"
        validate_certs: no
        method: POST
        body_format: json
        headers:
          Content-Type: application/json
          Accept: application/json 
        body: {"username":"{{ admin_vrops }}","authSource":"{{authSource_vrops }}","password":"{{ passadmin_vrops }}","others":[],"otherAttributes":{}} 
        return_content: yes
      register: full_login
    - name: Adding Users
      uri:
        url: "{{ add_api_url }}"
        validate_certs: no
        method: POST
        body_format: json
        status_code: 201
        headers:
          Content-Type: application/json
          Accept: application/json
          Authorization: vRealizeOpsToken {{ full_login['json']['token'] }}
        body: {"username":"{{ item.username }}","firstName":"{{ item.firstName }}","lastName":"{{ item.lastName }}","emailAddress":"{{ item.emailAddress}}","password":"{{ item.password }}","enabled":"{{ item.enabled }}","role-permissions":[{"roleName":"{{ item.roleName }}","allowAllObjects":"{{ item.allowAllObjects }}"}],"otherAttributes":{"pswdChangeState":"true"}}
      with_items: "{{ users }}"

Ficheros de variables YAML:

userlist.yml

---
users:
  - { username: '', firstName: '', lastName: '', password: 'ChangeNOW@1', emailAddress: '', enabled: 'true', roleName: '', allowAllObjects: 'true' }
  - { username: 'example', firstName: 'User', lastName: 'Example', password: 'ChangeNOW@1', emailAddress: 'user.example@mylocaldomain.com', enabled: 'true', roleName: 'PowerUser-1', allowAllObjects: 'true' }

vrops01.yml

---
auth_api_url: "https://vrom.mylocaldomain.com/suite-api/api/auth/token/acquire"
add_api_url: "https://vrom.mylocaldomain.com/suite-api/api/auth/users"
admin_vrops: "admin"
authSource_vrops: "local"

Leave a Reply

Your email address will not be published. Required fields are marked *