🫠
Vagrantで作成したVMにIPを設定する(HyperV)
前置き
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