Azure Commands (Key Vault + App Configuration)¶
Tip
Invoke as suve azure secret (Key Vault; aliases kv, keyvault) and suve azure param (App Configuration; aliases appconfig, ac, appcfg); the group also answers to az, and stage to stg. You can drop the azure prefix when Azure is the only active provider for that service — see Bare Aliases.
Azure splits into two services under suve azure:
| Command | Azure service | Versioning |
|---|---|---|
suve azure secret |
Key Vault | Versioned by opaque ids, no labels |
suve azure param |
App Configuration | Unversioned (single current value) |
Azure also supports the local staging workflow via suve azure stage (or the bare suve stage alias when Azure is the only active staging backend). It is per-service, because Key Vault and App Configuration keep separate staging state:
suve azure stage secret— Key Vault secrets. Full workflow (add/edit/delete/status/diff/apply/reset/tag/untag/export/import). Versions are immutable, so a stagededitapplies as a new version. Key Vault's modified time is second-granular, so conflict detection cannot see an out-of-band write that lands in the same wall-clock second as the recorded base — such a write is not flagged and can be overwritten on apply (see Conflict Detection).suve azure stage param— App Configuration settings. Because App Configuration is unversioned, staging uses last-write-wins (no modified-after conflict check). Tags are writable via a GET-merge-PUT, sotag/untagare available. Workflow:add/edit/delete/status/diff/apply/reset/tag/untag/export/import.
The two services keep distinct staging scopes, but provider-wide azure stage status/diff/apply/reset span both — each resolves its own scope and any service that is not configured (no --store-name/--vault-name) is skipped. See the staging workflow overview for the general flow.
suve azure secret (Key Vault)¶
Git-style access to Azure Key Vault secrets.
Note
Key Vault secrets are versioned by opaque ids (e.g. a 32-character hex string) and have no staging labels. Set the vault with --vault-name or AZURE_KEYVAULT_NAME.
suve azure secret show¶
Display a secret value with metadata.
Arguments:
| Argument | Description |
|---|---|
name |
Secret name with optional version specifier |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--parse-json |
-j |
false |
Pretty-print JSON values (keys sorted alphabetically) |
--no-pager |
- | false |
Disable pager output |
--raw |
- | false |
Output raw value only without metadata (for piping) |
--output |
- | text |
Output format: text (default) or json (cannot be used with --raw) |
Examples:
# Show current version
suve azure secret show my-secret --vault-name my-vault
# Show a specific version id
suve azure secret show my-secret#abc123 --vault-name my-vault
# Show previous version
suve azure secret show my-secret~ --vault-name my-vault
# Output raw value for piping (no trailing newline)
suve azure secret show --raw my-secret --vault-name my-vault | jq -r '.password'
# Structured JSON output
suve azure secret show --output=json my-secret --vault-name my-vault
Note
Timestamps respect the TZ environment variable. Use TZ=UTC or TZ=Asia/Tokyo to change the displayed timezone.
suve azure secret log¶
Show secret version history, similar to git log.
Command aliases: history
Arguments:
| Argument | Description |
|---|---|
name |
Secret name (without version specifier) |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--number |
-n |
10 |
Maximum number of versions to show |
--patch |
-p |
false |
Show diff between consecutive versions |
--parse-json |
-j |
false |
Format JSON values before diffing (use with --patch) |
--oneline |
- | false |
Compact one-line-per-version format |
--reverse |
- | false |
Show oldest versions first |
--since |
- | - | Show versions created after this date (RFC3339 format) |
--until |
- | - | Show versions created before this date (RFC3339 format) |
--no-pager |
- | false |
Disable pager output |
--output |
- | text |
Output format: text (default) or json |
Each version is listed with its opaque id, state (enabled/disabled), and creation date. Output is sorted with the most recent version first (use --reverse to flip).
Note
Disabled versions have no accessible value, so their --patch diffs are skipped.
Examples:
# Show last 10 versions
suve azure secret log my-secret --vault-name my-vault
# Show diffs between consecutive versions
suve azure secret log --patch my-secret --vault-name my-vault
# Compact one-line format
suve azure secret log --oneline my-secret --vault-name my-vault
# Output as JSON
suve azure secret log --output=json my-secret --vault-name my-vault
suve azure secret diff¶
Show differences between two secret versions in unified diff format.
If only one version/spec is specified, it is compared against the current version.
Argument Formats¶
| Format | Args | Example | Description |
|---|---|---|---|
| full spec | 2 | my-secret#abc my-secret#def |
Both args include name and version |
| full spec | 1 | my-secret#abc |
Compare the specified version with current |
| mixed | 2 | my-secret#abc '~' |
First full, second specifier only |
| partial spec | 2 | my-secret '~' |
Name + specifier → compare with current |
| partial spec | 3 | my-secret '~2' '~' |
Name + two specifiers |
Version Specifiers¶
| Specifier | Description | Example |
|---|---|---|
#VERSION |
Specific version by opaque id | #abc123... |
~ |
One version ago | ~ = current - 1 |
~N |
N versions ago | ~2 = current - 2 |
Note
Key Vault has no :LABEL syntax. Versions are addressed only by opaque id or shift.
Tip
~ without a number means ~1. You can chain shifts: ~~ = ~1~1 = ~2.
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--parse-json |
-j |
false |
Format JSON values before diffing |
--no-pager |
- | false |
Disable pager output |
--output |
- | text |
Output format: text (default) or json |
Examples¶
# Compare previous with current
suve azure secret diff my-secret~ --vault-name my-vault
# Compare two version ids
suve azure secret diff my-secret#abc my-secret#def --vault-name my-vault
# Format JSON values before diffing
suve azure secret diff --parse-json my-secret~ --vault-name my-vault
# Output comparison as JSON
suve azure secret diff --output=json my-secret~ --vault-name my-vault
Identical Version Warning¶
Warning
No diff is produced when the two sides have identical content; suve distinguishes two cases on stderr:
- Same version on both sides →
comparing identical versions, plus a hint to compare against the previous version (e.g.suve azure secret diff my-secret~1). - Distinct versions that happen to match →
versions differ but content is identical(no hint).
Partial Spec Format¶
Important
In partial spec format, quote specifiers to prevent shell interpretation — ~ expands to $HOME and # starts a comment in bash/zsh. Full spec format (embedding #/~ within the name) needs no quoting.
# Partial spec — quote the specifier
suve azure secret diff my-secret '~' --vault-name my-vault
# Full spec — no quoting needed
suve azure secret diff my-secret#abc my-secret#def --vault-name my-vault
suve azure secret list¶
List secrets in the vault.
Command aliases: ls
Arguments:
| Argument | Required | Description |
|---|---|---|
filter-prefix |
No | Filter secrets by name prefix |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--filter |
- | - | Filter by regex pattern (client-side) |
--show |
- | false |
Show secret values (format: <name><TAB><value>) |
--output |
- | text |
Output format: text (default) or json |
Examples:
# List all secrets in the vault
suve azure secret list --vault-name my-vault
# List secrets starting with "prod"
suve azure secret list prod --vault-name my-vault
# List with values
suve azure secret list --show prod --vault-name my-vault
# Output as JSON
suve azure secret list --output=json prod --vault-name my-vault
suve azure secret create¶
Create a new secret. The given value becomes the secret's first version.
Arguments:
| Argument | Description |
|---|---|
name |
Secret name |
value |
Secret value (optional; may instead be read from stdin with --value-stdin, or typed into $EDITOR when omitted) |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--value-stdin |
- | false |
Read the value from stdin instead of the positional argument (keeps it out of argv/ps and shell history) |
Note
The value can be provided as a positional argument, piped in with --value-stdin (so it never appears in ps/argv or shell history), or typed into $EDITOR when omitted.
Examples:
# Create a simple secret
suve azure secret create my-api-key "sk-12345" --vault-name my-vault
# Create a JSON secret
suve azure secret create my-config '{"host":"db"}' --vault-name my-vault
Note
create is for new secrets only. To add a new version to an existing secret, use suve azure secret update. To add tags after creation, use suve azure secret tag.
suve azure secret update¶
Update a secret's value by adding a new version. The new version becomes the current one; prior versions remain accessible by id.
Arguments:
| Argument | Description |
|---|---|
name |
Secret name |
value |
New secret value (optional; may instead be read from stdin with --value-stdin, or typed into $EDITOR when omitted) |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--yes |
- | false |
Skip confirmation prompt |
--value-stdin |
- | false |
Read the value from stdin instead of the positional argument (keeps it out of argv/ps and shell history) |
Note
The value can be provided as a positional argument, piped in with --value-stdin (so it never appears in ps/argv or shell history), or typed into $EDITOR when omitted.
Examples:
# Add a new version
suve azure secret update my-api-key "new-value" --vault-name my-vault
# Update without confirmation
suve azure secret update --yes my-api-key "new-value" --vault-name my-vault
Note
update fails if the secret doesn't exist. Use suve azure secret create to create a new secret.
suve azure secret delete¶
Delete a secret and all its versions.
Command aliases: rm
Arguments:
| Argument | Description |
|---|---|
name |
Secret name to delete |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--yes |
- | false |
Skip confirmation prompt |
Examples:
# Delete (with confirmation)
suve azure secret delete my-secret --vault-name my-vault
# Delete without confirmation
suve azure secret delete --yes my-secret --vault-name my-vault
Note
When the vault has soft-delete enabled, the secret is recoverable within the vault's retention window with suve azure secret restore (see below); otherwise deletion is permanent.
suve azure secret restore¶
Recover a soft-deleted Key Vault secret while it is still within the vault's soft-delete retention window (RecoverDeletedSecret), mirroring AWS Secrets Manager's restore.
Deletes stay soft — suve does not expose force-delete/purge for Key Vault (retention is a vault-level property, not a per-delete option), so a recently deleted secret can always be restored until the retention window elapses.
suve azure secret tag¶
Add or update tags on an existing secret.
Arguments:
| Argument | Description |
|---|---|
name |
Secret name |
key=value |
Tag in key=value format (one or more) |
Examples:
# Add single tag
suve azure secret tag my-api-key env=prod --vault-name my-vault
# Add multiple tags
suve azure secret tag my-api-key env=prod team=backend --vault-name my-vault
Note
If a tag key already exists, its value is updated.
suve azure secret untag¶
Remove tags from an existing secret.
Arguments:
| Argument | Description |
|---|---|
name |
Secret name |
key |
Tag key to remove (one or more) |
Examples:
# Remove single tag
suve azure secret untag my-api-key deprecated --vault-name my-vault
# Remove multiple tags
suve azure secret untag my-api-key env team --vault-name my-vault
Note
Non-existent keys are silently ignored.
suve azure param (App Configuration)¶
Access to Azure App Configuration key-values.
Important
App Configuration is UNVERSIONED: each key (with the default label) holds a single current value with no history. #, ~, and : are valid key characters — the whole argument is the literal key name, not a version specifier — so nothing is rejected at parse time; only log reports that history is unsupported. Set the store with --store-name or AZURE_APPCONFIG_NAME.
Because App Configuration has no versions, several commands behave differently from their AWS / Key Vault / Google Cloud counterparts:
| Command | Status |
|---|---|
show, list/ls, create, update, delete/rm |
Supported |
diff |
Supported, but compares two distinct keys (not two versions) |
log/history |
Unsupported -- always reports that history is unsupported |
tag, untag |
Supported -- written via a GET-merge-PUT with an ETag precondition (azappconfig/v2); the value and other tags are preserved |
suve azure param show¶
Display an App Configuration setting value with metadata.
Arguments:
| Argument | Description |
|---|---|
key |
Setting key (the literal key name; #/~/: are valid key characters, not version specifiers) |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--parse-json |
-j |
false |
Pretty-print JSON values (keys sorted alphabetically) |
--no-pager |
- | false |
Disable pager output |
--raw |
- | false |
Output raw value only without metadata (for piping) |
--output |
- | text |
Output format: text (default) or json (cannot be used with --raw) |
Examples:
# Show the setting value
suve azure param show my-key --store-name my-store
# Output raw value for piping (no trailing newline)
suve azure param show --raw my-key --store-name my-store
# Structured JSON output
suve azure param show --output=json my-key --store-name my-store
Note
#, ~, and : are valid key characters — the whole argument is the literal key name, not a version specifier — because App Configuration is unversioned.
suve azure param log¶
App Configuration has no version history.
Command aliases: history
Warning
This command exists only for parity with the other providers. It always reports that version history is unsupported (it never crashes). The --number, --patch, --parse-json, --oneline, --reverse, --since, and --until flags are accepted but have no effect.
Example:
suve azure param diff¶
Show differences between two settings in unified diff format.
Note
App Configuration is unversioned, so diff compares two distinct keys rather than two versions of one key. #/~/: in a key are literal characters, not version specifiers.
Arguments:
| Argument | Description |
|---|---|
key1 |
First setting key |
key2 |
Second setting key |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--parse-json |
-j |
false |
Format JSON values before diffing |
--no-pager |
- | false |
Disable pager output |
--output |
- | text |
Output format: text (default) or json |
Examples:
# Compare two settings
suve azure param diff key-a key-b --store-name my-store
# Output comparison as JSON
suve azure param diff --output=json key-a key-b --store-name my-store
suve azure param list¶
List settings (key-values) in the store.
Command aliases: ls
Arguments:
| Argument | Required | Description |
|---|---|---|
filter-prefix |
No | Filter keys by prefix |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--filter |
- | - | Filter by regex pattern (client-side) |
--show |
- | false |
Show setting values (format: <namespace><TAB><key><TAB><value>) |
--output |
- | text |
Output format: text (default) or json |
--hide-namespace |
--hide-ns |
false |
Drop the NAMESPACE column and list keys only |
Each text row starts with the setting's namespace; (NULL) is the null (default) namespace. The listing follows the group's --namespace filter: with no flag it shows the null namespace only, * shows every namespace, and dev,prod / dev* filter by OR / prefix. JSON output carries a namespace field.
Examples:
# List all settings in the store
suve azure param list --store-name my-store
# List settings starting with "app/"
suve azure param list app/ --store-name my-store
# List with values
suve azure param list --show app/ --store-name my-store
# List across all namespaces
suve azure param list --namespace '*' --store-name my-store
# List keys only, without the namespace column
suve azure param list --hide-ns app/ --store-name my-store
# Output as JSON
suve azure param list --output=json app/ --store-name my-store
suve azure param create¶
Create a new setting (key-value).
Arguments:
| Argument | Description |
|---|---|
key |
Setting key |
value |
Setting value (optional; may instead be read from stdin with --value-stdin, or typed into $EDITOR when omitted) |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--value-stdin |
- | false |
Read the value from stdin instead of the positional argument (keeps it out of argv/ps and shell history) |
Note
The value can be provided as a positional argument, piped in with --value-stdin (so it never appears in ps/argv or shell history), or typed into $EDITOR when omitted.
Examples:
# Create a simple setting
suve azure param create app/timeout "30" --store-name my-store
# Create a JSON setting
suve azure param create app/config '{"host":"db"}' --store-name my-store
Note
create is for new keys only. To change the value of an existing key, use suve azure param update.
suve azure param update¶
Update a setting's value. App Configuration is unversioned, so the value is replaced in place.
Arguments:
| Argument | Description |
|---|---|
key |
Setting key |
value |
New value (optional; may instead be read from stdin with --value-stdin, or typed into $EDITOR when omitted) |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--yes |
- | false |
Skip confirmation prompt |
--value-stdin |
- | false |
Read the value from stdin instead of the positional argument (keeps it out of argv/ps and shell history) |
Note
The value can be provided as a positional argument, piped in with --value-stdin (so it never appears in ps/argv or shell history), or typed into $EDITOR when omitted.
Examples:
# Replace the value
suve azure param update app/timeout "60" --store-name my-store
# Update without confirmation
suve azure param update --yes app/timeout "60" --store-name my-store
Note
Use suve azure param create to create a new setting. Because App Configuration is unversioned, there is no prior version to fall back to after an update.
suve azure param delete¶
Delete a setting (key-value).
Command aliases: rm
Arguments:
| Argument | Description |
|---|---|
key |
Setting key to delete |
Options:
| Option | Alias | Default | Description |
|---|---|---|---|
--yes |
- | false |
Skip confirmation prompt |
Examples:
# Delete (with confirmation)
suve azure param delete app/timeout --store-name my-store
# Delete without confirmation
suve azure param delete --yes app/timeout --store-name my-store
Caution
Deletion removes the current value for the key (default label). App Configuration is unversioned, so there is no prior version to fall back to.
suve azure param tag / untag¶
Add/update or remove tags on a setting. App Configuration's PUT replaces the whole key-value, so writes are a GET-merge-PUT: the current value and any other tags are read and re-sent, so tag/untag preserve them. An ETag (OnlyIfUnchanged) precondition guards against a concurrent write; on a 412 conflict the merge is re-tried a few times before the conflict is surfaced. A value write (suve azure param update) likewise re-sends existing tags so it does not clear them.
Examples: