vagrant+hypervでのRhel(subscriptionの自動登録、解除)


日本語でまとまっている情報がなかったので書きます。
vagrant使ってsubscription-managerを手動で打っているサイト結構あるけど、
自動化できるのでちゃんと自動化しましょう。

## hyper-vとvagrantのインストール

[ここ](https://zenn.dev/oto/articles/8dbdb48d9a10ce)を見てください。

## rhelのサブスクリプションの申請

developerアカウントなら、無料で使えます。
rhel自体はsubscriptionが無くても実は使えますが、
使えるパッケージがかなり限定されるのでほぼほぼ使えません。
(口述のntfsと連携とるためのライブラリやgroupinstallの"Server With GUI"も使えない。)
rhelの登録をしておきましょう。

[rhelのdeveloper用サイト](https://developers.redhat.com/products/rhel/download?onebox=rhel)

## vagrantのプラグインのインストール

vagrant up時に自動的にrhelにサブスクリプションの登録、
vagrant halt時に解除を行うプラグインです。

プラグインとしてはredhat公式にこれ使えと書かれているので安全かと。

この二つの他は必要ないです。

```powershell
vagrant plugin install vagrant-service-manager
vagrant plugin install vagrant-registration
```

## Vagrantfile

下記のような感じになります。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
    # The most common configuration options are documented and commented below.
    # For a complete reference, please see the online documentation at
    # https://docs.vagrantup.com.
  
    # Every Vagrant development environment requires a box. You can search for
    # boxes at https://vagrantcloud.com/search.
    # config.vm.box = "oraclelinux/i"
    config.vm.box = "generic/rhel9"

    # The url from where the 'config.vm.box' box will be fetched if it
    # doesn't already exist on the user's system.
    # config.vm.box_url = "https://oracle.github.io/vagrant-projects/boxes/oraclelinux/7.json"

    # dont set ssh key, if you create vagrant box from this container.
    # this config is being used, firtst time you create and launch container.
    # config.ssh.insert_key = false

    # Disable automatic box update checking. If you disable this, then
    # boxes will only be checked for updates when the user runs
    # `vagrant box outdated`. This is not recommended.
    # config.vm.box_check_update = false
  
    # Create a forwarded port mapping which allows access to a specific port
    # within the machine from a port on the host machine. In the example below,
    # accessing "localhost:8080" will access port 80 on the guest machine.
    # NOTE: This will enable public access to the opened port
    # config.vm.network "forwarded_port", guest: 3000, host: 3000
    # config.vm.network "forwarded_port", guest: 1521, host: 1521
  
    # Create a forwarded port mapping which allows access to a specific port
    # within the machine from a port on the host machine and only allow access
    # via 127.0.0.1 to disable public access
    # config.vm.network "forwarded_port", guest: 3000, host: 3000, host_ip: "127.0.0.1"
  
    # Create a private network, which allows host-only access to the machine
    # using a specific IP.
    # config.vm.network "private_network", ip: "192.168.33.10"
  
    # Create a public network, which generally matched to bridged network.
    # Bridged networks make the machine appear as another physical device on
    # your network.
    # config.vm.network "public_network"
  
    # Share an additional folder to the guest VM. The first argument is
    # the path on the host to the actual folder. The second argument is
    # the path on the guest to mount the folder. And the optional third
    # argument is a set of non-required options.

    # Share an additional folder to the guest VM. The first argument is
    # the path on the host to the actual folder. The second argument is
    # the path on the guest to mount the folder. And the optional third
    # argument is a set of non-required options.
    # config.vm.synced_folder "../data", "/vagrant_data"

    config.registration.username = ENV['REDHAT_USERNAME']
    config.registration.password = ENV['REDHAT_PASSWORD']

    # Provider-specific configuration so you can fine-tune various
    # backing providers for Vagrant. These expose provider-specific options.
    # Example for VirtualBox:
    #
    config.vm.provider "virtualbox" do |vb|
      # Display the VirtualBox GUI when booting the machine
      vb.gui = true

      # Customize the amount of memory on the VM:
        vb.memory = "8192"
    end

    config.vm.provider "hyperv" do |hv|
      # hyper-vでゲストーホスト間でのファイル共有が必要な場合は必須。
      config.vm.synced_folder ".", "/vagrant", type: "smb"
      hv.maxmemory = "8192"
    end
    #
    # View the documentation for the provider you are using for more
    # information on available options.
  
    # Enable provisioning with a shell script. Additional provisioners such as
    # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
    # documentation for more information about their specific syntax and use.
    config.vm.provision "shell", path: "./provision.sh"
end

```

vagrantのprovision用のファイルは次のようになります。

```bash:provision.sh
dnf update -y

# macの日本語キーボードの場合は下のレイアウトを反映させる。
# これを反映させないとhyper-vなどの画面から操作するときに実際のキーボードと
# 違うレイアウトになる。
# mac以外のPCの場合は下記のコマンドでノートパソコンのキーマップで近いものを調べて設定すること。
# localectl list-x11-keymap-models
localectl set-x11-keymap jp apple_laptop

# ゲストーホスト間でファイル共有するなら必要。
dnf install -y cifs-utils

## ここから下はGUIでRhelを使いたい場合のみ必要。
# いらないならコメントアウト
dnf -y groupinstall "Server with GUI"

# guiを起動させるために必要。
systemctl set-default graphical.target

```

## ユーザー名、パスワードを環境変数として設定しておく。

REDHATのユーザー名とパスワードを登録しておきます。
上の設定だと

```powershell
Set-ItemProperty HKCU:\Environment\ -Name REDHAT_USERNAME -Value <username>
Set-ItemProperty HKCU:\Environment\ -Name REDHAT_PASSWORD -Value <password>
```

設定しておく。

GUIのユーザーも

```powershell
Set-ItemProperty HKCU:\Environment\ -Name VAGRANT_USERNAME -Value <username>
Set-ItemProperty HKCU:\Environment\ -Name VAGRANT_PASSWORD -Value <password>
```

windowsには環境変数のバグがあるので、レジストリから必ず触ってください。
いろいろ意識するの面倒臭いと思うので。

## vagrantの起動

Vagrantfile下で

```powershell
vagrant up --provider hyperv
```

ＧＵＩの場合は最後までインストールできたら、
したのコマンドで再起動させると、GUIの画面でログインできるようになります。
hyper-vのウィンドウだけ立ち上がらないので、その部分だけ手動になります。

```powershell
vagrant reload
```

## refrerence

[Redhat サイトvagrant](https://access.redhat.com/node/2386171/chapter-3-interacting-with-running-vagrant-boxes)

[robox](https://github.com/lavabit/robox)