{"id":3245,"date":"2022-07-18T07:00:00","date_gmt":"2022-07-18T05:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=3245"},"modified":"2022-07-15T21:54:18","modified_gmt":"2022-07-15T19:54:18","slug":"labor-umgebungen-auf-vmware-vsphere-erstellen-mit-der-ansible-rolle-vsphere_provision_lab","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/labor-umgebungen-auf-vmware-vsphere-erstellen-mit-der-ansible-rolle-vsphere_provision_lab\/","title":{"rendered":"Labor-Umgebungen auf VMware vSphere erstellen mit der Ansible-Rolle vsphere_provision_lab"},"content":{"rendered":"\n<p>In diesem Artikel stelle ich euch meine Ansible-Rolle <code>vsphere_provision_lab<\/code> vor. Mit dieser ist es m\u00f6glich, vordefinierte Labor-Umgebungen, bestehend aus virtuellen Maschinen (VMs), in einem VMware vSphere Cluster zu provisionieren.<\/p>\n\n\n\n<p>Um dem Text folgen zu k\u00f6nnen, ist es hilfreich zu wissen, was eine <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_reuse_roles.html\">Ansible-Rolle (engl.)<\/a> ist und worum es sich bei <a href=\"https:\/\/de.wikipedia.org\/wiki\/VMware_vSphere\">VMware vSphere<\/a> handelt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Anwendungsfall<\/h2>\n\n\n\n<p>Zum Test von Ansible-Modulen, -Playbooks und -Rollen sowie neuer Shell-Skripte und Konfigurationsparameter ben\u00f6tige ich wiederholt Test- bzw. Labor-Umgebungen. Diese bestehen aus VMs, welche im Vergleich zum Provisionierungszeitpunkt m\u00f6glichst wenig \u00c4nderungen aufweisen sollten.<\/p>\n\n\n\n<p>Da die Konfiguration der Gast-Betriebssysteme durch einen Testlauf ver\u00e4ndert wird, soll eine solche Labor-Umgebung nach einem Test m\u00f6glichst schnell dekommissioniert und neu-provisioniert werden k\u00f6nnen.<\/p>\n\n\n\n<p>Der Vorgang der Provisionierung und Dekommissionierung soll automatisiert erfolgen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Voraussetzungen<\/h2>\n\n\n\n<p>Um die Ansible-Rolle <code>vsphere_provision_lab<\/code> nutzen zu k\u00f6nnen, ben\u00f6tigt man:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Einen Ansible Control Node mit einer Ansible-Version >= 2.9<\/li><li>Eine vCenter Server Appliance oder einen vCenter Server; getestet habe ich die Rolle mit Version 6.7 U3<\/li><\/ul>\n\n\n\n<p>Die Ansible-Rolle verwendet die Module <code><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/community\/vmware\/vmware_guest_module.html\">vmware_guest<\/a><\/code> und <code><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/community\/vmware\/vmware_guest_disk_module.html\">vmware_guest_disk<\/a><\/code> aus der Collection <code><a href=\"https:\/\/galaxy.ansible.com\/community\/vmware\">community.vmware<\/a><\/code>. Um diese nutzen zu k\u00f6nnen, muss auf dem Ansible Control Node Python in einer Version &gt;= 2.6 und PyVmomi installiert sein.<\/p>\n\n\n\n<p>Da die Rolle neue VMs aus Templates erstellt, m\u00fcssen entsprechende vSphere Templates vorhanden sein.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Variablen<\/h2>\n\n\n\n<p>In diesem Abschnitt werden die Variablen dokumentiert, welche mit Werten zu belegen sind. Diese sind in <code>defaults\/main.yml<\/code> definiert und k\u00f6nnen entsprechend der <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_variables.html\">Variablen-Pr\u00e4zedenz<\/a> \u00fcberschrieben werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">vCenter-Variablen<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><code>vsphere_provision_lab_vc_hostname<\/code> &#8211; Der FQDN f\u00fcr die vCenter Server Appliance.<\/li><li><code>vsphere_provision_lab_vc_username<\/code> &#8211; Ein Benutzeraccount mit der Berechtigung, neue VMs zu erstellen.<\/li><li><code>vsphere_provision_lab_vc_password<\/code> &#8211; Spezifiziert das Benutzer-Passwort.<\/li><li><code>vsphere_provision_lab_vc_datacenter<\/code> &#8211; Name des vSphere Datacenter in der Bestandsliste, das verwendet werden soll.<\/li><li><code>vsphere_provision_lab_vc_cluster<\/code> &#8211; Der zu verwendende vSphere Cluster aus der Bestandsliste.<\/li><li><code>vsphere_provision_lab_vc_datastore<\/code> &#8211; Name des Datenspeichers, in dem die VMDK-Datei(n) erstellt wird\/werden.<\/li><li><code>vsphere_provision_lab_vc_folder<\/code> &#8211; Der vSphere Folder Name, in dem die VM erstellt wird. Der Wert kann zuvor mit dem Playbook <code>find_vmware_guest_folder.yml<\/code> ermittelt werden.<\/li><\/ul>\n\n\n\n<p>Ich empfehle, sensible Informationen wie z.B. Benutzername und Passwort in einer verschl\u00fcsselten <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/vault.html\">Ansible-Vault-Datei<\/a> zu speichern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dictionary zur Spezifikation der VMs<\/h3>\n\n\n\n<p>Namen und Parameter der zu erstellenden VMs werden in einem <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_variables.html#dictionary-variables\">YAML-Dictionary<\/a> gespeichert. Der folgende Code-Block zeigt ein Beispiel f\u00fcr ein solches Dictionary mit einem Eintrag:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  vm1:\n    vm_template: rhel8-en\n    vm_ram_mb: 1024\n    vm_vcpu: 2\n    vm_net: VLAN123\n    vm_ip: 192.168.0.5\n    vm_netmask: 255.255.255.0\n    vm_gateway: 192.168.0.254\n    vm_domain: sub.example.com\n    vm_hostname: host2\n    vm_dns_servers:\n      - 192.168.0.2\n      - 192.168.0.3\n    vm_dns_suffix:\n      - sub.example.com\n      - sub2.example.com\n      - sub3.example.com\n    vm_second_hdd: true\n    vm_second_hdd_size_gb: \"10\"\n    vm_second_hdd_type: \"thin\"\n    vm_second_hdd_datastore: \"DS1\"\n    vm_scsi_controller: \"1\"\n    vm_unit_number: \"1\"\n    vm_scsi_type: 'paravirtual'<\/code><\/pre>\n\n\n\n<p>Aus dem obigen Dictionary wird eine VM mit den folgenden Parametern erstellt:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>vSphere-Template &#8218;rhel8-en&#8216; wird als Vorlage verwendet.<\/li><li>Der VM werden 1 vCPU und 512 MB RAM zugewiesen.<\/li><li>Die vNIC an das VM-Netz &#8218;VLAN123&#8216; angeschlossen.<\/li><li>Die VM wird mit der IP 192.168.0.1\/24 und dem Standardgateway 192.168.0.254 konfiguriert.<\/li><li>Im Gast-Betriebssystem wird der Hostname &#8218;host1&#8216; konfiguriert.<\/li><li>Es werden DNS-Server und DNS-Suffixe konfiguriert.<\/li><li>Es wird eine zweite Festplatte f\u00fcr die VM erstellt.<\/li><\/ul>\n\n\n\n<p>Diesen Block kann man nun f\u00fcr weitere VMs wiederholen. Wird keine zweite HDD ben\u00f6tigt, setzt man <code>vm_second_hdd<\/code> auf <code>false<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Beispiel-Playbook<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n- hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - \/path\/to\/vault-with-vcenter-creds.vars\n    - roles\/vsphere_provision_lab\/vars\/rhel-lab.yml\n \n  roles:\n    - vsphere_provision_lab<\/code><\/pre>\n\n\n\n<p>In diesem Beispiel werden die Variablen aus zwei Dateien geladen.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>\/path\/to\/vault-with-vcenter-creds.vars<\/strong> ist eine Ansible-Vault-Datei, welche die Anmeldeinformationen f\u00fcr den vCenter Server beinhaltet.<\/li><li><strong>roles\/vsphere_provision_lab\/vars\/rhel-lab.yml<\/strong> enth\u00e4lt das Dictionary mit den zu erstellenden VMs.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wie kann man diese Rolle nutzen?<\/h2>\n\n\n\n<p>Die Rolle steht unter der Lizenz GPLv2-or-later und kann aus dem GitLab-Repo <a rel=\"noreferrer noopener\" href=\"https:\/\/gitlab.ub.uni-bielefeld.de\/joerg.kastning\/vsphere_provision_lab\/\" target=\"_blank\">vsphere_provision_lab<\/a> heruntergeladen bzw. das Repo geklont werden. Sie ist im <em>Role Path<\/em> der Ansible-Installation zu speichern. Anschlie\u00dfend kann man sich an folgendem Ablaufplan orientieren:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Im Vorfeld sollten IP-Adressen und FQDNs f\u00fcr die zu erstellenden VMs registriert werden. Dieser Punkt ist spezifisch f\u00fcr eure jeweilige Umgebung.<\/li><li>Die Variablen sind mit g\u00fcltigen Werten zu belegen.<\/li><li>Die Rolle ist in ein Playbook einzubinden.<\/li><li>Und schon kann das Playbook ausgef\u00fchrt werden.<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Die Ansible-Rolle <code>vsphere_provision_lab<\/code> erm\u00f6glicht es, Labor-Umgebungen, bestehend aus VMs, als YAML-Dictionary zu definieren und auf einem VMware vSphere Cluster zu provisionieren.<\/p>\n\n\n\n<p>Damit eignet sie sich, um wiederholt eine Umgebung mit gleichen Ausgangsbedingungen zu schaffen. Gleichzeitig wird die Zeit f\u00fcr die Provisionierung verk\u00fcrzt, da manuelle Schritte entfallen.<\/p>\n\n\n\n<p>So richtig idempotent arbeitet das Modul <code>vmware_guest<\/code> allerdings nicht. F\u00fchre ich das Playbook ein zweites Mal aus, wird der Status &#8222;Changed&#8220; zur\u00fcckgegeben, obwohl die VMs bereits existieren. Die VMs selbst \u00fcberstehen den zweiten Lauf auch unbeschadet, jedoch zeigt der vSphere Client, dass sie rekonfiguriert wurden. Das k\u00f6nnte ich mir noch genauer ansehen, um der Ursache auf die Schliche zu kommen.<\/p>\n\n\n\n<p>Was haltet ihr davon? Findet ihr diese Role n\u00fctzlich, oder bevorzugt ihr andere Wege zur Provisionierung eurer VMs auf vSphere?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel stelle ich euch meine Ansible-Rolle vsphere_provision_lab vor. Mit dieser ist es m\u00f6glich, vordefinierte Labor-Umgebungen, bestehend aus virtuellen Maschinen (VMs), in einem VMware vSphere Cluster zu provisionieren. Um dem Text folgen zu k\u00f6nnen, ist es hilfreich zu wissen, was eine Ansible-Rolle (engl.) ist und worum es sich bei VMware vSphere handelt. Anwendungsfall Zum<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/labor-umgebungen-auf-vmware-vsphere-erstellen-mit-der-ansible-rolle-vsphere_provision_lab\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[532],"tags":[733,734,430,305,732,158,730,159,731],"class_list":["post-3245","post","type-post","status-publish","format-standard","hentry","category-ansible","tag-lab","tag-labor-umgebung","tag-osbn","tag-planet","tag-vms-provisionieren","tag-vmware","tag-vmware-vsphere","tag-vsphere","tag-vsphere_provision_lab"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=3245"}],"version-history":[{"count":5,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3245\/revisions"}],"predecessor-version":[{"id":3252,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3245\/revisions\/3252"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=3245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=3245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=3245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}