User Tools

Site Tools


технология_vagrant

Технология Vagrant

Установка

Подготовка командной строки

Cmder

λ bash

λ cd

Управление образами

$ vagrant box list

$ vagrant box add debian/bullseye64

$ vagrant box list

$ ### vagrant package --base ubuntu_20.04_03 --output /c/distrs/ubuntu_20.04.box

$ vagrant box add /c/distrs/ubuntu_20.04.box --name specialist/ubuntu20

$ vagrant box list

$ ### vagrant box remove specialist/ubuntu20

Создание и управление VM

$ mkdir ~/nodes

$ cd ~/nodes

$ vagrant init specialist/ubuntu20

$ less Vagrantfile
...
    config.vm.box = "specialist/ubuntu20"
...

$ vagrant up

$ ssh -p 2222 student@localhost

$ vagrant ssh

$ vagrant global-status

$ vagrant global-status --prune

$ vagrant halt

$ vagrant destroy

Управление конфигурацией, использование переменных и Provision VM

Внутри Vagrantfile

λ cat Vagrantfile
...
X = "13"

Vagrant.configure("2") do |config|

### My config ###

  config.vm.post_up_message = "This is X: " + X

  config.vm.hostname = "node1.corp" + X + ".un"
  config.vm.network "private_network", 
    adapter: 2, 
    name: "VirtualBox Host-Only Ethernet Adapter",
    ip: "192.168." + X + ".201"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "2"

#    file_to_disk = config.vm.hostname + '_disk2.vdi'
#    unless File.exist?(file_to_disk)
#      vb.customize ['createhd', '--filename', file_to_disk, '--size', 4 * 1024]
#    end
#    vb.customize ['storageattach', :id, '--storagectl', 'SATA', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]

  end
  
### /My config ###

### My provision ###
  
  config.vm.provision "provision_once", type: "shell", inline: <<-SHELL

    apt-get update     
    timedatectl set-timezone Europe/Moscow

  SHELL

  config.vm.provision "provision_onstart", run: "always", type: "shell", 
    env: {
	 "X" => X,
	},
    inline: <<-SHELL

    eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`
    route add default gw 192.168.$X.1

    cat <<EOF >/etc/resolv.conf
search corp$X.un
nameserver 192.168.$X.10
EOF

  SHELL

### /My provision ###

...

end
λ vagrant validate

λ vagrant up
...
==> default: Machine already provisioned ...
...
λ vagrant ssh
$ date

λ vagrant reload --provision

λ vagrant ssh
$ date

Provision с использованием внешних скриптов

λ touch provision_once.sh
#!/bin/sh

#echo 'root:strongpassword' | chpasswd
#sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
#service ssh restart

echo 'vagrant:strongpassword' | chpasswd

(echo '"\e[A": history-search-backward'; echo '"\e[B": history-search-forward') >> /etc/inputrc

timedatectl set-timezone Europe/Moscow

apt update
#apt install -y docker.io
λ touch provision_onstart.sh
#!/bin/bash

X=$1

echo "$X"

route add default gw 192.168."$X".1

eval "$(route -n | awk '{ if ($8 =="eth0" && $2 != "0.0.0.0") print "route del default gw " $2; }')"

chattr -i /etc/resolv.conf
echo -e "search corp$X.un\nnameserver 192.168.$X.10" > /etc/resolv.conf
chattr +i /etc/resolv.conf

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-my-forward.conf && sysctl -p --system
λ cat Vagrantfile
...
### My provision ###

  config.vm.provision "provision_once", type: "shell", run: "once", path: "provision_once.sh"

  config.vm.provision "provision_onstart", type: "shell", run: "always", 
    args: X + " 2_arg 3_arg", 
    path: "provision_onstart.sh"

### /My provision ###
...
vagrant@node1:~$ ls /vagrant/

vagrant@node1:~$ shellcheck /vagrant/provision_once.sh
vagrant@node1:~$ shellcheck /vagrant/provision_onstart.sh

λ vagrant provision --provision-with provision_once,provision_onstart

server# ssh vagrant@node1

Provision с использованием ansible

λ cat Vagrantfile
...
  config.vm.provision "provision_docker", type: "ansible_local", run: "once" do |ansible|
    ansible.playbook = "provision_docker.yml"
  end
...
$ time vagrant provision --provision-with provision_docker
real    11m2,127s

Multi-Machine Vagrant Environments

λ vagrant destroy

λ touch nodes.yaml
- name: "node1"
  ip: "201"
- name: "node2"
  ip: "202"
- name: "node3"
  ip: "203"
λ npp Vagrantfile
...
require 'yaml'
nodes = YAML.load_file("./nodes.yaml")

Vagrant.configure("2") do |config|

### My config ###
  nodes.each do |opts| 
    config.vm.define opts["name"] do |config|
      config.vm.network "private_network", 
        adapter: 2, 
        name: "VirtualBox Host-Only Ethernet Adapter",
        ip: "192.168." + X + "." + opts["ip"]
      config.vm.hostname = opts["name"]
	  
      config.vm.provider :virtualbox do |vb|
        # vb.name = opts["name"]
        vb.memory = "2048"
        vb.cpus = "2"

        # file_to_disk = opts["name"] + '_2.vdi'
        # unless File.exist?(file_to_disk)
          # vb.customize ['createhd', '--filename', file_to_disk, '--size', 4 * 1024]
        # end
        # vb.customize ['storageattach', :id, '--storagectl', 'SATA', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]

      end
    end
  end
### /My config ###
...
λ vagrant up node1

λ vagrant up

λ vagrant status

λ vagrant ssh node2

λ vagrant halt node2

λ vagrant destroy node1

λ vagrant destroy -f

λ cd ~/conf/vagrant/nodes

λ nano Vagrantfile   #!!! set X

λ cat provision_once.sh   # look passwords

λ time vagrant up --parallel

Дополнительные возможности

Еще варианты Multi-Machine Vagrant Environments

Внутри Vagrantfile

λ npp Vagrantfile
...
Vagrant.configure("2") do |config|

### My config ###

  config.vm.define "node1" do |node1|
    node1.vm.network "private_network", ip: "192.168.X.201"
  end

  config.vm.define "node2" do |node2|
    node2.vm.network "private_network", ip: "192.168.X.202"
  end

  config.vm.define "node3" do |node3|
    node3.vm.network "private_network", ip: "192.168.X.203"
  end
  
### /My config ###
...

С использованием структур данных ruby

boxes = [
    {
        :name => "node1",
        :ip => "192.168.X.201",
        :vbox_config => [
            { "--cpus" => "2" },
            { "--memory" => "2048" }
        ],
    },
    {
        :name => "node2",
        :ip => "192.168.X.202",
        :vbox_config => [
            { "--cpus" => "2" },
            { "--memory" => "2048" }
        ],
    },
    {
        :name => "node3",
        :ip => "192.168.X.203",
        :vbox_config => [
            { "--cpus" => "2" },
            { "--memory" => "2048" }
        ],
    }
]

Vagrant.configure("2") do |config|

### My config ###
  boxes.each do |opts|
    config.vm.define opts[:name] do |config|
      config.vm.network "private_network", ip: opts[:ip]
      config.vm.hostname = opts[:name]

#      config.vm.provider "virtualbox" do | vb |
#        file_to_disk = opts[:name] + '_2.vdi'
#        unless File.exist?(file_to_disk)
#          vb.customize ['createhd', '--filename', file_to_disk, '--size', 4 * 1024]
#        end
#        vb.customize ['storageattach', :id, '--storagectl', 'SATA', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
#      end

      opts[:vbox_config].each do |hash|
        hash.each do |key, value|
          config.vm.provider :virtualbox do |vb|
            vb.customize ["modifyvm", :id, key, value]
          end
        end
      end
    end
  end

### /My config ###

  ...

end

С использованием json

λ npp nodes.json &
[
    {
        "name": "node1",
        "ip": "192.168.X.201",
        "vbox_config": [
            { "--cpus": "2" },
            { "--memory": "2048" }
        ]
    },
    {
        "name": "node2",
        "ip": "192.168.X.202",
        "vbox_config": [
            { "--cpus": "2" },
            { "--memory": "2048" }
        ]
    },
    {
        "name": "node3",
        "ip": "192.168.X.203",
        "vbox_config": [
            { "--cpus": "2" },
            { "--memory": "2048" }
        ]
    }
]
$ cat Vagrantfile
require 'json'
boxes = JSON.parse(File.read('./nodes.json'))

Vagrant.configure("2") do |config|

### My config ###

  boxes.each do |opts|
    config.vm.define opts["name"] do |config|

      config.vm.network "private_network", ip: opts["ip"]
      config.vm.hostname = opts["name"]

      opts["vbox_config"].each do |hash|
        hash.each do |key, value|
          config.vm.provider :virtualbox do |vb|
            vb.customize ["modifyvm", :id, key, value]
          end
        end
      end

    end
  end

### /My config ###

...

end
технология_vagrant.txt · Last modified: 2024/03/11 19:00 by val