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"