{"id":4469,"date":"2025-09-29T22:47:27","date_gmt":"2025-09-29T22:47:27","guid":{"rendered":"https:\/\/www.it-react.com\/?p=4469"},"modified":"2025-10-27T23:15:41","modified_gmt":"2025-10-27T23:15:41","slug":"vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2","status":"publish","type":"post","link":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/","title":{"rendered":"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2"},"content":{"rendered":"\n<p>In this post we move from lab setup to hands-on automation. The goal is to provision virtual machines on vSphere automatically by combining Ansible playbooks with a GitLab CI\/CD pipeline. Everything lives as code in a Git repository: VM definitions, playbooks, and the pipeline that runs them. With a single commit, GitLab triggers Ansible, which talks to vCenter, which clones and customizes VMs from templates. The result is fast, consistent, and repeatable VM provisioning.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Configure Ansible and deploy one VM locally<\/strong><\/h2>\n\n\n\n<p>Before we jump into GitLab pipelines and complex automation, it\u2019s important to <strong>start small<\/strong> and make sure the basics work. The best way to do this is to run Ansible manually from the command line and deploy a single virtual machine on vSphere. If one VM works, we can confidently scale to many.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Repository layout<\/strong><\/h3>\n\n\n\n<p>To keep everything organized, we\u2019ll create a Git repository where all the Ansible files live. Think of this as a \u201csource code\u201d repo for our virtual machines.<\/p>\n\n\n\n<p>Here\u2019s the minimal structure we\u2019ll start with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vsphere-auto\/\n\u251c\u2500 ansible.cfg                 # Ansible config \n\u251c\u2500 inventory.ini               # Explicit inventory \n\u251c\u2500 requirements.yml            # Ansible collections (version-pinned recommended)\n\u2502\n\u251c\u2500 vars\/\n\u2502  \u251c\u2500 common.yml               # Non-sensitive defaults (vCenter, DC\/cluster\/folder)\n\u2502  \u2514\u2500 secret.yml               # ENCRYPTED with Ansible Vault (vCenter user\/pass)\n\u2502\n\u251c\u2500 templates\/\n\u2502  \u2514\u2500 os_map.yml               # maps OS names to VM templates in vCenter\n\u2502\n\u251c\u2500 hosts\/\n\u2502  \u251c\u2500 _TEMPLATE.yml            # Copy\/rename per-VM and fill parameters\n\u2502  \u251c\u2500 HAM01VM001.yml           # VM definition #1\n\u2502  \u2514\u2500 HAM01VM002.yml           # VM definition #2\n\u2502\n\u2514\u2500 playbooks\/\n   \u2514\u2500 vm_create.yml            # Deploy a single VM: -e vm_file=hosts\/HAM01VM001.yml\n\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/nordvpn.com\/de\/special\/?utm_medium=affiliate&amp;utm_term=&amp;utm_content&amp;utm_source=aff119651&amp;utm_campaign=off15\"><img loading=\"lazy\" decoding=\"async\" width=\"970\" height=\"250\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/affiliate-black-friday-campaign-25-970x250-2.jpg\" alt=\"\" class=\"wp-image-4579\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/affiliate-black-friday-campaign-25-970x250-2.jpg 970w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/affiliate-black-friday-campaign-25-970x250-2-300x77.jpg 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/affiliate-black-friday-campaign-25-970x250-2-768x198.jpg 768w\" sizes=\"auto, (max-width: 970px) 100vw, 970px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Ansible configuration file<\/h3>\n\n\n\n<p>This is the ansible.cfg<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;defaults]\ninventory = .\/inventory.ini\nhost_key_checking = False\nstdout_callback = yaml\nretry_files_enabled = False<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ansible inventory file<\/strong><\/h3>\n\n\n\n<p>In Ansible, the <strong>inventory<\/strong> is the list of machines Ansible manages. Normally it contains hostnames or IPs of servers, organized into groups (like <em>webservers<\/em> or <em>dbservers<\/em>). Ansible uses this list to know <em>where<\/em> to run tasks.<\/p>\n\n\n\n<p>By default, our inventory only had <code>localhost<\/code>, since Ansible runs locally to talk to vCenter. But we can make it more valuable: every time we define a VM in hosts<code>\/<\/code>, we can also <strong>add it to the inventory<\/strong>.<\/p>\n\n\n\n<p>This way:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The inventory becomes a live overview of all VMs created.<\/li>\n\n\n\n<li>Later, if we want to configure the VMs after boot (via SSH or WinRM), they are already present in the inventory.<\/li>\n<\/ul>\n\n\n\n<p>For example:<\/p>\n\n\n\n<p><strong>inventory.ini<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Control node\nlocalhost ansible_connection=local\n\n# Deployed VMs\n&#91;lab_vms]\nHAM01VM001 ansible_host=192.168.10.51\nHAM02VM003 ansible_host=192.168.10.52\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ansible requirements file<\/h3>\n\n\n\n<p>In this file we list the <strong>Ansible collections<\/strong> our project needs. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\ncollections:\n  - name: community.vmware\n  - name: community.general\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Notes<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>community.vmware<\/code><\/strong> contains <code>vmware_guest<\/code>, <code>vmware_guest_find<\/code>, etc. (required).<\/li>\n\n\n\n<li><strong><code>community.general<\/code><\/strong> is optional but useful for filters\/utilities <\/li>\n\n\n\n<li><strong><code>pyVmomi<\/code><\/strong> (the VMware SDK) is a <strong>Python package<\/strong>, so it\u2019s installed via <code>pip<\/code>, not in <code>requirements.yml<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Store common settings<\/strong><\/h3>\n\n\n\n<p>We don\u2019t want to repeat defaults like vCenter, cluster and folder for every VM, so we keep them in vars\/common.yml:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vcenter_hostname: \"vcsa.racklab.local\"\nvalidate_certs: false\n\nvm_datacenter: \"Datacenter1\"\nvm_cluster: \"Cluster1\"\nvm_folder: \"Servers\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Secure credentials with Ansible Vault<\/strong><\/h3>\n\n\n\n<p>Instead of keeping the username and password in clear text, we create a <strong>vault file<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-vault create vars\/secret.yml<\/code><\/pre>\n\n\n\n<p>This opens a text editor. Add my credentials inside:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vcenter_user: \"administrator@vsphere.local\"\nvcenter_pass: \"Secret123!\"<\/code><\/pre>\n\n\n\n<p>When we save and close, Ansible encrypts the file. If someone opens it, they\u2019ll only see scrambled text.<\/p>\n\n\n\n<p>To run a playbook with Vault, add &#8211;ask-vault-pass (or point to a vault password file if you want to automate).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Map operating systems to templates<\/strong><\/h3>\n\n\n\n<p>Each OS we want to deploy has a template in vCenter. To avoid typing long template names, we map them to short keys (templates\/os_map.yml):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>os_templates:\n  ubuntu22: \"Ubuntu-22.04\"\n  centos9: \"CentOS-Stream-9\"\n  debian12: \"Debian-12.10.0\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Define one VM<\/strong><\/h3>\n\n\n\n<p>Our first VM will live in <code>hosts\/HAM01VM001.yml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>hostname: \"HAM01VM001\"\nos: \"ubuntu22\"\n\ncpu: 2\nmem_mb: 2048\n\ndisks:\n  - size_gb: 25\n    type: thin\n    datastore: \"DatastoreESXi0\"\n\nnetworks:\n  - name: \"Production\"\n    type: static\n    ip: \"192.168.1.51\"\n    netmask: \"255.255.255.0\"\n    gateway: \"192.168.1.1\"\n\ndns_servers: &#91;\"192.168.1.1\", \"1.1.1.1\"]\ndomain_name: \"racklab.local\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">The playbook<\/h3>\n\n\n\n<p>Here\u2019s the Ansible playbook that brings all the files together and tells vCenter to deploy the VM:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: Deploy VM from hosts\/&lt;hostname&gt;.yml\n  hosts: localhost\n  gather_facts: false\n  collections: &#91;community.vmware]\n\n  pre_tasks:\n    - include_vars: { file: \"{{ playbook_dir }}\/..\/vars\/common.yml\", name: common }\n    - include_vars: { file: \"{{ playbook_dir }}\/..\/vars\/secret.yml\", name: secret }\n    - include_vars: { file: \"{{ playbook_dir }}\/..\/templates\/os_map.yml\", name: osmap }\n    - include_vars: { file: \"{{ playbook_dir }}\/..\/{{ vm_file }}\", name: vm }\n\n  tasks:\n    - name: Clone and customize\n      vmware_guest:\n        hostname: \"{{ common.vcenter_hostname }}\"\n        username: \"{{ secret.vcenter_user }}\"\n        password: \"{{ secret.vcenter_pass }}\"\n        validate_certs: \"{{ common.validate_certs }}\"\n        datacenter: \"{{ vm.vm_datacenter | default(common.vm_datacenter) }}\"\n        cluster:    \"{{ vm.vm_cluster    | default(common.vm_cluster) }}\"\n        folder:     \"{{ vm.vm_folder     | default(common.vm_folder) }}\"\n        name:       \"{{ vm.hostname }}\"\n        template:   \"{{ vm.vm_template   | default(osmap.os_templates&#91;vm.os]) }}\"\n        state:      poweredon\n        hardware:\n          num_cpus:  \"{{ vm.cpu }}\"\n          memory_mb: \"{{ vm.mem_mb }}\"\n        disk:       \"{{ vm.disks }}\"\n        networks:   \"{{ vm.networks }}\"\n        customization:\n          hostname:    \"{{ vm.hostname }}\"\n          domain:      \"{{ vm.domain_name }}\"\n          dns_servers: \"{{ vm.dns_servers }}\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Run the playbook<\/h3>\n\n\n\n<p>Deploy the VM with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-galaxy collection install -r requirements.yml\nansible-playbook playbooks\/vm_create.yml -e vm_file=hosts\/HAM01VM001.yml --ask-vault-pass<\/code><\/pre>\n\n\n\n<p>Ansible will prompt for the vault password, decrypt secret.yml at runtime, and use those credentials to talk to vCenter.<\/p>\n\n\n\n<p>If all goes well, a new VM appears in vCenter, powered on with the correct hostname and IP.<\/p>\n\n\n\n<p>Unfortunately we&#8217;ve encounter an error. Please check bellow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting: \u201cWhy does my playbook fail on Ubuntu\u2019s Ansible?\u201d<\/h3>\n\n\n\n<p>When I first ran the playbook on a Ubuntu box, I hit this error:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fatal: &#91;localhost]: FAILED! =&gt;\n  msg: Could not find imported module support code for ansible_collections.community.vmware.plugins.modules.vmware_guest.\n       Looked for (&#91;'ansible.module_utils.compat.version.StrictVersion', 'ansible.module_utils.compat.version'])<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"388\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1024x388.png\" alt=\"\" class=\"wp-image-4487\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1024x388.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-300x114.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-768x291.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik.png 1229w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>What\u2019s going on?<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ubuntu\u2019s apt repository ships <strong>Ansible 2.10.x<\/strong> for many LTS releases. From Ubuntu\u2019s point of view, that\u2019s the latest they maintain for that distro.<\/li>\n\n\n\n<li>Modern VMware modules in <strong><code>community.vmware<\/code><\/strong> expect a <strong>newer Ansible core<\/strong> (Ansible 8\/9 era).<\/li>\n\n\n\n<li>Result: the collection can\u2019t import required utils from the old Ansible \u2192 the playbook stops.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Fix: Upgrade Ansible<\/strong> Version<\/h3>\n\n\n\n<p>I&#8217;ll use a modern Ansible just for my user (no system changes), then reinstall collections.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Install a modern Ansible for my user\npython3 -m pip install --user --upgrade \"ansible==9.5.1\"\n\n# Ensure my shell uses it\necho 'export PATH=\"$HOME\/.local\/bin:$PATH\"' &gt;&gt; ~\/.bashrc\nsource ~\/.bashrc\nansible --version   # should now show ansible-core 2.16\/2.17 (Ansible 9.x)<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69f3f6c34636e&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"455\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1-1024x455.png\" alt=\"\" class=\"wp-image-4488\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1-1024x455.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1-300x133.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1-768x341.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-1.png 1229w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Fix collections versions<\/h3>\n\n\n\n<p>Update <code>requirements.yml<\/code> to pin <strong>one<\/strong> version of each collection:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>collections:\n  - name: community.vmware\n    version: 4.2.0\n  - name: community.general\n    version: 9.2.0<\/code><\/pre>\n\n\n\n<p>Install them <strong>into the project<\/strong> <strong>dir<\/strong> (not user\/system) and overwrite anything old there:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-galaxy collection install -r requirements.yml -p .\/collections --force<\/code><\/pre>\n\n\n\n<p>We&#8217;ll tell Ansible to use a project-local collections dir. In <code>ansible.cfg<\/code> we add this line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;defaults]\ncollections_path = .\/collections<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Run playbook again<\/strong><\/h3>\n\n\n\n<p>Now my playbooks will resolve modules from the <strong>project-local<\/strong> <code>.\/collections<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>ansible-playbook playbooks\/vm_create.yml -e vm_file=hosts\/HAM01VM001.yml --ask-vault-pass<\/code><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"765\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-6-1024x765.png\" alt=\"\" class=\"wp-image-4502\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-6-1024x765.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-6-300x224.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-6-768x574.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-6.png 1373w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Fix the runtime error (pyVmomi JSON encoder)<\/h3>\n\n\n\n<p>It\u2019s a version mismatch between the VMware collection and pyvmomi. My current pyVmomi is <strong>9.0.0.0<\/strong>, which is exactly what triggers the exception with many community.vmware versions. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">No longer supported. Use pyVmomi.VmomiJSONEncoder instead.<\/pre>\n\n\n\n<p>I&#8217;ll remove the current pyvmoni version and install an older one.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 -m pip uninstall -y pyvmomi\npython3 -m pip install --user \"pyvmomi==8.0.2\"\npython3 -c \"import pkg_resources as pr; print('pyVmomi', pr.get_distribution('pyvmomi').version)\"\n# expect: pyVmomi 8.0.2<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"280\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-7-1024x280.png\" alt=\"\" class=\"wp-image-4503\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-7-1024x280.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-7-300x82.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-7-768x210.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-7.png 1293w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Run playbook one more time<\/strong><\/h3>\n\n\n\n<p>Now we&#8217;ll run the Ansible playbook one more time:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook playbooks\/vm_create.yml -e vm_file=hosts\/HAM01VM001.yml --ask-vault-pass<\/code><\/pre>\n\n\n\n<p>And now we have successfully installed a new VM via Ansible.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"371\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-8-1024x371.png\" alt=\"\" class=\"wp-image-4504\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-8-1024x371.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-8-300x109.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-8-768x278.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/grafik-8.png 1197w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In this part of the series, we built the foundation for automating VM deployments on vSphere with Ansible. We prepared the lab, installed Ansible, connected it to vCenter, and successfully deployed our first virtual machine from a template. Along the way, we also solved a common compatibility issue between <code>pyVmomi<\/code> and the VMware Ansible collection, showing how important it is to align tool versions in a reproducible way.<\/p>\n\n\n\n<p>At this point, the environment is ready and tested:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitLab and GitLab Runner are installed.<\/li>\n\n\n\n<li>Ansible is configured locally, with working playbooks.<\/li>\n\n\n\n<li>VM creation has been validated end-to-end.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Next Post<\/h2>\n\n\n\n<p>In the next post, we\u2019ll move beyond manual execution and integrate everything into <strong>GitLab CI\/CD<\/strong>. That means automating VM deployments directly from a pipeline: pushing configuration changes to GitLab, letting the Runner execute the Ansible playbooks, and producing new VMs with no manual steps. We\u2019ll begin with a simple job that deploys one VM, and gradually expand into multi-VM deployments and more advanced workflows.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post we move from lab setup to hands-on automation. The goal is to provision virtual machines on vSphere automatically by combining Ansible playbooks with a GitLab CI\/CD pipeline. Everything lives as code in a Git repository: VM definitions, playbooks, and the pipeline that runs them. With a single commit, GitLab triggers Ansible, which [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4561,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_FSMCFIC_featured_image_caption":"","_FSMCFIC_featured_image_nocaption":"","_FSMCFIC_featured_image_hide":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-4469","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2 - IT-REACT<\/title>\n<meta name=\"description\" content=\"ansible vmware automatic deploy\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2 - IT-REACT\" \/>\n<meta property=\"og:description\" content=\"ansible vmware automatic deploy\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"IT-REACT\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-29T22:47:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-27T23:15:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"570\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ioan Penu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ioan Penu\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/\"},\"author\":{\"name\":\"Ioan Penu\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"headline\":\"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\\\/CD \u2013 Part 2\",\"datePublished\":\"2025-09-29T22:47:27+00:00\",\"dateModified\":\"2025-10-27T23:15:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/\"},\"wordCount\":940,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"image\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/\",\"name\":\"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\\\/CD \u2013 Part 2 - IT-REACT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg\",\"datePublished\":\"2025-09-29T22:47:27+00:00\",\"dateModified\":\"2025-10-27T23:15:41+00:00\",\"description\":\"ansible vmware automatic deploy\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg\",\"contentUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg\",\"width\":1024,\"height\":570,\"caption\":\"Photo by Bernd \ud83d\udcf7 Dittrich on Unsplash\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/29\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.it-react.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\\\/CD \u2013 Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#website\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/\",\"name\":\"it-react\",\"description\":\"Ctrl\u2022Alt\u2022Automate\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.it-react.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\",\"name\":\"Ioan Penu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\",\"caption\":\"Ioan Penu\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2 - IT-REACT","description":"ansible vmware automatic deploy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/","og_locale":"en_US","og_type":"article","og_title":"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2 - IT-REACT","og_description":"ansible vmware automatic deploy","og_url":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/","og_site_name":"IT-REACT","article_published_time":"2025-09-29T22:47:27+00:00","article_modified_time":"2025-10-27T23:15:41+00:00","og_image":[{"width":1024,"height":570,"url":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg","type":"image\/jpeg"}],"author":"Ioan Penu","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ioan Penu","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#article","isPartOf":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/"},"author":{"name":"Ioan Penu","@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"headline":"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2","datePublished":"2025-09-29T22:47:27+00:00","dateModified":"2025-10-27T23:15:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/"},"wordCount":940,"commentCount":0,"publisher":{"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"image":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/","url":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/","name":"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2 - IT-REACT","isPartOf":{"@id":"https:\/\/www.it-react.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#primaryimage"},"image":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg","datePublished":"2025-09-29T22:47:27+00:00","dateModified":"2025-10-27T23:15:41+00:00","description":"ansible vmware automatic deploy","breadcrumb":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#primaryimage","url":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg","contentUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/bernd-dittrich-yGGYZfzbqnQ-unsplash-e1759185235366.jpg","width":1024,"height":570,"caption":"Photo by Bernd \ud83d\udcf7 Dittrich on Unsplash"},{"@type":"BreadcrumbList","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/29\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.it-react.com\/"},{"@type":"ListItem","position":2,"name":"VMware vSphere \u2013 Automating VM Deployment with Ansible and GitLab CI\/CD \u2013 Part 2"}]},{"@type":"WebSite","@id":"https:\/\/www.it-react.com\/#website","url":"https:\/\/www.it-react.com\/","name":"it-react","description":"Ctrl\u2022Alt\u2022Automate","publisher":{"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.it-react.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0","name":"Ioan Penu","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g","caption":"Ioan Penu"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/comments?post=4469"}],"version-history":[{"count":40,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4469\/revisions"}],"predecessor-version":[{"id":4771,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4469\/revisions\/4771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/media\/4561"}],"wp:attachment":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/media?parent=4469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/categories?post=4469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/tags?post=4469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}