Selectel
Status: available · package wg-flow-plugin-selectel 0.1.1 · provider selectel · category cloud.
The plugin requests a project-scoped Keystone token and reads the Selectel service catalog. Inventory receives cloud servers as instances (Nova), dedicated and Chipcore servers (Dedicated API), network disks (Cinder), networks and floating IPs (Neutron), security groups, and load balancers (Octavia). The service user password stays in the agent YAML.
One source is one cloud project in one pool. The default pool is ru-9 and the default auth URL is https://cloud.api.selcloud.ru/identity/v3. For another pool (ru-3, ru-7, …) set OS_REGION_NAME from the OpenStack RC file. Servers in another pool need another source.
account_id is the account number in the top-right corner of the panel (OS_USER_DOMAIN_NAME and OS_PROJECT_DOMAIN_NAME). project_id is the cloud project id from the project menu on the cloud servers page (OS_PROJECT_ID), not the project name. The user is a service user from IAM → Service users with access to that project.
The plugin only reads the API.
DNS, S3, Managed Kubernetes, Managed Databases, and images are not collected in 0.1.1. If the pool catalog has no Octavia endpoint, load balancers are skipped and the source still succeeds. The dedicated list is account-wide: turn collect_dedicated off on extra sources of the same account, or inventory will see the same machines under another label.
Install
The agent must be connected to the API.
docker compose exec agent wg-flow-agent plugin install selectel
# or
wg-flow-agent plugin install selectelThen the local UI → Connections → selectel, or YAML.
What lands in inventory
| Selectel object | resource_type | Notes |
|---|---|---|
| Cloud server | instance | provider_resource_id = instance:{id}. ACTIVE → active, SHUTOFF and paused → stopped, transitional states → pending, ERROR → error. Region is the availability zone (ru-9a). The pool is metadata.pool. Public IPv4 → metadata.primary_ipv4, private addresses → metadata.private_ips. vCPU and RAM are cpu_cores and mem_gb. Local flavor disk is disk_gb only when it is greater than zero |
| Dedicated server | server | server:{uuid}. Dedicated API GET /resource, types server and serverchip. The name is user_desc, otherwise the configuration. active → active, processing → pending, expired → stopped. Public IPv4 from IPAM → metadata.primary_ipv4. Firewalls, network gear, and colocation are skipped |
| Network disk | storage | volume:{id}. available and in-use → active, creating → pending. Size in metadata.size_gb |
| Network | network | network:{id}. Subnet CIDRs in metadata.ip_ranges |
| Floating IP | network | floating-ip:{id}. metadata.product = floating_ip. DOWN → stopped |
| Security group | firewall | firewall:{id}. A short rule list in metadata |
| Load balancer | load_balancer | lb:{id}. operating_status: OFFLINE → stopped, provisioning_status: ERROR → error |
Inventory has no separate ip type, so a floating IP is a network.
Each collect flag can be turned off. A disabled slice is absent from the next successful sync, and inventory marks those rows inactive. An error while listing servers, disks, networks, or security groups fails the whole source: a partial list is not sent.
Several projects or pools mean several sources. provider_account is your label.
YAML
plugins:
selectel:
enabled: true
sources:
- id: ru9
provider_account: "selectel-ru9"
sync_interval_seconds: 300
auth_url: "https://cloud.api.selcloud.ru/identity/v3"
region: "ru-9"
username: "svc-inventory"
password: "…"
account_id: "123456"
project_id: "…"
collect_servers: true
collect_dedicated: true
collect_volumes: true
collect_networks: true
collect_floating_ips: true
collect_firewalls: true
collect_load_balancers: trueSource fields
| Field | Required | Description |
|---|---|---|
id | yes | Log key (selectel/ru9) |
provider_account | yes | Project label in inventory |
auth_url | no | Default https://cloud.api.selcloud.ru/identity/v3 |
region | no | Pool, default ru-9. This is OS_REGION_NAME |
username, password | yes | Service user |
account_id | yes | Account number |
project_id | yes | OS_PROJECT_ID |
collect_* | no | Default true |
sync_interval_seconds | no | Minimum 300 |
Check
wg-flow-agent status
wg-flow-agent dry-runJSON shows provider: selectel. Health requests a token and calls GET {nova}/servers/detail?limit=1. The password is not stored in inventory. If Nova rejects microversion 2.67, the server list is requested again without that header.
Common errors
| Symptom | What to check |
|---|---|
| 401 / 403 | Service user name and password, account number, and OS_PROJECT_ID. The user has a role on this project |
| Compute endpoint not found | region matches the pool where the servers were created. Another pool’s catalog is not used |
| Empty server list | collect_servers is on; the project has servers in this pool |
| Disks disappeared after sync | collect_volumes was turned off; inventory retires omitted rows |
| No load balancers | The pool catalog has no Octavia endpoint — the source did not fail |
| Duplicates from another plugin | A different provider is expected; merge them in the console |