
Инструмент командной строки для управления активациями ролей Azure Privileged Identity Management (PIM) непосредственно из вашего терминала.
Инструмент командной строки для управления активацией ролей Azure Privileged Identity Management (PIM) непосредственно из терминала.
Перед использованием azpim убедитесь, что у вас есть:
# Установка Azure CLI (если не установлен)
# См.: https://docs.microsoft.com/ru-ru/cli/azure/install-azure-cli
# Вход в Azure
az login
# Проверка, что вы вошли
az account show
# С помощью npm
npm install -g azpim
# С помощью pnpm
pnpm add -g azpim
# С помощью yarn
yarn global add azpim
После установки команда azpim будет доступна глобально.
Если вы ранее использовали azp-cli, ваши пресеты хранятся в ~/.config/azp-cli/ (или %APPDATA%\azp-cli\ в Windows). Для миграции:
presets.json в новое расположение: ~/.config/azpim/ (или %APPDATA%\azpim\)npm uninstall -g azp-cli# Клонирование репозитория
git clone https://github.com/tapanmeena/azpim.git
cd azpim
# Установка зависимостей
pnpm install
# Сборка проекта
pnpm build
# Создание глобальной ссылки для разработки
npm link
# После глобальной установки
azpim
# Или с конкретными командами
azpim activate
azpim deactivate
azpim preset list
azpim update
# Режим разработки (из исходников)
pnpm dev
Глобальные флаги:
--debug — Включить отладочное логирование--version — Показать номер версииВы можете проверить, доступна ли новая версия:
azpim update
# псевдоним
azpim upgrade
Примечания:
azpim update завершается с кодом 0, если версия актуальна, 2, если доступно обновление, и 1 при ошибке.--check-only — Только проверить и показать статус без инструкций по обновлению.--output json возвращает структурированный ответ, подходящий для скриптов.azpim activate и azpim deactivate также будут показывать краткое уведомление о доступном обновлении (только в текстовом режиме) не чаще одного раза в день.AZPIM_NO_UPDATE_NOTIFIER=1 (или AZPIM_DISABLE_UPDATE_CHECK=1).Кэш проверки обновлений хранится вместе с пресетами в вашем каталоге конфигурации:
~/.config/azpim/update-check.json (или $XDG_CONFIG_HOME/azpim/update-check.json)%APPDATA%\azpim\update-check.jsonИспользуйте флаги для активации или деактивации PIM-ролей напрямую, без интерактивного меню — идеально для скриптов и CI/CD.
# Активация одной роли по имени (неинтерактивно)
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Owner" \
--duration-hours 2 \
--justification "Break-glass for incident" \
--output json
# Активация нескольких ролей (повторите --role-name)
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--role-name "User Access Administrator"
# Если имя роли совпадает с несколькими доступными ролями (разные области),
# --non-interactive выдаст ошибку, если явно не разрешить активацию всех совпадений
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--allow-multiple
# Предварительный просмотр того, что произойдёт, без отправки запросов
azpim activate --non-interactive --dry-run \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--output json
# Деактивация конкретных ролей
azpim deactivate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Owner" \
--justification "Task completed"
# Деактивация по всем подпискам (опустите subscription-id)
azpim deactivate --non-interactive --yes \
--role-name "Contributor" \
--allow-multiple
Общие флаги (activate/deactivate):
--non-interactive — Отключить интерактивные подсказки-y, --yes — Пропустить подтверждения--subscription-id <id> — Целевая подписка (необязательно для deactivate)--role-name <name> — Имя(имена) ролей (можно повторять)--allow-multiple — Разрешить несколько совпадений ролей--dry-run — Предварительный просмотр без отправки--output <text|json> — Формат вывода (по умолчанию text)--quiet — Подавить необязательный выводСпецифичные для активации:
--duration-hours <n> — Длительность (1–8 часов, по умолчанию зависит от роли)--justification <text> — Обоснование активацииСпецифичные для деактивации:
--justification <text> — Обоснование деактивации (необязательно)Пресеты позволяют сохранять ваши ежедневные процедуры активации/деактивации (подписка + имена ролей + длительность + обоснование) и повторно использовать их с --preset <имя>.
По умолчанию пресеты хранятся в отдельном для каждого пользователя файле:
~/.config/azpim/presets.json (или $XDG_CONFIG_HOME/azpim/presets.json)%APPDATA%\azpim\presets.jsonПереопределите расположение с помощью:
AZPIM_PRESETS_PATH=/путь/к/presets.jsonПресет может определять один или оба блока:
activate: subscriptionId, roleNames[], durationHours, justification, allowMultipledeactivate: subscriptionId (необязательно), roleNames[], justification, allowMultiplejustification поддерживает простые шаблоны:
${date} → YYYY-MM-DD${datetime} → метка времени ISO${userPrincipalName} — получается из Microsoft Graph /me# Создание пресета (интерактивный мастер)
azpim preset add daily-ops
# Создание пресета с интеграцией Azure (загружает подписки/роли)
azpim preset add daily-ops --from-azure
# Редактирование пресета (интерактивный мастер)
azpim preset edit daily-ops
# Список всех пресетов
azpim preset list
# Показать детали одного пресета
azpim preset show daily-ops
# Удалить пресет
azpim preset remove daily-ops
# Использовать пресет (флаги всё ещё переопределяют значения пресета)
azpim activate --preset daily-ops --yes
# Неинтерактивный запуск с пресетом
azpim activate --preset daily-ops --non-interactive --yes --output json
# Деактивация с использованием пресета
azpim deactivate --preset daily-ops --non-interactive --yes
Когда вы создаёте пресет через azpim preset add, вы можете дополнительно установить его как пресет по умолчанию для activate и/или deactivate.
azpim activate --non-interactive --yes может работать без указания --subscription-id/--role-name.╔════════════════════════════════════════════════════╗
║ Azure PIM CLI - Role Activation Manager ║
╚════════════════════════════════════════════════════╝
✔ Authentication successful
┌─ User Information ──────────────────────────────────
│ Name: John Doe
│ Email: [email protected]
└──────────────────────────────────────────────────────
✔ Found 3 subscription(s)
? What would you like to do?
❯ ▶ Activate Role(s)
◼ Deactivate Role(s)
✕ Exit
Избранное позволяет пометить конкретные подписки для быстрого доступа. Избранные подписки отображаются вверху списков подписок в интерактивном меню.
По умолчанию избранное хранится отдельно для каждого пользователя:
~/.config/azpim/users/<userId>/favorites.json%APPDATA%\azpim\users\<userId>\favorites.jsonПереопределите расположение с помощью:
AZPIM_FAVORITES_PATH=/путь/к/favorites.json# Список всего избранного
azpim favorites list
azpim fav list
# Добавить подписку в избранное
azpim favorites add <subscription-id>
# Добавить, даже если подписка отсутствует в кэше
azpim favorites add <subscription-id> --force
# Удалить подписку из избранного
azpim favorites remove <subscription-id>
# Очистить всё избранное
azpim favorites clear
# Экспортировать избранное в файл
azpim favorites export ./my-favorites.json
# Импортировать избранное из файла (заменяет существующее)
azpim favorites import ./my-favorites.json
# Импортировать избранное и объединить с существующим
azpim favorites import ./my-favorites.json --merge
# Обновить кэш подписок
azpim favorites refresh
azpim автоматически кэширует информацию о подписках для ускорения запуска. Кэш имеет TTL (время жизни) 6 часов и автоматически обновляется по истечении срока.
Файлы кэша хранятся отдельно для каждого пользователя:
~/.config/azpim/users/<userId>/subscriptions-cache.json%APPDATA%\azpim\users\<userId>\subscriptions-cache.json# Принудительное обновление кэша подписок
azpim favorites refresh
# Запуск в режиме разработки с горячей перезагрузкой
pnpm dev
# Сборка TypeScript-проекта
pnpm build
# Запуск собранного приложения
pnpm start
# Проверка кода линтером
pnpm lint
В этом репозитории используется формат Keep a Changelog в файле CHANGELOG.md.
Для лучших результатов используйте Conventional Commits:
feat: ... (новая функция) — минорный бампfix: ... (исправление ошибки) — патч-бампchore: ..., docs: ..., refactor: ... (без бампа, если не ломающее изменение)Убедитесь, что в CHANGELOG.md есть актуальные записи под заголовком Unreleased.
Выполните одну из следующих команд:
# Автоматически определяет следующую версию на основе коммитов, обновляет CHANGELOG.md,
# изменяет package.json и создаёт git-тег.
pnpm release
# Предварительный просмотр того, что изменится
pnpm release:dry
# Принудительный конкретный бамп, если необходимо
pnpm release -- --release-as patch
pnpm release -- --release-as minor
pnpm release -- --release-as major
git push --follow-tags
npm publish
# или
pnpm publish
azpim/
├── src/
│ ├── index.ts # CLI entry point and command definitions
│ ├── core/ # Foundational utilities (no domain logic)
│ │ ├── constants.ts # Shared magic values and defaults
│ │ ├── errors.ts # Unified error handling utilities
│ │ ├── json-store.ts # Generic JSON file persistence
│ │ ├── paths.ts # Config/data file path resolution
│ │ └── ui.ts # Terminal UI (spinners, formatting, colors)
│ ├── azure/ # Azure SDK wrappers
│ │ ├── auth.ts # Azure CLI credential + Graph /me lookup
│ │ └── azure-pim.ts # PIM role activation/deactivation API
│ ├── data/ # Local data persistence
│ │ ├── favorites.ts # Favorites management
│ │ ├── presets.ts # Preset configuration and validation
│ │ ├── subscription-cache.ts # Subscription caching (6-hour TTL)
│ │ └── update-check.ts # Update notification system
│ └── cli/ # Interactive flows and command scaffolding
│ ├── cli.ts # Main menu loop and shared helpers
│ ├── command-handler.ts # Reusable command wrapper (auth, UI, errors)
│ ├── activate-flow.ts # Role activation (one-shot + interactive)
│ ├── deactivate-flow.ts # Role deactivation (one-shot + interactive)
│ ├── subscription-selector.ts # Subscription search/select with favorites
│ ├── favorites-manager.ts # Interactive favorites management menu
│ └── presets-cli.ts # Preset add/edit/manage wizards
├── package.json
├── tsconfig.json
├── CHANGELOG.md
└── README.md
Кодовая база следует многоуровневой модульной структуре:
core/ — Утилиты без зависимостей, общие для всего проекта. json-store.ts предоставляет общий шаблон загрузки/сохранения, используемый всеми файлами постоянного хранения. errors.ts централизует извлечение ошибок и обработку ошибок на уровне команд. constants.ts устраняет магические значения.azure/ — Тонкие обёртки вокруг Azure SDK (@azure/identity, @azure/arm-authorization) и лёгкий вызов Microsoft Graph /me через нативный fetch. Без логики пользовательского интерфейса.data/ — Локальное файловое хранение (избранное, пресеты, кэш подписок, состояние обновлений). Все используют json-store для единообразного ввода-вывода.cli/ — Пользовательские интерактивные процессы и scaffolding команд. предоставляет обёртку , которая устраняет шаблонный код (аутентификация, настройка UI, обработка ошибок) для всех команд Commander. Процессы активации и деактивации используют общую функцию из .Убедитесь, что Azure CLI установлен и доступен в вашей PATH:
az --version
Убедитесь, что вы вошли в Azure CLI:
az login
Проверьте, что ваша учётная запись имеет роли, доступные для PIM:
az account show
Проверьте, есть ли у вас необходимые разрешения в Azure AD
az login --refreshЭтот проект лицензирован по лицензии ISC.
Tapan Meena — [email protected]
Вклад приветствуется! Пожалуйста, не стесняйтесь отправлять Pull Request.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)| Команда | Псевдоним | Описание |
|---|
activate | a | Активировать роль в Azure PIM (по умолчанию) |
deactivate | d | Деактивировать роль в Azure PIM |
preset | - | Управление повторно используемыми пресетами |
favorites | fav | Управление избранными подписками |
check-update | update, upgrade | Проверка наличия новой версии |
help | - | Показать справочную информацию |
| Команда | Описание |
|---|
preset list | Список всех доступных пресетов |
preset show | Показать детали конкретного пресета |
preset add | Добавить новый пресет (интерактивный мастер) |
preset edit | Редактировать существующий пресет (интерактивный мастер) |
preset remove | Удалить пресет |
| Команда | Описание |
|---|
favorites list | Список всех избранных подписок |
favorites add | Добавить подписку в избранное |
favorites remove | Удалить подписку из избранного |
favorites clear | Очистить все избранное |
favorites export | Экспортировать избранное в файл |
favorites import | Импортировать избранное из файла |
favorites refresh | Обновить кэш подписок |
command-handler.tswithCommandHandlerselectSubscriptionInteractivesubscription-selector.ts| Переменная | Описание |
|---|
AZPIM_PRESETS_PATH | Переопределение пути к файлу пресетов |
AZPIM_FAVORITES_PATH | Переопределение пути к файлу избранного |
AZPIM_NO_UPDATE_NOTIFIER | Установите значение 1, чтобы отключить автоматическую проверку обновлений |
AZPIM_DISABLE_UPDATE_CHECK | Псевдоним для AZPIM_NO_UPDATE_NOTIFIER |