IT-Infrastruktur mit Vagrant und Ansible aufbauen

Datum

Per vagrant lassen sich (theoretisch) unzählige VMs erbauen, welche bestimmte Anforderungen erfüllen. Mit ansible ist man dann im Anschluss daran in der Lage die per vagrant erstellten VMs entsprechend zu konfigurieren.

Hierbei bietet vagrant bereits die Möglichkeit an ein entsprechendes Playbook in ansible direkt per Vagrantfile ausführen zu lassen, aber dazu später mehr.

Im folgenden Beispiel werden 4 VMs (3 x web0(1..3) und db01) in Virtualbox mit dem CentOS 7 Image gebaut.
Die VMs erhalten ein bridged Netzwerkinterface, damit auch andere Systeme im LAN die VM erreichen. Hierbei wird die entsprechende IP per dhcp vergeben.
Des weiteren erhalten die VMs ein privates Netzwerkinterface mit statischen IPs, damit die VMs sich auch untereinander ungestört unterhalten können.

Hier nun der Aufbau:

virtualbox als provider

config.vm.provider "virtualbox"
Es wird Virtualbox als Hypervisor verwendet.

das „bridged“ Netzwerkinterface
 config.vm.network "public_network",
                use_dhcp_assigned_default_route: true,
                bridge: "enp3s0"

Es wird ein Netzwerkinterface hinzugefügt, welches vom Typ public_network ist und bei Virtualbox als Netzwerkbrücke bekannt ist.
Die zusätzlichen Optionen geben an, dass dhcp verwendet werden soll und zu welchem Interface auf dem Hostsystem die Netzwerkbrücke aufgebaut werden soll.

die VMs

Da ich gleich 3 Webserver bauen möchte, welche an sich komplett identisch aufgebaut werden sollten, kann ich anstatt 3 mal den gleichen Block zu schreiben auch eine Zählschleife verwenden. Hierbei enthält eine Variable i die Nummer des entsprechenden Durchlaufs und kann somit auch für z.B. die Nummerierung der VMs oder für IP-Adressen verwendet werden.
Des weiteren legen wir noch fest das jede VM nur 256 MB RAM erhält.

(1..3).each do |i|
                config.vm.define "web0#{i}" do |node|
                        node.vm.define "web01"
                        node.vm.box = "centos/7"
                        node.vm.hostname = "web0#{i}"
                        node.vm.network :private_network, ip: "10.10.10.2#{i}"
                        node.vm.network "forwarded_port", guest: 80, host: "808#{i}"
                        node.vm.provider "virtualbox" do |vb|
                                vb.memory = "256"
                        end
end

Dieser Block definiert die drei Web-VMs und benennt diese web01 bis web03. Das zu verwendende Image ist Centos in der Version 7 und der Hostname lautet ebenfalls web01 bis web03.
Zusätzlich erhält die VM eine statische IP für ein privates Netzwerk.

Nachfolgend können noch weitere Blöcke für die Erstellung von VMs folgen und diese können selbstverständlich weitere Optionen und Parameter enthalten.

ansible
config.vm.provision "ansible" do |ansible|
                ansible.playbook = "/home/rasputin/gitlab/ansible_VM_fertige_Einrichtung/playbook.yml"
                ansible.tags = ["update", "installbasic"]
end

Hier kann man nun alle, für ansible, relevanten Optionen angeben.
Ich habe hierbei das Playbook angegeben welches verwendet werden soll. Des weiteren möchte ich nur bestimmte Teile des Playbooks ausführen lassen, welche ich vorher im Playbook per tag gekennzeichnet habe.

weitere mögliche Optionen finden sich in der Dokumentation.

vagrantfile

Hier noch einmal das entsprechende Vagrantfile komplett:

Vagrant.configure("2") do |config|
        config.vm.network "public_network",
                use_dhcp_assigned_default_route: true,
                bridge: "enp3s0"
        (1..3).each do |i|
                config.vm.define "web0#{i}" do |node|
                        node.vm.define "web01"
                        node.vm.box = "centos/7"
                        node.vm.hostname = "web0#{i}"
                        node.vm.network :private_network, ip: "10.10.10.2#{i}"
                        node.vm.network "forwarded_port", guest: 80, host: "808#{i}"
                        node.vm.provider "virtualbox" do |vb|
                                vb.memory = "256"
                        end
                end
        end
        config.vm.define "db01" do |db01|
                db01.vm.define "db01"
                db01.vm.box = "centos/7"
                db01.vm.hostname = "db01"
                db01.vm.network :private_network, ip: "10.10.10.30"
                db01.vm.provider "virtualbox" do |vb|
                        vb.memory = "2048"
                end
        end
        config.vm.provision "ansible" do |ansible|
                ansible.playbook = "playbook.yml"
                ansible.tags = ["update", "installbasic"]
                ansible.extra_vars = {
                        ntp_name: "ntpd"
                }
        end

end

fertig…

Nun sollte nach einem vagrant up alles gebaut und entsprechend konfiguriert werden:

$ vagrant up
Bringing machine 'web01' up with 'virtualbox' provider...                       
Bringing machine 'web02' up with 'virtualbox' provider...        
Bringing machine 'web03' up with 'virtualbox' provider...                       
Bringing machine 'db01' up with 'virtualbox' provider...                                                               
==> web01: Importing base box 'centos/7'...
==> web01: Matching MAC address for NAT networking...                           
==> web01: Checking if box 'centos/7' is up to date...                            
==> web01: Setting the name of the VM: centos7_web01_1541431466769_37084
==> web01: Clearing any previously set network interfaces...
==> web01: Preparing network interfaces based on configuration...
    web01: Adapter 1: nat
    web01: Adapter 2: bridged
    web01: Adapter 3: hostonly
...
...
...
==> web01: Rsyncing folder: /home/rasputin/gitlab/vagrant/centos7/ => /vagrant
==> web01: Running provisioner: ansible...
Vagrant has automatically selected the compatibility mode '2.0'
according to the Ansible version installed (2.8.0.dev0 (devel 146709fb21) last updated 2018/10/07 19:30:14 (GMT +200)).

Alternatively, the compatibility mode can be specified in your Vagrantfile:
https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mode

    web01: Running ansible-playbook...

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [web01]

TASK [Yum Upgrade] *************************************************************
changed: [web01]
...

Autor
Kategorien Ansible, Automatisierung

PRTG Map