
Una herramienta de interfaz de línea de comandos para gestionar las activaciones de roles de Azure Privileged Identity Management (PIM) directamente desde tu terminal.
Una herramienta de línea de comandos para gestionar activaciones de roles de Azure Privileged Identity Management (PIM) directamente desde tu terminal.
Antes de usar azpim, asegúrate de tener:
# Instalar Azure CLI (si no está instalado)
# Ver: https://docs.microsoft.com/es-es/cli/azure/install-azure-cli
# Iniciar sesión en Azure
az login
# Verificar que has iniciado sesión
az account show
# Usando npm
npm install -g azpim
# Usando pnpm
pnpm add -g azpim
# Usando yarn
yarn global add azpim
Después de la instalación, el comando azpim estará disponible globalmente.
Si usabas azp-cli anteriormente, tus presets se almacenan en ~/.config/azp-cli/ (o %APPDATA%\azp-cli\ en Windows). Para migrar:
presets.json a la nueva ubicación: ~/.config/azpim/ (o %APPDATA%\azpim\)npm uninstall -g azp-cli# Clonar el repositorio
git clone https://github.com/tapanmeena/azpim.git
cd azpim
# Instalar dependencias
pnpm install
# Construir el proyecto
pnpm build
# Enlazar globalmente para desarrollo
npm link
# Después de la instalación global
azpim
# O con comandos específicos
azpim activate
azpim deactivate
azpim preset list
azpim update
# Modo de desarrollo (desde el código fuente)
pnpm dev
Flags globales:
--debug - Habilitar registro de depuración--version - Mostrar número de versiónPuedes verificar si hay una versión más reciente disponible:
azpim update
# alias
azpim upgrade
Notas:
azpim update termina con código 0 si está actualizado, 2 si hay una actualización disponible y 1 en caso de error.--check-only - Solo verificar y mostrar el estado sin mostrar instrucciones de actualización.--output json devuelve una respuesta estructurada adecuada para scripts.azpim activate y azpim deactivate también mostrarán un breve aviso de "actualización disponible" (solo modo texto) como máximo una vez al día.AZPIM_NO_UPDATE_NOTIFIER=1 (o AZPIM_DISABLE_UPDATE_CHECK=1).La caché de comprobación de actualizaciones se almacena junto con los presets en tu directorio de configuración:
~/.config/azpim/update-check.json (o $XDG_CONFIG_HOME/azpim/update-check.json)%APPDATA%\azpim\update-check.jsonUsa flags para activar o desactivar roles de PIM directamente sin pasar por el menú interactivo, perfecto para scripting y flujos de trabajo CI/CD.
# Activar un solo rol por nombre (no interactivo)
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Owner" \
--duration-hours 2 \
--justification "Break-glass por incidente" \
--output json
# Activar múltiples roles (repetir --role-name)
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--role-name "User Access Administrator"
# Si un nombre de rol coincide con varios roles elegibles (diferentes ámbitos),
# --non-interactive dará error a menos que permitas explícitamente activar todas las coincidencias
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--allow-multiple
# Vista previa de lo que sucedería sin enviar solicitudes
azpim activate --non-interactive --dry-run \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--output json
# Desactivar roles específicos
azpim deactivate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Owner" \
--justification "Tarea completada"
# Desactivar en todas las suscripciones (omitir subscription-id)
azpim deactivate --non-interactive --yes \
--role-name "Contributor" \
--allow-multiple
Flags comunes (activate/deactivate):
--non-interactive - Deshabilitar indicaciones interactivas-y, --yes - Omitir indicaciones de confirmación--subscription-id <id> - Suscripción objetivo (opcional para deactivate)--role-name <name> - Nombre(s) de rol(es) a objetivo (se puede repetir)--allow-multiple - Permitir múltiples coincidencias de roles--dry-run - Vista previa sin enviar--output <text|json> - Formato de salida (predeterminado: text)--quiet - Suprimir salida no esencialEspecíficos de activación:
--duration-hours <n> - Duración (1-8 horas, el predeterminado varía según el rol)--justification <text> - Justificación para la activaciónEspecíficos de desactivación:
--justification <text> - Justificación para la desactivación (opcional)Los presets te permiten guardar tus rutinas diarias de activación/desactivación (suscripción + nombres de roles + duración + justificación) y reutilizarlas con --preset <name>.
Por defecto, los presets se almacenan en un archivo de configuración por usuario:
~/.config/azpim/presets.json (o $XDG_CONFIG_HOME/azpim/presets.json)%APPDATA%\azpim\presets.jsonPuedes sobrescribir la ubicación con:
AZPIM_PRESETS_PATH=/ruta/a/presets.jsonUn preset puede definir uno o ambos bloques:
activate: subscriptionId, roleNames[], durationHours, justification, allowMultipledeactivate: subscriptionId (opcional), roleNames[], justification, allowMultiplejustification admite plantillas simples:
${date} → YYYY-MM-DD${datetime} → Marca de tiempo ISO${userPrincipalName} → resuelto desde Microsoft Graph /me# Crear un preset (asistente interactivo)
azpim preset add daily-ops
# Crear un preset con integración de Azure (obtiene suscripciones/roles)
azpim preset add daily-ops --from-azure
# Editar un preset (asistente interactivo)
azpim preset edit daily-ops
# Listar todos los presets
azpim preset list
# Mostrar detalles de un preset
azpim preset show daily-ops
# Eliminar un preset
azpim preset remove daily-ops
# Usar un preset (los flags aún sobrescriben los valores del preset)
azpim activate --preset daily-ops --yes
# Ejecución no interactiva usando el preset
azpim activate --preset daily-ops --non-interactive --yes --output json
# Desactivar usando un preset
azpim deactivate --preset daily-ops --non-interactive --yes
Cuando creas un preset mediante azpim preset add, puedes opcionalmente configurarlo como predeterminado para activate y/o deactivate.
azpim activate --non-interactive --yes puede funcionar sin especificar --subscription-id/--role-name.╔════════════════════════════════════════════════════╗
║ Azure PIM CLI - Administrador de activación de roles ║
╚════════════════════════════════════════════════════╝
✔ Autenticación exitosa
┌─ Información del usuario ──────────────────────────
│ Nombre: Juan Pérez
│ Correo electrónico: [email protected]
└──────────────────────────────────────────────────────
✔ Se encontraron 3 suscripción(es)
? ¿Qué te gustaría hacer?
❯ ▶ Activar rol(es)
◼ Desactivar rol(es)
✕ Salir
Los favoritos te permiten marcar suscripciones específicas para acceso rápido. Las suscripciones favoritas se muestran al principio de las listas de suscripciones en el menú interactivo.
Por defecto, los favoritos se almacenan por usuario:
~/.config/azpim/users/<userId>/favorites.json%APPDATA%\azpim\users\<userId>\favorites.jsonPuedes sobrescribir la ubicación con:
AZPIM_FAVORITES_PATH=/ruta/a/favorites.json# Listar todos los favoritos
azpim favorites list
azpim fav list
# Añadir una suscripción a favoritos
azpim favorites add <subscription-id>
# Añadir incluso si la suscripción no está en caché
azpim favorites add <subscription-id> --force
# Eliminar una suscripción de favoritos
azpim favorites remove <subscription-id>
# Borrar todos los favoritos
azpim favorites clear
# Exportar favoritos a un archivo
azpim favorites export ./my-favorites.json
# Importar favoritos desde un archivo (reemplaza los existentes)
azpim favorites import ./my-favorites.json
# Importar favoritos y fusionar con los existentes
azpim favorites import ./my-favorites.json --merge
# Refrescar la caché de suscripciones
azpim favorites refresh
azpim almacena automáticamente en caché la información de las suscripciones para mejorar el tiempo de inicio. La caché tiene un TTL (tiempo de vida) de 6 horas y se actualiza automáticamente cuando caduca.
Los archivos de caché se almacenan por usuario:
~/.config/azpim/users/<userId>/subscriptions-cache.json%APPDATA%\azpim\users\<userId>\subscriptions-cache.json# Forzar el refresco de la caché de suscripciones
azpim favorites refresh
# Ejecutar en modo desarrollo con recarga en caliente
pnpm dev
# Construir el proyecto TypeScript
pnpm build
# Ejecutar la aplicación compilada
pnpm start
# Verificar el código con linter
pnpm lint
Este repositorio usa el formato Keep a Changelog en CHANGELOG.md.
Para mejores resultados, usa Conventional Commits:
feat: ... (nueva funcionalidad) → incremento menorfix: ... (corrección de error) → incremento de parchechore: ..., docs: ..., refactor: ... (sin incremento a menos que sea rupturista)Asegúrate de que CHANGELOG.md tenga entradas actualizadas bajo Unreleased.
Ejecuta uno de los siguientes:
# Determina automáticamente la próxima versión a partir de los commits, actualiza CHANGELOG.md,
# incrementa la versión en package.json y crea una etiqueta git.
pnpm release
# Vista previa de lo que cambiaría
pnpm release:dry
# Forzar un incremento específico si es necesario
pnpm release -- --release-as patch
pnpm release -- --release-as minor
pnpm release -- --release-as major
git push --follow-tags
npm publish
# o
pnpm publish
azpim/
├── src/
│ ├── index.ts # Punto de entrada de la CLI y definiciones de comandos
│ ├── core/ # Utilidades fundamentales (sin lógica de dominio)
│ │ ├── constants.ts # Valores mágicos compartidos y predeterminados
│ │ ├── errors.ts # Utilidades unificadas de manejo de errores
│ │ ├── json-store.ts # Persistencia genérica de archivos JSON
│ │ ├── paths.ts # Resolución de rutas de archivos de configuración/datos
│ │ └── ui.ts # Interfaz de terminal (spinners, formato, colores)
│ ├── azure/ # Envoltorios del SDK de Azure
│ │ ├── auth.ts # Credencial de Azure CLI + búsqueda de Graph /me
│ │ └── azure-pim.ts # API de activación/desactivación de roles PIM
│ ├── data/ # Persistencia local de datos
│ │ ├── favorites.ts # Gestión de favoritos
│ │ ├── presets.ts # Configuración y validación de presets
│ │ ├── subscription-cache.ts # Caché de suscripciones (TTL de 6 horas)
│ │ └── update-check.ts # Sistema de notificación de actualizaciones
│ └── cli/ # Flujos interactivos y andamiaje de comandos
│ ├── cli.ts # Bucle principal del menú y ayudantes compartidos
│ ├── command-handler.ts # Envoltorio de comando reutilizable (auth, UI, errores)
│ ├── activate-flow.ts # Activación de roles (un solo paso + interactivo)
│ ├── deactivate-flow.ts # Desactivación de roles (un solo paso + interactivo)
│ ├── subscription-selector.ts # Búsqueda/selección de suscripciones con favoritos
│ ├── favorites-manager.ts # Menú interactivo de gestión de favoritos
│ └── presets-cli.ts # Asistentes para añadir/editar/gestionar presets
├── package.json
├── tsconfig.json
├── CHANGELOG.md
└── README.md
El código sigue una estructura de módulos en capas:
core/ — Utilidades sin dependencias compartidas en todo el proyecto. json-store.ts proporciona un patrón genérico de carga/guardado usado por todos los archivos de persistencia de datos. errors.ts centraliza la extracción de errores y el manejo de errores a nivel de comando. constants.ts elimina los valores mágicos.azure/ — Envoltorios ligeros alrededor de los SDK de Azure (@azure/identity, @azure/arm-authorization) y una llamada ligera a Microsoft Graph /me mediante fetch nativo. Sin lógica de UI.data/ — Persistencia local de archivos (favoritos, presets, caché de suscripciones, estado de actualizaciones). Todos usan json-store para E/S consistente de archivos.cli/ — Flujos interactivos orientados al usuario y andamiaje de comandos. proporciona un envoltorio que elimina el código repetitivo (auth, configuración de UI, manejo de errores) en todos los comandos de Commander. Los flujos de activación y desactivación comparten una función de .Asegúrate de que Azure CLI esté instalado y accesible en tu PATH:
az --version
Asegúrate de haber iniciado sesión en Azure CLI:
az login
Verifica que tu cuenta tenga roles elegibles para PIM:
az account show
Comprueba si tienes los permisos necesarios en Azure AD
az login --refreshEste proyecto está licenciado bajo la Licencia ISC.
Tapan Meena - [email protected]
¡Las contribuciones son bienvenidas! No dudes en enviar un Pull Request.
git checkout -b feature/caracteristica-increible)git commit -m 'Añadir alguna característica increíble')git push origin feature/caracteristica-increible)| Comando | Alias | Descripción |
|---|
activate | a | Activar un rol en Azure PIM (predeterminado) |
deactivate | d | Desactivar un rol en Azure PIM |
preset | - | Gestionar presets reutilizables |
favorites | fav | Gestionar suscripciones favoritas |
check-update | update, upgrade | Verificar si hay una versión más reciente |
help | - | Mostrar información de ayuda |
| Comando | Descripción |
|---|
preset list | Listar todos los presets disponibles |
preset show | Mostrar detalles de un preset específico |
preset add | Añadir un nuevo preset (asistente interactivo) |
preset edit | Editar un preset existente (asistente interactivo) |
preset remove | Eliminar un preset |
| Comando | Descripción |
|---|
favorites list | Listar todas las suscripciones favoritas |
favorites add | Añadir una suscripción a favoritos |
favorites remove | Eliminar una suscripción de favoritos |
favorites clear | Borrar todos los favoritos |
favorites export | Exportar favoritos a un archivo |
favorites import | Importar favoritos desde un archivo |
favorites refresh | Refrescar la caché de suscripciones |
command-handler.tswithCommandHandlerselectSubscriptionInteractivesubscription-selector.ts| Variable | Descripción |
|---|
AZPIM_PRESETS_PATH | Sobrescribe la ruta del archivo de presets |
AZPIM_FAVORITES_PATH | Sobrescribe la ruta del archivo de favoritos |
AZPIM_NO_UPDATE_NOTIFIER | Establecer a 1 para deshabilitar comprobaciones automáticas de actualización |
AZPIM_DISABLE_UPDATE_CHECK | Alias para AZPIM_NO_UPDATE_NOTIFIER |