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]
...