🫠

Vagrantで作成したVMにIPを設定する(HyperV)

2025/02/19に公開

前置き

HyperV-Provider(VagrantでHyperVを使用できるようにする機能)の制約上、Vagrantfileにネットワーク周りの設定を書いてもかなりの確実で無視されます。

※Virtualboxだと下記1行で仮想スイッチ設定なりIP設定なり完結します。

config.vm.network "private_network", ip: "192.168.10.2"

仮想スイッチが選択制(CLIで選択しなくてはいけない)なのはいいとして、
IPが設定できないとDHCPで起動した後IPを変更するという一手間がかかってしまうので何とかしようと試行錯誤した次第です。

本題

Ubuntuでは17.10以降からNetplanによるネットワーク設定になっているため、netplanの設定ファイルを変更しています。

NetworkManagerを使用しているディストリビューション(CentOS系)なら、nmcliをする必要があるので、対象環境Ⅱで実施とします。

対象環境Ⅰ

Ubuntu 22.04 on HyperV (with Vagrant)
vCPU:1コア メモリ4G

Vagrantfile

Vagrant.configure("2") do |config|
    config.vagrant.plugins = [
      "vagrant-env"
    ]
    config.env.enable
    config.vm.provider "hyperv" do |hv|
      hv.cpus = 1
      hv.memory = "4096"
      hv.maxmemory = nil
    end
  
    config.vm.define :node1 do |node1|
      node1.vm.hostname = "node1"
      node1.vm.box = "generic/ubuntu2204"
      node1.vm.provision "shell", inline: $common_provisioning
      node1.vm.provision "shell", inline: $ubuntu_provisioning
      node1.vm.provision :shell do |shell|
        shell.privileged = true
        shell.path = "./configure-static-ip_node1.sh"
      end
      node1.vm.provision :reload
    end

  $common_provisioning = <<-'SCRIPT'
  timedatectl set-timezone Asia/Tokyo
  sed -e s/^'PasswordAuthentication no'/'PasswordAuthentication yes'/ /etc/ssh/sshd_config > /tmp/sshd_config
  mv -f /tmp/sshd_config /etc/ssh/
  chmod 0600 /etc/ssh/sshd_config
  systemctl restart sshd.service
  SCRIPT
  
  $ubuntu_provisioning = <<-'SCRIPT'
  apt -y update
  apt -y upgrade
  SCRIPT

  end

.env(なくてもいい)

VAGRANT_DEFAULT_PROVIDER=hyperv

configure-static-ip_node1.sh

#!/bin/bash
STATIC_IP=<<設定したいIP>>/<<サブネット>>
DGW_IP=<<デフォルトゲートウェイ>>
DNS_IP=<<DNSサーバーIP>>

echo "network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
      dhcp6: false
      addresses: [${STATIC_IP}]
      routes:
      - to: default
        via: ${DGW_IP}
      optional: true
      nameservers:
        addresses: [${DNS_IP}]" > /etc/netplan/99-vagrant-node1.yaml

注意点・備考

  • configure-static-ip_node1.shで netplan applyしたくなりますが、
    この時点では適用せずにプロビジョニング後の再起動で適用させます。

  • netplanはXX-YYYY.yamlのXX値が低いものから読み込む挙動であり、
    設定値としては後読み優先ですのでDHCP設定などをオーバーライドしています。

対象環境Ⅱ

Almalinux8 on HyperV (with Vagrant)
vCPU:1コア メモリ4G

Vagrantfile

Vagrant.configure("2") do |config|
    config.vagrant.plugins = [
      "vagrant-env"
    ]
    config.env.enable
    config.vm.provider "hyperv" do |hv|
      hv.cpus = 1
      hv.memory = "4096"
      hv.maxmemory = nil
    end
  
    config.vm.define :node1 do |node1|
      node1.vm.hostname = "node1"
      node1.vm.box = "generic/alma8"
      node1.vm.provision "shell", inline: $common_provisioning
      node1.vm.provision "shell", inline: $ubuntu_provisioning
      node1.vm.provision :shell do |shell|
        shell.privileged = true
        shell.path = "./configure-static-ip_node1.sh"
      end
      node1.vm.provision :reload
    end

  $common_provisioning = <<-'SCRIPT'
  timedatectl set-timezone Asia/Tokyo
  sed -e s/^'PasswordAuthentication no'/'PasswordAuthentication yes'/ /etc/ssh/sshd_config > /tmp/sshd_config
  mv -f /tmp/sshd_config /etc/ssh/
  chmod 0600 /etc/ssh/sshd_config
  systemctl restart sshd.service
  SCRIPT
  
  $alma_provisioning = <<-'SCRIPT'
  dnf -y update
  SCRIPT

  end

.env(なくてもいい)

VAGRANT_DEFAULT_PROVIDER=hyperv

configure-static-ip_node1.sh

#!/bin/bash
STATIC_IP=<<設定したいIP>>/<<サブネット>>
DGW_IP=<<デフォルトゲートウェイ>>
DNS_IP=<<DNSサーバーIP>>

nmcli con mod "System eth0" ipv4.method manual ipv4.address ${STATIC_IP} connection.autoconnect yes
nmcli con mod "System eth0" ipv4.gateway ${DGW_IP}
nmcli con mod "System eth0" ipv4.dns ${DNS_IP}

注意点・備考

  • connection自体は"System eth0"なのでそれを指定しています。
    devで"eth0"を指定してもよいですが、設定を永続化できません。

Discussion