{"id":4257,"date":"2025-09-17T12:38:31","date_gmt":"2025-09-17T12:38:31","guid":{"rendered":"https:\/\/www.it-react.com\/?p=4257"},"modified":"2025-09-29T22:45:39","modified_gmt":"2025-09-29T22:45:39","slug":"vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1","status":"publish","type":"post","link":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/","title":{"rendered":"VMware vSphere &#8211; Automating VM Deployment with Ansible and GitLab CI\/CD &#8211; Part 1"},"content":{"rendered":"\n<p>A few months ago, when I first came across a project where Ansible and GitLab CI\/CD were used to automate VM deployments in VMware vCenter, I wasn\u2019t directly responsible for writing the playbooks. My role was more on the VMware side \u2014 managing vCenter, handling ESXi administration, and preparing the YAML host files that Ansible would use. At the same time, I was also learning how to work with Git, since those YAML files needed to be versioned and pushed into the repository.<\/p>\n\n\n\n<p>Even though I wasn\u2019t the one building the automation logic, I found the whole process fascinating. Watching how a pipeline could trigger Ansible and, based on predefined variables, automatically provision a VM in a consistent way really caught my attention.<\/p>\n\n\n\n<p>Since then, I\u2019ve kept thinking how powerful this approach was and how much time it could save compared to manual deployment in the vSphere client. Ever since, I\u2019ve wanted to try implementing a similar setup in my own lab environment \u2014 of course on a smaller scale, but mainly to understand the workflow and the tools involved.<\/p>\n\n\n\n<p>This post is about revisiting that idea and experimenting with Ansible and GitLab CI\/CD for VM automation in a homelab setting. My goal is not only to reproduce what I saw back then, but also to really understand how it all fits together.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>About Ansible and GitLab CI\/CD<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Ansible<\/strong> is an open-source automation tool widely used for provisioning, configuration management, and application deployment. It works with a simple, human-readable syntax (YAML playbooks) and does not require agents on managed systems, making it easy to adopt and integrate into existing environments. In the case of VMware, Ansible provides dedicated modules and collections (such as <em>community.vmware<\/em>) that allow direct interaction with vCenter to create, modify, or remove virtual machines.<\/p>\n\n\n\n<p><strong>GitLab CI\/CD<\/strong> is a continuous integration and continuous delivery platform integrated into GitLab. It allows us to define automated pipelines that run whenever changes are pushed to a repository. By combining GitLab CI\/CD with Ansible, infrastructure tasks like deploying new VMs can be triggered directly from version-controlled code, ensuring consistency, repeatability, and traceability of every change.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Prerequisites<\/strong><\/h2>\n\n\n\n<p>To build this lab, we will need the following main components:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. vSphere Environment<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <strong>vCenter Server<\/strong> with sufficient permissions to clone virtual machines and apply customization.<\/li>\n\n\n\n<li>At least one <strong>ESXi host<\/strong> that provides compute and storage resources.<\/li>\n\n\n\n<li>A <strong>Linux VM template<\/strong> (for example Ubuntu 22.04) prepared with:\n<ul class=\"wp-block-list\">\n<li>open-vm-tools installed (to allow VMware guest customization).<\/li>\n\n\n\n<li>SSH service enabled.<\/li>\n\n\n\n<li>A dedicated user account that Ansible can connect to.<\/li>\n\n\n\n<li>(Optional) cloud-init for advanced automation, but not strictly required.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Ansible and GitLab CI\/CD Environment<\/h3>\n\n\n\n<p>In this lab, both <strong>Ansible<\/strong> and <strong>GitLab<\/strong> (including the GitLab Runner) are installed on the same Linux server. This keeps the environment simple: the same machine will host the automation engine (Ansible) and the CI\/CD orchestrator (GitLab).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step one: Install GitLab<\/strong><\/h3>\n\n\n\n<p>First, install <a href=\"https:\/\/docs.gitlab.com\/install\/package\/ubuntu\/?tab=Community+Edition\">GitLab Community Edition<\/a>. On Ubuntu\/Debian, we can do this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Add GitLab package repository\ncurl https:\/\/packages.gitlab.com\/install\/repositories\/gitlab\/gitlab-ce\/script.deb.sh | sudo bash\n<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f01b78&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"306\" 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\/image-16.png\" alt=\"\" class=\"wp-image-4302\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-16.png 989w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-16-300x93.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-16-768x238.png 768w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><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<pre class=\"wp-block-code\"><code># Install GitLab CE\nsudo apt install gitlab-ce -y<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f020bd&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"306\" 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\/image-17.png\" alt=\"\" class=\"wp-image-4303\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-17.png 989w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-17-300x93.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-17-768x238.png 768w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><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<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f024d7&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"306\" 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\/image-18.png\" alt=\"\" class=\"wp-image-4304\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-18.png 989w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-18-300x93.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-18-768x238.png 768w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><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<p>After installation, configure GitLab: as mentioned above, I&#8217;ve changed the external_url to &#8220;http:\/\/gitlab.racklab.local&#8221; and added the FQDN to my local DNS<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f02c8b&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"242\" 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\/image-24.png\" alt=\"\" class=\"wp-image-4314\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-24.png 989w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-24-300x73.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-24-768x188.png 768w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><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<pre class=\"wp-block-code\"><code># Reconfigure GitLab services\nsudo gitlab-ctl reconfigure\n<\/code><\/pre>\n\n\n\n<p>By default, GitLab will be accessible at http:\/\/&lt;server-ip&gt; on port 80.<br>The initial root password is stored in \/etc\/gitlab\/initial_root_password.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step two: Install GitLab Runner<\/strong><\/h3>\n\n\n\n<p>The GitLab Runner executes CI\/CD jobs. Install it on the same server:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# Add GitLab Runner repository\ncurl -L https:\/\/packages.gitlab.com\/install\/repositories\/runner\/gitlab-runner\/script.deb.sh | sudo bash\n<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f037e2&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1005\" height=\"322\" 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\/image-19.png\" alt=\"\" class=\"wp-image-4307\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-19.png 1005w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-19-300x96.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-19-768x246.png 768w\" sizes=\"auto, (max-width: 1005px) 100vw, 1005px\" \/><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<pre class=\"wp-block-code\"><code># Install runner\nsudo apt install gitlab-runner -y<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f03fdb&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1005\" height=\"322\" 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\/image-20.png\" alt=\"\" class=\"wp-image-4308\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-20.png 1005w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-20-300x96.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-20-768x246.png 768w\" sizes=\"auto, (max-width: 1005px) 100vw, 1005px\" \/><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<p>Create Runner in GitLab (from GitLab UI \u2192 Admin \u2192 Runners \u2192 Create instance runner) and add Tags and Runner description (optional)<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f04450&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"450\" 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\/image-21-1024x450.png\" alt=\"\" class=\"wp-image-4309\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-21-1024x450.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-21-300x132.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-21-768x337.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-21-1536x675.png 1536w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-21.png 2046w\" 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<p>We register the runner with our GitLab instance &#8211; folow Step 1 in picture bellow.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f049e0&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"925\" 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\/image-23-1024x925.png\" alt=\"\" class=\"wp-image-4311\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-23-1024x925.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-23-300x271.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-23-768x694.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-23.png 1282w\" 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<p>Copy and paste the command from Step 1 into the command line<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f04db0&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"289\" 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\/image-25-1024x289.png\" alt=\"\" class=\"wp-image-4316\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-25-1024x289.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-25-300x85.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-25-768x217.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-25.png 1197w\" 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\"><strong>Step three: Install Ansible<\/strong><\/h3>\n\n\n\n<p>Ansible will run playbooks against vCenter. Install it via apt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install ansible -y\nansible --version<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f0532d&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"997\" height=\"162\" 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\/image-29.png\" alt=\"\" class=\"wp-image-4324\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-29.png 997w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-29-300x49.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-29-768x125.png 768w\" sizes=\"auto, (max-width: 997px) 100vw, 997px\" \/><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\"><strong>Step four: Install VMware-related dependencies<\/strong><\/h3>\n\n\n\n<p>To manage vSphere with Ansible, we need extra Python modules and Ansible collections.<\/p>\n\n\n\n<p>1. <strong>community.vmware<\/strong> collection:<br>This contains modules like <code>vmware_guest<\/code> that allow VM deployment.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-galaxy collection install community.vmware<\/code><\/pre>\n\n\n\n<p>2. <strong>pyhon3-pip<\/strong> package manager for Python:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install python3-pip -y\npip3 --version<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f0598e&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"997\" height=\"82\" 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\/image-28.png\" alt=\"\" class=\"wp-image-4323\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-28.png 997w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-28-300x25.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-28-768x63.png 768w\" sizes=\"auto, (max-width: 997px) 100vw, 997px\" \/><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<p>3. <strong>pyVmomi<\/strong> library:<br>The official Python SDK for the VMware vSphere API.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip3 install pyvmomi<\/code><\/pre>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69fa914f05f10&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"997\" height=\"162\" 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\/image-30.png\" alt=\"\" class=\"wp-image-4325\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-30.png 997w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-30-300x49.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-30-768x125.png 768w\" sizes=\"auto, (max-width: 997px) 100vw, 997px\" \/><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\"><strong>Step five: Verify environment<\/strong><\/h3>\n\n\n\n<p>Check that all pieces are in place:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># GitLab status\nsudo gitlab-ctl status\n\n# GitLab Runner status\nsudo gitlab-runner status\n\n# Ansible version and VMware collection\nansible --version\nansible-galaxy collection list | grep vmware\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"997\" height=\"546\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-31.png\" alt=\"\" class=\"wp-image-4327\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-31.png 997w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-31-300x164.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/image-31-768x421.png 768w\" sizes=\"auto, (max-width: 997px) 100vw, 997px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>At this stage, the lab environment is fully prepared:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GitLab<\/strong> is up and running, accessible via the web interface.<\/li>\n\n\n\n<li><strong>GitLab Runner<\/strong> has been installed and registered successfully, ready to execute CI\/CD jobs.<\/li>\n\n\n\n<li><strong>Ansible<\/strong> is installed on the same server, along with the required VMware dependencies (community.vmware collection, pyVmomi).<\/li>\n<\/ul>\n\n\n\n<p>This foundation allows us to combine GitLab CI\/CD with Ansible to automate VM lifecycle management directly in vCenter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What\u2019s next<\/strong><\/h2>\n\n\n\n<p>In the next post, we will:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build Ansible playbooks that define how VMs are deployed and customized.<\/li>\n\n\n\n<li>Organize VM configuration into structured files for reusability and scalability.<\/li>\n\n\n\n<li>Integrate these playbooks into a GitLab pipeline so VM deployment can be triggered automatically or on demand.<\/li>\n<\/ul>\n\n\n\n<p>This is where the real automation begins \u2014 turning our prepared lab into a reproducible workflow for provisioning and configuring VMs on vSphere.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few months ago, when I first came across a project where Ansible and GitLab CI\/CD were used to automate VM deployments in VMware vCenter, I wasn\u2019t directly responsible for writing the playbooks. My role was more on the VMware side \u2014 managing vCenter, handling ESXi administration, and preparing the YAML host files that Ansible [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4560,"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-4257","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.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>VMware vSphere - Automating VM Deployment with Ansible and GitLab CI\/CD - Part 1 - IT-REACT<\/title>\n<meta name=\"description\" content=\"ansible gitlal ci\/cd vmware vsphere\" \/>\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\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VMware vSphere - Automating VM Deployment with Ansible and GitLab CI\/CD - Part 1 - IT-REACT\" \/>\n<meta property=\"og:description\" content=\"ansible gitlal ci\/cd vmware vsphere\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"IT-REACT\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-17T12:38:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-29T22:45:39+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=\"8 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\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/\"},\"author\":{\"name\":\"Ioan Penu\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"headline\":\"VMware vSphere &#8211; Automating VM Deployment with Ansible and GitLab CI\\\/CD &#8211; Part 1\",\"datePublished\":\"2025-09-17T12:38:31+00:00\",\"dateModified\":\"2025-09-29T22:45:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/\"},\"wordCount\":832,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"image\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/\",\"name\":\"VMware vSphere - Automating VM Deployment with Ansible and GitLab CI\\\/CD - Part 1 - IT-REACT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg\",\"datePublished\":\"2025-09-17T12:38:31+00:00\",\"dateModified\":\"2025-09-29T22:45:39+00:00\",\"description\":\"ansible gitlal ci\\\/cd vmware vsphere\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg\",\"contentUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg\",\"width\":1024,\"height\":570,\"caption\":\"Foto von CHUTTERSNAP auf Unsplash\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/09\\\/17\\\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.it-react.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VMware vSphere &#8211; Automating VM Deployment with Ansible and GitLab CI\\\/CD &#8211; Part 1\"}]},{\"@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 - Automating VM Deployment with Ansible and GitLab CI\/CD - Part 1 - IT-REACT","description":"ansible gitlal ci\/cd vmware vsphere","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\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/","og_locale":"en_US","og_type":"article","og_title":"VMware vSphere - Automating VM Deployment with Ansible and GitLab CI\/CD - Part 1 - IT-REACT","og_description":"ansible gitlal ci\/cd vmware vsphere","og_url":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/","og_site_name":"IT-REACT","article_published_time":"2025-09-17T12:38:31+00:00","article_modified_time":"2025-09-29T22:45:39+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":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#article","isPartOf":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/"},"author":{"name":"Ioan Penu","@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"headline":"VMware vSphere &#8211; Automating VM Deployment with Ansible and GitLab CI\/CD &#8211; Part 1","datePublished":"2025-09-17T12:38:31+00:00","dateModified":"2025-09-29T22:45:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/"},"wordCount":832,"commentCount":0,"publisher":{"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"image":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/","url":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/","name":"VMware vSphere - Automating VM Deployment with Ansible and GitLab CI\/CD - Part 1 - IT-REACT","isPartOf":{"@id":"https:\/\/www.it-react.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#primaryimage"},"image":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg","datePublished":"2025-09-17T12:38:31+00:00","dateModified":"2025-09-29T22:45:39+00:00","description":"ansible gitlal ci\/cd vmware vsphere","breadcrumb":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#primaryimage","url":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg","contentUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/09\/chuttersnap-eqwFWHfQipg-unsplash-e1759185331899.jpg","width":1024,"height":570,"caption":"Foto von CHUTTERSNAP auf Unsplash"},{"@type":"BreadcrumbList","@id":"https:\/\/www.it-react.com\/index.php\/2025\/09\/17\/vmware-vsphere-automating-vm-deployment-with-ansible-and-gitlab-ci-cd-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.it-react.com\/"},{"@type":"ListItem","position":2,"name":"VMware vSphere &#8211; Automating VM Deployment with Ansible and GitLab CI\/CD &#8211; Part 1"}]},{"@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\/4257","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=4257"}],"version-history":[{"count":75,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4257\/revisions"}],"predecessor-version":[{"id":4562,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4257\/revisions\/4562"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/media\/4560"}],"wp:attachment":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/media?parent=4257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/categories?post=4257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/tags?post=4257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}