{"id":166052,"date":"2026-04-14T11:53:42","date_gmt":"2026-04-14T08:53:42","guid":{"rendered":"https:\/\/computingforgeeks.com\/ansible-dynamic-inventory-tutorial\/"},"modified":"2026-04-14T11:53:42","modified_gmt":"2026-04-14T08:53:42","slug":"ansible-dynamic-inventory-tutorial","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/ansible-dynamic-inventory-tutorial\/","title":{"rendered":"Setup Ansible Dynamic Inventory for Auto Host Discovery"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Static inventory files work until you have more than a handful of servers. Once VMs spin up and down in Proxmox, instances launch in AWS, or containers scale in Kubernetes, maintaining a text file of hostnames becomes a losing game. Dynamic inventory solves this by querying your infrastructure directly and building the host list at runtime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers three approaches: the Proxmox inventory plugin (tested against a real 3-node cluster), a Python script-based inventory for custom sources, and the AWS EC2 plugin configuration. We test on Rocky Linux 10.1 with <a href=\"https:\/\/computingforgeeks.com\/ansible-automation-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ansible<\/a> 13.5.0 (ansible-core 2.20.4) and the community.proxmox 1.6.0 collection. For static inventory basics, see the <a href=\"https:\/\/computingforgeeks.com\/ansible-inventory-management\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ansible inventory management<\/a> guide.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Tested <strong>April 2026<\/strong> on Rocky Linux 10.1, ansible-core 2.20.4, community.proxmox 1.6.0, Proxmox VE 8.x cluster<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ansible installed on a control node (<a href=\"https:\/\/computingforgeeks.com\/install-ansible-rocky-linux-ubuntu\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install Ansible on Rocky Linux 10 \/ Ubuntu 24.04<\/a>)<\/li>\n<li>For Proxmox: API access to a Proxmox VE cluster with an API token<\/li>\n<li>Python <code>proxmoxer<\/code> library: <code>pip3 install proxmoxer requests<\/code><\/li>\n<li>The <code>community.proxmox<\/code> collection: <code>ansible-galaxy collection install community.proxmox<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How Dynamic Inventory Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of a static <code>inventory.ini<\/code> file, Ansible accepts an inventory source that returns JSON in a specific format. This source can be a YAML plugin config file or an executable script. At runtime, Ansible calls the source, gets back a list of hosts with their groups and variables, and proceeds as if you&#8217;d written it all by hand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key difference: static inventory is a snapshot that goes stale. Dynamic inventory reflects reality every time you run a playbook.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proxmox Dynamic Inventory Plugin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>community.proxmox.proxmox<\/code> plugin queries the Proxmox API and discovers all VMs and containers across your cluster. It auto-groups hosts by node, type (QEMU\/LXC), and running status.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Create an API Token<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Generate a dedicated API token on your Proxmox node. This avoids using your root password in config files:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>pveum user token add root@pam ansible-inventory --privsep=0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output provides the token ID and secret value:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 key          \u2502 value                                \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 full-tokenid \u2502 root@pam!ansible-inventory           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 value        \u2502 6c4de701-024e-446d-aa3b-xxxxxxxxxxxx \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Save the token secret. You won&#8217;t be able to retrieve it again from Proxmox. The <code>--privsep=0<\/code> flag gives the token the same permissions as the user (root in this case). For production, create a dedicated user with read-only access to <code>\/vms<\/code> instead.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configure the Inventory Plugin<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a file ending in <code>.proxmox.yml<\/code> or <code>.proxmox.yaml<\/code>. The filename suffix is how Ansible recognizes it as a Proxmox inventory source:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>vi inventory.proxmox.yml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the plugin configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>---\nplugin: community.proxmox.proxmox\nurl: https:\/\/10.0.1.3:8006\nuser: root@pam\ntoken_id: ansible-inventory\ntoken_secret: 6c4de701-024e-446d-aa3b-xxxxxxxxxxxx\nvalidate_certs: false\nwant_proxmox_nodes_ansible_host: false\nwant_facts: true<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Set <code>validate_certs: false<\/code> if your Proxmox instance uses a self-signed certificate (common in homelab and internal environments). In production with proper certificates, set this to <code>true<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test the Discovery<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the plugin discovers your VMs with <code>ansible-inventory --graph<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>ansible-inventory -i inventory.proxmox.yml --graph<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output shows every VM across the cluster, automatically grouped by Proxmox node, type, and status:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>@all:\n  |--@proxmox_all_qemu:\n  |  |--Rocky-10-Enock\n  |  |--Debian-13-Enock\n  |  |--ansible-controller\n  |  |--ansible-rocky-managed\n  |  |--ansible-ubuntu-managed\n  |--@proxmox_all_running:\n  |  |--Rocky-10-Enock\n  |  |--Debian-13-Enock\n  |  |--ansible-controller\n  |  |--ansible-rocky-managed\n  |  |--ansible-ubuntu-managed\n  |--@proxmox_nodes:\n  |  |--pve01\n  |  |--pve02\n  |  |--pve03\n  |--@proxmox_pve02_qemu:\n  |  |--Rocky-10-Enock\n  |  |--ansible-controller\n  |  |--ansible-rocky-managed\n  |--@proxmox_pve01_qemu:\n  |  |--ansible-ubuntu-managed<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Without writing a single line of inventory, Ansible now knows about every VM in the cluster. VMs that get created or destroyed are automatically included or excluded on the next run.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Custom Groups with the groups Parameter<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The auto-generated groups (<code>proxmox_all_qemu<\/code>, <code>proxmox_pve01_qemu<\/code>) are useful but generic. The <code>groups<\/code> parameter lets you create meaningful groups based on VM names or other Proxmox attributes:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>---\nplugin: community.proxmox.proxmox\nurl: https:\/\/10.0.1.3:8006\nuser: root@pam\ntoken_id: ansible-inventory\ntoken_secret: 6c4de701-024e-446d-aa3b-xxxxxxxxxxxx\nvalidate_certs: false\nwant_facts: true\n\n# Custom groups based on VM name patterns\ngroups:\n  ansible_lab: \"'ansible' in proxmox_name\"\n  rocky_vms: \"'Rocky' in proxmox_name or 'rocky' in proxmox_name\"\n  ubuntu_vms: \"'ubuntu' in proxmox_name or 'u2604' in proxmox_name\"\n\n# Set ansible_host from cloud-init IP config\ncompose:\n  ansible_host: proxmox_ipconfig0.ip | default(omit)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now the inventory includes your custom groups alongside the auto-generated ones:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>  |--@ansible_lab:\n  |  |--ansible-controller\n  |  |--ansible-rocky-managed\n  |  |--ansible-ubuntu-managed\n  |--@rocky_vms:\n  |  |--Rocky-10-Enock\n  |  |--Rocky-10\n  |  |--ansible-rocky-managed\n  |--@ubuntu_vms:\n  |  |--ansible-ubuntu-managed\n  |  |--u2604-ansible\n  |  |--u2604-compose<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>compose<\/code> section sets <code>ansible_host<\/code> from the cloud-init IP configuration stored in Proxmox. This means Ansible knows how to reach each VM without you specifying IPs anywhere.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/04\/wm-ansible-dynamic-inventory-proxmox-rocky-10.png\" alt=\"Proxmox dynamic inventory discovering VMs across cluster nodes\" title=\"\"><figcaption>Dynamic inventory auto-discovering VMs across a 3-node Proxmox cluster with custom group assignments<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Script-Based Dynamic Inventory<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When no official plugin exists for your infrastructure (a custom CMDB, an internal API, a spreadsheet), you can write a Python script that Ansible calls as an inventory source. The script must support two flags: <code>--list<\/code> (return all hosts and groups) and <code>--host &lt;hostname&gt;<\/code> (return vars for one host).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Inventory Script Format<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create an executable Python script:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>vi dynamic_inventory.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the inventory logic:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>#!\/usr\/bin\/env python3\n\"\"\"Script-based dynamic inventory example.\"\"\"\nimport json, sys\n\ndef get_inventory():\n    return {\n        \"webservers\": {\n            \"hosts\": [\"web01\", \"web02\"],\n            \"vars\": {\"http_port\": 80, \"deploy_user\": \"www-data\"}\n        },\n        \"databases\": {\n            \"hosts\": [\"db01\"],\n            \"vars\": {\"db_port\": 5432, \"backup_schedule\": \"daily\"}\n        },\n        \"_meta\": {\n            \"hostvars\": {\n                \"web01\": {\"ansible_host\": \"10.0.1.10\", \"server_role\": \"primary\"},\n                \"web02\": {\"ansible_host\": \"10.0.1.11\", \"server_role\": \"secondary\"},\n                \"db01\": {\"ansible_host\": \"10.0.1.20\", \"db_engine\": \"postgresql\"}\n            }\n        }\n    }\n\nif __name__ == \"__main__\":\n    if len(sys.argv) == 2 and sys.argv[1] == \"--list\":\n        print(json.dumps(get_inventory(), indent=2))\n    elif len(sys.argv) == 3 and sys.argv[1] == \"--host\":\n        hostvars = get_inventory()[\"_meta\"][\"hostvars\"]\n        print(json.dumps(hostvars.get(sys.argv[2], {}), indent=2))\n    else:\n        print(json.dumps({\"_meta\": {\"hostvars\": {}}}))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Make it executable and test:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>chmod +x dynamic_inventory.py\nansible-inventory -i dynamic_inventory.py --graph<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ansible discovers the hosts and groups from the script output:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>@all:\n  |--@ungrouped:\n  |--@webservers:\n  |  |--web01\n  |  |--web02\n  |--@databases:\n  |  |--db01<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>_meta<\/code> section with <code>hostvars<\/code> is critical. Without it, Ansible would call <code>--host<\/code> for every single host individually, which is slow. Including <code>_meta<\/code> in the <code>--list<\/code> response lets Ansible get all host variables in a single call.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In production, replace the hardcoded dictionary with an API call to your CMDB, cloud provider, or service registry. The JSON format stays the same.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AWS EC2 Dynamic Inventory<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>amazon.aws.aws_ec2<\/code> plugin discovers EC2 instances. Install the collection first:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>ansible-galaxy collection install amazon.aws\npip3 install boto3 botocore<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create a file ending in <code>.aws_ec2.yml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>---\nplugin: amazon.aws.aws_ec2\nregions:\n  - eu-west-1\nfilters:\n  instance-state-name: running\n  \"tag:Environment\": production\n\nkeyed_groups:\n  - key: tags.Role\n    prefix: role\n  - key: placement.availability_zone\n    prefix: az\n\ncompose:\n  ansible_host: private_ip_address<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>keyed_groups<\/code> parameter creates Ansible groups from EC2 tags. An instance tagged <code>Role: webserver<\/code> in <code>eu-west-1a<\/code> would appear in both <code>role_webserver<\/code> and <code>az_eu_west_1a<\/code> groups. The <code>compose<\/code> section sets <code>ansible_host<\/code> to the private IP, which works when your Ansible controller runs inside the same VPC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Combining Static and Dynamic Inventory<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ansible can use multiple inventory sources simultaneously. Point it at a directory containing both static and dynamic sources:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>mkdir -p inventory\/\ncp inventory.ini inventory\/static.ini\ncp inventory.proxmox.yml inventory\/\nansible-inventory -i inventory\/ --graph<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or specify multiple sources on the command line:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>ansible-playbook -i inventory.ini -i inventory.proxmox.yml deploy.yml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hosts from all sources are merged. If the same hostname appears in both static and dynamic inventories, variables from both sources are combined using the standard <a href=\"https:\/\/computingforgeeks.com\/ansible-variables-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">variable precedence<\/a> rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Debugging Dynamic Inventory<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Three commands for troubleshooting inventory issues:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Show the full group tree:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>ansible-inventory -i inventory.proxmox.yml --graph<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dump all variables for a specific host:<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>ansible-inventory -i inventory.proxmox.yml --host ansible-controller<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Export the complete inventory as JSON (useful for comparing expected vs actual):<\/p>\n\n\n\n<pre class=\"wp-block-code code\"><code>ansible-inventory -i inventory.proxmox.yml --list --export<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If a host isn&#8217;t appearing, check that the plugin can reach the API endpoint, the token has sufficient permissions, and the host meets any filter criteria you defined.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick Reference<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Inventory Type<\/th><th>File Convention<\/th><th>When to Use<\/th><\/tr><\/thead><tbody><tr><td>Proxmox plugin<\/td><td><code>*.proxmox.yml<\/code><\/td><td>Proxmox VE clusters<\/td><\/tr><tr><td>AWS EC2 plugin<\/td><td><code>*.aws_ec2.yml<\/code><\/td><td>AWS EC2 instances<\/td><\/tr><tr><td>GCP plugin<\/td><td><code>*.gcp.yml<\/code><\/td><td>Google Compute Engine<\/td><\/tr><tr><td>Azure plugin<\/td><td><code>*.azure_rm.yml<\/code><\/td><td>Azure VMs<\/td><\/tr><tr><td>Script<\/td><td>Executable file<\/td><td>Custom APIs, CMDBs<\/td><\/tr><tr><td>Static<\/td><td><code>*.ini<\/code> or <code>*.yml<\/code><\/td><td>Small, stable environments<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For the complete Ansible learning path, see the <a href=\"https:\/\/computingforgeeks.com\/ansible-automation-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ansible Automation Guide<\/a>. Dynamic inventory works especially well with <a href=\"https:\/\/computingforgeeks.com\/ansible-roles-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ansible roles<\/a> and <a href=\"https:\/\/computingforgeeks.com\/ansible-jinja2-templates-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jinja2 templates<\/a> for fully automated infrastructure that adapts as hosts come and go. The <a href=\"https:\/\/computingforgeeks.com\/ansible-proxmox-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ansible + Proxmox integration guide<\/a> covers VM provisioning alongside dynamic discovery.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Static inventory files work until you have more than a handful of servers. Once VMs spin up and down in Proxmox, instances launch in AWS, or containers scale in Kubernetes, maintaining a text file of hostnames becomes a losing game. Dynamic inventory solves this by querying your infrastructure directly and building the host list at &#8230; <a title=\"Setup Ansible Dynamic Inventory for Auto Host Discovery\" class=\"read-more\" href=\"https:\/\/computingforgeeks.com\/ansible-dynamic-inventory-tutorial\/\" aria-label=\"Read more about Setup Ansible Dynamic Inventory for Auto Host Discovery\">Read more<\/a><\/p>\n","protected":false},"author":3,"featured_media":166054,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[606,329],"tags":[314,212],"cfg_series":[39825],"class_list":["post-166052","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ansible","category-automation","tag-ansible","tag-automation","cfg_series-ansible-mastery"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166052","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=166052"}],"version-history":[{"count":0,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166052\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/166054"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=166052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=166052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=166052"},{"taxonomy":"cfg_series","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/cfg_series?post=166052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}