
Aliyun Cli Manage
- 61 installs
- 396 repo stars
- Updated July 18, 2026
- cinience/alicloud-skills
Runs command-line operations on Alibaba Cloud resources via the aliyun CLI, including credential/profile setup, region selection, and API discovery.
About
Drives the generic aliyun CLI for list/query/create/update/delete operations across Alibaba Cloud resources, plus credential and region setup. A developer uses it for command-line resource management and CLI-based API discovery.
- Credential/profile setup and region/endpoint selection
- Ensures aliyun CLI is installed via a bundled script
Aliyun Cli Manage by the numbers
- 61 all-time installs (skills.sh)
- Ranked #682 of 1,039 Cloud & Infrastructure skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cinience/alicloud-skills --skill aliyun-cli-manageAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 61 |
|---|---|
| repo stars | ★ 396 |
| Last updated | July 18, 2026 |
| Repository | cinience/alicloud-skills ↗ |
What it does
Runs command-line operations on Alibaba Cloud resources via the aliyun CLI, including credential/profile setup, region selection, and API discovery.
Files
Category: tool
Alibaba Cloud Generic CLI (aliyun) Skill
Validation
mkdir -p output/aliyun-cli-manage
python skills/platform/cli/aliyun-cli-manage/scripts/ensure_aliyun_cli.py --help > output/aliyun-cli-manage/validate-help.txtPass criteria: command exits 0 and output/aliyun-cli-manage/validate-help.txt is generated.
Output And Evidence
- Save CLI version checks, API outputs, and error logs under
output/aliyun-cli-manage/. - For each mutating action, keep request parameters and result summaries.
Goals
- Use official
aliyunCLI to execute Alibaba Cloud OpenAPI operations. - Provide a standard flow for install, configuration, API discovery, execution, and troubleshooting.
Quick Flow
1. Run the version guard script first (check first, then decide whether to upgrade). 2. If not installed or check interval reached, the script downloads and installs the latest official package. 3. Configure credentials and default region (recommend default profile). 4. Use aliyun <product> --help / aliyun <product> <ApiName> --help to confirm parameters. 5. Run read-only queries first, then mutating operations.
Version Guard (Practical)
Prefer the bundled script to avoid unnecessary downloads on every run:
python skills/platform/cli/aliyun-cli-manage/scripts/ensure_aliyun_cli.pyDefault behavior:
- Check interval: 24 hours (configurable via environment variable).
- Within interval and version is sufficient: skip download.
- Exceeded interval / not installed / below minimum version: auto-download and install latest official package.
Optional controls (environment variables):
ALIYUN_CLI_CHECK_INTERVAL_HOURS=24:check interval.ALIYUN_CLI_FORCE_UPDATE=1:force update (ignore interval).ALIYUN_CLI_MIN_VERSION=3.2.9:minimum acceptable version.ALIYUN_CLI_INSTALL_DIR=~/.local/bin:installation directory.
Manual parameter examples:
python skills/platform/cli/aliyun-cli-manage/scripts/ensure_aliyun_cli.py \
--interval-hours 24 \
--min-version 3.2.9Install (Linux example)
curl -fsSL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz -o /tmp/aliyun-cli.tgz
mkdir -p ~/.local/bin
tar -xzf /tmp/aliyun-cli.tgz -C /tmp
mv /tmp/aliyun ~/.local/bin/aliyun
chmod +x ~/.local/bin/aliyun
~/.local/bin/aliyun versionConfigure Credentials
aliyun configure set \
--profile default \
--mode AK \
--access-key-id <AK> \
--access-key-secret <SK> \
--region cn-hangzhouView configured profiles:
aliyun configure listCommand structure
- Generic form:
aliyun <product> <ApiName> --Param1 value1 --Param2 value2 - REST form:
aliyun <product> [GET|POST|PUT|DELETE] <PathPattern> --body '...json...'
API Discovery and Parameter Validation
aliyun help
aliyun ecs --help
aliyun ecs DescribeRegions --helpCommon Read-Only Examples
# ECS: list regions
aliyun ecs DescribeRegions
# ECS: list instances by region
aliyun ecs DescribeInstances --RegionId cn-hangzhou
# SLS: list projects by endpoint
aliyun sls ListProject --endpoint cn-hangzhou.log.aliyuncs.com --size 100Common Issues
InvalidAccessKeyId.NotFound/SignatureDoesNotMatch:check AK/SK and profile.MissingRegionId:add--regionor configure default region in profile.- for SLS endpoint errors, explicitly pass
--endpoint <region>.log.aliyuncs.com.
Execution Recommendations
- Run
ensure_aliyun_cli.pybefore starting tasks. - If resource scope is unclear, query first then mutate.
- Before delete/overwrite operations, output the target resource list first.
- For batch operations, validate one item in a small scope first.
References
- Official source list:
references/sources.md
Prerequisites
- Configure least-privilege Alibaba Cloud credentials before execution.
- Prefer environment variables:
ALIBABACLOUD_ACCESS_KEY_ID,ALIBABACLOUD_ACCESS_KEY_SECRET, optionalALIBABACLOUD_REGION_ID. - If region is unclear, ask the user before running mutating operations.
Workflow
1) Confirm user intent, region, identifiers, and whether the operation is read-only or mutating. 2) Run one minimal read-only query first to verify connectivity and permissions. 3) Execute the target operation with explicit parameters and bounded scope. 4) Verify results and save output/evidence files.
interface:
display_name: "Alibaba Cloud Platform Aliyun Cli"
short_description: "Generic aliyun CLI operations"
default_prompt: "Use $aliyun-cli-manage to complete this platform/cli task on Alibaba Cloud."
Sources
- Alibaba Cloud CLI documentation hub (official):
- https://help.aliyun.com/zh/cli
- Install Alibaba Cloud CLI on Linux (official):
- https://help.aliyun.com/zh/cli/install-cli-on-linux
- Configure credentials for Alibaba Cloud CLI (official):
- https://help.aliyun.com/zh/cli/configure-credentials
- Alibaba Cloud OpenAPI Explorer and metadata (official):
- https://api.aliyun.com
#!/usr/bin/env python3
import argparse
import json
import os
import re
import shutil
import stat
import subprocess
import tarfile
import tempfile
import time
import urllib.request
from pathlib import Path
DOWNLOAD_URL = "https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz"
def parse_bool(v: str | None, default: bool = False) -> bool:
if v is None:
return default
return v.strip().lower() in {"1", "true", "yes", "y", "on"}
def parse_version(text: str) -> tuple[int, ...]:
m = re.search(r"(\d+\.\d+\.\d+)", text)
if not m:
return tuple()
return tuple(int(x) for x in m.group(1).split("."))
def version_string(v: tuple[int, ...]) -> str:
if not v:
return "unknown"
return ".".join(str(x) for x in v)
def run_version(binary: Path) -> tuple[tuple[int, ...], str]:
try:
out = subprocess.check_output([str(binary), "version"], text=True, stderr=subprocess.STDOUT)
except Exception:
return tuple(), ""
return parse_version(out), out.strip()
def load_state(path: Path) -> dict:
if not path.exists():
return {}
try:
return json.loads(path.read_text(encoding="utf-8"))
except Exception:
return {}
def save_state(path: Path, state: dict) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8")
def install_latest(target: Path) -> None:
target.parent.mkdir(parents=True, exist_ok=True)
with tempfile.TemporaryDirectory(prefix="aliyun-cli-update-") as td:
td_path = Path(td)
tgz_path = td_path / "aliyun-cli.tgz"
with urllib.request.urlopen(DOWNLOAD_URL, timeout=30) as resp: # nosec B310
tgz_path.write_bytes(resp.read())
with tarfile.open(tgz_path, "r:gz") as tf:
member = None
for m in tf.getmembers():
if Path(m.name).name == "aliyun":
member = m
break
if member is None:
raise RuntimeError("aliyun binary not found in archive")
tf.extract(member, path=td_path)
extracted = td_path / member.name
if not extracted.exists():
raise RuntimeError("extracted aliyun binary missing")
shutil.copy2(extracted, target)
mode = target.stat().st_mode
target.chmod(mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser(description="Ensure aliyun CLI is installed and periodically updated")
p.add_argument("--interval-hours", type=float, default=None, help="check interval in hours (default from env or 24)")
p.add_argument("--min-version", default=None, help="minimum acceptable version, e.g. 3.2.9")
p.add_argument("--install-dir", default=None, help="install directory (default: ~/.local/bin)")
p.add_argument("--binary-path", default=None, help="explicit aliyun binary path")
p.add_argument("--state-file", default=None, help="state file path")
p.add_argument("--force", action="store_true", help="force update now")
return p
def main() -> int:
args = build_parser().parse_args()
interval_hours = args.interval_hours
if interval_hours is None:
interval_hours = float(os.getenv("ALIYUN_CLI_CHECK_INTERVAL_HOURS", "24"))
force = args.force or parse_bool(os.getenv("ALIYUN_CLI_FORCE_UPDATE"))
min_version_str = args.min_version or os.getenv("ALIYUN_CLI_MIN_VERSION", "").strip()
min_version = parse_version(min_version_str) if min_version_str else tuple()
install_dir = Path(args.install_dir or os.getenv("ALIYUN_CLI_INSTALL_DIR", str(Path.home() / ".local/bin"))).expanduser()
default_state = Path.home() / ".cache/aliyun-cli-manage/state.json"
state_file = Path(args.state_file).expanduser() if args.state_file else default_state
if args.binary_path:
target = Path(args.binary_path).expanduser()
else:
in_path = shutil.which("aliyun")
if in_path and os.access(in_path, os.W_OK):
target = Path(in_path)
else:
target = install_dir / "aliyun"
state = load_state(state_file)
now = int(time.time())
last_check = int(state.get("last_check_epoch", 0) or 0)
due_by_interval = last_check <= 0 or (now - last_check) >= int(interval_hours * 3600)
exists = target.exists()
current_version, raw_version = run_version(target) if exists else (tuple(), "")
below_min = bool(min_version and (not current_version or current_version < min_version))
should_update = force or (not exists) or due_by_interval or below_min
print(f"[aliyun-cli] target={target}")
print(f"[aliyun-cli] current_version={version_string(current_version)}")
if min_version:
print(f"[aliyun-cli] min_version={version_string(min_version)}")
print(f"[aliyun-cli] last_check_epoch={last_check} interval_hours={interval_hours}")
updated = False
if should_update:
print("[aliyun-cli] updating from official latest package...")
install_latest(target)
updated = True
current_version, raw_version = run_version(target)
print(f"[aliyun-cli] updated_version={version_string(current_version)}")
else:
print("[aliyun-cli] skip update (within interval and version acceptable)")
state.update(
{
"last_check_epoch": now,
"binary_path": str(target),
"version": version_string(current_version),
"updated": updated,
"raw_version": raw_version,
}
)
save_state(state_file, state)
print(f"[aliyun-cli] state_file={state_file}")
if min_version and current_version and current_version < min_version:
print("[aliyun-cli] error: installed version is lower than required minimum")
return 2
if not current_version:
print("[aliyun-cli] error: unable to detect aliyun version after ensure")
return 3
return 0
if __name__ == "__main__":
raise SystemExit(main())