※当サイトの記事には、広告・プロモーションが含まれます。

VagrantとVirtualboxでMySQLにDNS経由で接続できる環境を構築してみる

nazology.kusuguru.co.jp

塩分で血圧が上がってしまう理由は一般的に、血液中の塩分濃度を下げるため血流が増すからだと説明されています。

「塩分で高血圧になる理由」塩による“脳の炎症”だった!?最新研究が示す新事実 - ナゾロジー

しかし、カナダの名門マギル大学(McGill University)の研究チームは、「塩分が引き起こす高血圧は、腎臓や血管だけでなく脳の炎症も関係しているのではないか」と仮説を立て、そのメカニズムを明らかにしました。

「塩分で高血圧になる理由」塩による“脳の炎症”だった!?最新研究が示す新事実 - ナゾロジー

⇧ なるほど、「アルコール」で酔っ払ってる時に、塩分が欲しくなるのも、「脳」の「機能低下」が関係してるんですかね?

「ダイエット」とかで「味の濃い」ものを避けるというのも、「味の濃い」ものほど「美味しく」感じられる傾向が多い気がしますし、「美味しい」と感じるのも「脳」が「神経」を介して「電気信号」を送ってるからということですかね?

「脳疲労」が酷い状態だと、思考力が低下して普段は抑制している「ジャンクフード」を摂取しやすくなるという話もありますしな...

「濃い味付け」を「美味しい」と感じる科学的なメカニズムが分からないですが、

honkawa2.sakura.ne.jp

⇧ 上記サイト様の統計によると、「塩分摂取量」の上位は、「アジア圏」が多い。

と言うか、有志に頼るのではなく、国が統計を公開して欲しいところだが...

まぁ、「世界保健機関(WHO:World Health Organization)」の「推奨値」を大幅にオーバーしているのは、「日本」だけじゃないのだが、最早、「先進国」で「推奨値」を満たしている国は無い気がするんだが...

逆に、「世界保健機関(WHO:World Health Organization)が、どういった「食事」を想定しているのか教えて欲しい気はする...

MySQLはサイレントインストール的な仕組みが用意されていない

とりあえず、ネットの情報を検索してみたが、「サイレントインストール」的な仕組みは用意されていないらしい。

なので、「サイレントインストール」っぽいことを実現するには、

dev.mysql.com

qiita.com

⇧ 上記サイト様にありますように、スクリプトを用意してあげる必要があるっぽい。

ちなみに、

zenn.dev

⇧ 上記サイト様にありますように、「パスワード」オプションでスペースが不要という罠があるので注意。

そもそも、

qiita.com

⇧ パスワードの直接指定が非推奨らしい。

VagrantVirtualboxMySQLDNS経由で接続できる環境を構築してみる

で、昨今の「クラウドサービスプロバイダー」の「サービス」を利用した環境において、「マネージドサービス」の「データベース」を利用することが多い気がする。

例えば、「Microsoft Azure」だと、

jpaztech.github.io

⇧ 上記サイト様にありますように、デフォルトで「Azure」の「リソース」に対して「名前解決(DNS:Domain Name System)」を行っている。

とりあえず、

qiita.com

linux-jp.org

takuya-1st.hatenablog.jp

www.konosumi.net

qiita.com

dqn.sakusakutto.jp

⇧ 上記サイト様を参考に構築してみる。

 

環境としては、

  1. ホスト側
    1. Windows 10 Home
    2. Vagrant
    3. VirtualBox
    4. VS CodeVisual Studio Code
  2. ゲスト側
    1. 仮想マシンMySQL クライアント用)
    2. 仮想マシンDNS サーバー用)
    3. 仮想マシンMySQL サーバー用)

といった感じですかね。

「ゲスト」側は、

  1. Vagrant
  2. VirtualBox

で、構築することになるのだが、

No 役割 ホスト名 NIC IPアドレス
1 MySQL クライアント mysql-client NAT ※1
内部ネットワーク 10.10.10.101
ホストオンリーアダプター 192.168.56.101
2 DNS サーバー dns-router NAT ※1
内部ネットワーク 10.10.10.10
3 MySQL サーバー mysql-server NAT ※1
内部ネットワーク 10.10.10.201

※1 Vagrantがデフォルトで作成。vagrant ssh の時に利用されると思われる。

⇧ のような感じ。

■今回のvagrant upの実行に必要なファイル群

D:\work-soft\vagrant\mysql
│  Vagrantfile
│
└─vms
    ├─dns-router
    │  └─scripts
    │          setup.sh
    │
    └─mysql-server
        └─scripts
                setup.sh    

■D:\work-soft\vagrant\mysql\vms\mysql-server\scripts\setup.sh

#!/bin/bash

# MySQLリポジトリのセットアップ
# https://dev.mysql.com/doc/refman/8.4/en/linux-installation-yum-repo.html
#sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
curl -OL https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm

# GPGキーのインポート
#sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql

rpm -ivh mysql84-community-release-el9-1.noarch.rpm

# MySQL 8.4(LTS版)をインストール
echo "######## Install mysql mysql-server ########"
#sudo dnf install -y mysql-server
sudo dnf install -y mysql mysql-server

# firewalldをインストール
echo "######## Install firewalld ########"
sudo dnf install -y firewalld

# MySQLを開始して自動起動を有効化
echo "######## MySQL service start ########"
sudo systemctl start mysqld
sudo systemctl enable mysqld

sudo systemctl stop mysqld

# MySQL設定: リモート接続を許可する設定
echo "######## modify MySQL conf ########"
#sudo sed -i 's/^bind-address\s*=.*$/bind-address = 0.0.0.0/' /etc/my.cnf
sudo sed -i '/^bind-address/d' /etc/my.cnf
sudo sed -i '/^\[mysqld\]/a bind-address = 0.0.0.0' /etc/my.cnf

sudo systemctl restart mysqld
sudo systemctl status mysqld

# 初期パスワードを抽出
# https://dev.mysql.com/doc/refman/8.4/en/linux-installation-rpm.html
MYSQL_INITIAL_ROOT_PASSWORD=$(sudo cat /var/log/mysqld.log | grep 'temporary password' | awk '{print $13}')

# MUST total password length is at least 8 characters
MYSQL_MODIFIED_ROOT_PASSWORD="Rootpassword#1"
MYSQL_CLIENT_USER_PASSWORD="Mypassword#1"

# MySQLのユーザーrootのパスワードをリセット
echo "######## Modify user root paswword for MySQL ########"
mysql -u root -p"${MYSQL_INITIAL_ROOT_PASSWORD}" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_MODIFIED_ROOT_PASSWORD';"

# パスワードポリシー無効化(強制的なパスワードポリシーを無効にする)
echo "######## Disabling password policy for MySQL ########"
# 変更前のパスワードポリシー
BEFORE_PASSWORD_POLICY=$(mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "show variables like 'validate_password%';")

# パスワードポリシーの変更
mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "SET GLOBAL validate_password.policy = LOW;"
mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "SET GLOBAL validate_password.length = 6;"

# 変更後のパスワードポリシー
AFTER_PASSWORD_POLICY=$(mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "show variables like 'validate_password%';")

# 変更前と変更後の差分
diff <( echo "${BEFORE_PASSWORD_POLICY}" ) <( echo "${AFTER_PASSWORD_POLICY}" )

# MySQLユーザーを作成(外部接続許可)
# https://dev.mysql.com/doc/refman/8.4/en/creating-accounts.html
echo "######## Create user for MySQL ########"
mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "CREATE USER 'client_user'@'%' IDENTIFIED BY '$MYSQL_CLIENT_USER_PASSWORD';"
mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "GRANT ALL PRIVILEGES ON *.* TO 'client_user'@'%' WITH GRANT OPTION;"
mysql -u root -p"${MYSQL_MODIFIED_ROOT_PASSWORD}" --connect-expired-password -e "FLUSH PRIVILEGES;"

# ファイアウォール設定: MySQLポート開放
echo "######## Firewall service start ########"
sudo systemctl start firewalld
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload
   

■D:\work-soft\vagrant\mysql\vms\dns-router\scripts\setup.sh

#!/bin/bash

sudo dnf install -y firewalld bind bind-utils policycoreutils-python-utils

sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

sudo systemctl start firewalld
sudo systemctl enable firewalld

sudo firewall-cmd --permanent --zone=public --add-service=dns
sudo firewall-cmd --reload

sudo systemctl start named
sudo systemctl enable named

sudo cp -p /etc/named.conf /etc/named.conf.bk

sudo sed -i -r 's/listen-on port 53 \{ 127.0.0.1; \};/listen-on port 53 \{ any; \};/' /etc/named.conf
sudo sed -i -r 's/listen-on-v6 port 53 \{ ::1; \};/#&/g' /etc/named.conf
sudo sed -i -r 's@allow-query\s*\{ localhost; \};@allow-query \{ any; \};@' /etc/named.conf

grep -q 'zone "mysql.local"' /etc/named.conf || cat <<EOF | sudo tee -a /etc/named.conf
zone "mysql.local" IN {
  type master;
  file "/etc/named/zones/mysql.local.zone";
  allow-update { none; };
};
EOF

sudo mkdir -p /etc/named/zones

MYSQL_LOCAL_ZONE=`cat <<"EOF"
$TTL 86400
@    IN    SOA DNS-server.mysql.local. root.mysql.local. (
            2025082901 ; Serial
            3600       ; Refresh
            1800       ; Retry
            1209600    ; Expire
            86400      ; Minimum TTL
)
@                       IN NS DNS-server.mysql.local.
DNS-server.mysql.local. IN A  10.10.10.10
mysql.local.            IN A  10.10.10.201

EOF`

echo "${MYSQL_LOCAL_ZONE}" | sudo tee /etc/named/zones/mysql.local.zone

sudo chown root:named /etc/named/zones/mysql.local.zone

sudo semanage fcontext -a -t named_zone_t "/etc/named/zones/mysql.local.zone"
sudo restorecon -v /etc/named/zones/mysql.local.zone

sudo named-checkzone mysql.local /etc/named/zones/mysql.local.zone

sudo systemctl restart named
sudo systemctl status named || exit 1

■D:\work-soft\vagrant\mysql\Vagrantfile

# https://portal.cloud.hashicorp.com/vagrant/discover/almalinux/9
IMAGE_NAME = "almalinux/9"
IMAGE_VESION = "9.6.20250522"

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

  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
    v.cpus = 1
  end

  # クライアントVM設定
  config.vm.define "mysql-client" do |client|
    client.vm.box = IMAGE_NAME
    client.vm.box_version = IMAGE_VESION

    client.vm.hostname = "client"
    # ホストオンリーアダプター
    # ホスト側のMySQLクライアントで接続するため用
    client.vm.network "private_network", ip: "192.168.56.101"
    # 内部ネットワーク
    client.vm.network "private_network", ip: "10.10.10.101", virtualbox__intnet: "internal_net"

    # クライアントVMに関する設定など
    client.vm.provision "shell", inline: <<-SHELL
      # MySQLクライアントのインストール
      sudo dnf install -y mysql
      # DNSの接続に関するデバッグ用途
      sudo dnf install -y bind-utils
    SHELL

    # クライアントVMのDNS設定を変更(ルーターVMのDNSを使用)
    client.vm.provision "shell", inline: <<-SHELL
      echo "nameserver 10.10.10.10" | sudo tee /etc/resolv.conf
    SHELL
  end

  # MySQLサーバー用VM設定(MySQL LTS版インストール)
  config.vm.define "mysql-server" do |server|
    server.vm.provider "virtualbox" do |v|
      v.memory = 2048
      v.cpus = 2
    end
    server.vm.disk :disk, size: "200GB", primary: true
    server.vm.box = IMAGE_NAME
    server.vm.box_version = IMAGE_VESION

    # MySQLサーバー用VMのホスト名を設定
    server.vm.hostname = "mysql.local"
    # 内部ネットワーク
    server.vm.network "private_network", ip: "10.10.10.201", virtualbox__intnet: "internal_net"
    
    # 
    server.vm.provision "file", source: "vms/mysql-server/scripts/setup.sh", destination: "/tmp/mysql-server/scripts/setup.sh"

    # MySQLサーバー用VMにMySQL LTS版をインストール
    server.vm.provision "shell", inline: <<-SHELL
      chmod +x /tmp/mysql-server/scripts/setup.sh
      /tmp/mysql-server/scripts/setup.sh
    SHELL
  end

  # DNSサーバー用VM設定(異なるサブネット間のルーティング + BINDインストール)
  config.vm.define "dns-router" do |dns|
    dns.vm.box = IMAGE_NAME
    dns.vm.box_version = IMAGE_VESION

    dns.vm.hostname = "dns"
    # 内部ネットワーク
    dns.vm.network "private_network", ip: "10.10.10.10", virtualbox__intnet: "internal_net"

    dns.vm.provision "file", source: "vms/dns-router/scripts/setup.sh", destination: "/tmp/dns-router/scripts/setup.sh"

    # DNSサーバー用設定: IPフォワーディングとNAT
    dns.vm.provision "shell", inline: <<-SHELL
      chmod +x /tmp/dns-router/scripts/setup.sh
      /tmp/dns-router/scripts/setup.sh
    SHELL
  end
end
    

⇧ で、「Vagrantfile」ファイルの配置されているディレクトリに移動し、「Vagrant」の機能で「仮想マシン」の構築と、設定などを実施。

■「Vagrantfile」ファイルの配置されているディレクトリに移動

 

cd /d D:\work-soft\vagrant\mysql  

vagrant up

vagrant up

そしたらば、新たに「コマンドプロンプト」を起ち上げて、「MySQLクライアント用」の「仮想マシン」にSSHログインし、「MySQLサーバー用」の「仮想マシン」で稼働している「MySQL」に対して「名前解決(DNS:Domain Name System)」で接続。

接続できました。

ホスト側の「VS CodeVisual Studio Code)」の「拡張機能」の「MySQLクライアント」とかで踏み台サーバー経由による「MySQL」への接続は、別の機会に。

VS CodeVisual Studio Code)」の「拡張機能」の「MySQLクライアント」を探すところからになりますが...

毎度モヤモヤ感が半端ない…

今回はこのへんで。