CentOSで動作検証環境をVagrantで作る話

CentOS … 今ディストリビューションまわりで人気のトピックです!

ってか、CentOS (2020/11/30 没) CentOS 6.10(Final) to CentOS 7.9な話

ねたに少々していましたが、CentOS 8にしても、CentOS自体がなくなるんで…. 無駄なあがきですねw

と、今回ですが、このCentOSの動作検証環境を作る!って話です。

開発環境の話

私流の開発環境をまとめますと

  • ローカル開発環境
  • ローカル動作検証環境
  • 動作検証環境
  • 本番環境

ローカル開発環境 : ズバリソースを作るときに動いている環境ですね
動作検証環境 : 出来上がったプログラムを走らせて確認する環境
本番環境 : ずばり!運用している環境です

となると、ローカル動作検証環境ってのが説明が難しいですかね
動作環境ってのは基本的には多人数で使います。そこで、マージ完了した状態でも動作を確認したほうが良いので
動作検証環境を一人で使えば楽じゃんってことです。
チームが増えると、動作検証環境って触るのが安易ではいれませんしね

具体的な動作しているプログラムってのまとめると

OSWebサーバ言語バージョンDBバージョン
開発環境自由自由基本自由一致させたい
ローカル動作環境自由本番と同じ本番と同じ本番と同じ
動作環境本番と同じ本番と同じ本番と同じ本番と同じ
本番環境本番と同じ本番と同じ本番と同じ本番と同じ

動作環境と本番環境はハードスペック。インストールパッケージまで一致させたい最終動作確認です

ま、本番は物理サーバ、動作環境はVMってのが普通とは思いますが…

となると、ローカル動作環境はvm 開発環境はdockerとなるでしょうけね

環境
開発環境Docker
ローカル動作環境仮想
動作環境仮想
本番環境物理

はい… はい、これまでで、なんとなく環境周りは紹介できましたでしょうか

え!?動作環境を二重化する!

今回なぜゆえCentOSとか言っているのかというと…

本番環境 未だに、死んでいるCentOSとか使っているものあるんや…

先日 Apache 2.4.49の脆弱性でも調べましたが、CentOSでyumではサポート切れのapache 2.2しか対応していないし… セキュリティはズタボロですw

そうするとどうするのかというと新しいディストリビューションに移行させよう!とか言いますよねw

開発環境にもよりますが、ほとんどおいそれ!と以降は可能です。

でも、でもでも、でもでもでもでも

動作環境を新しいディストリビューションにして、本番に移行する!とか言われても、開発環境にて確認していないし… とかなりますわね。

するってーと、以下の部分が新・旧環境を作って移植動作を確認する必要が出ます

  • ローカル開発環境
  • 動作環境

うん、だったら!作ろう!

とか言いますが、一番の問題は… CentOSはサポートを終えています!

サポートが切れると、パッケージ公開されない!?

今回のフェーズでは、新しいディストリビューションを作るってことですから、あまり影響がないですが
移行に新メンバーが追加した時を想定しています。

いつもどおりに… DockerはOK。 環境構築するvagrantを….

そんなの、公式のBOX使えば

https://app.vagrantup.com/centos

使えば…

もちろん!7,8だけですw

じゃ、じゃぁ、サードパーティで… 根本的な部分で諦めてください…
サポートが終わるってそんなことですw

当たり前ですが、boxを使うと…

$ vagrant init centos/6
==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

ここまで来ると、悲しいから諦め…
られないのが漢だろう!

意地でもCentOS6を作る!

意地でもCentOS6の環境を作る方法ですが、周りに使っている人がいることが前提です!
トリッキーですが、Boxのキャッシュを拝借しますw

$ ls ~/.vagrant.d/boxes/
bento-VAGRANTSLASH-centos-6.10	ubuntu-VAGRANTSLASH-bionic64
bento-VAGRANTSLASH-centos-6.9	ubuntu-VAGRANTSLASH-focal64
centos-VAGRANTSLASH-7		ubuntu-VAGRANTSLASH-trusty64
generic-VAGRANTSLASH-centos6	ubuntu-VAGRANTSLASH-xenial64
p0bailey-VAGRANTSLASH-centos-7

ホーム直下のvagrant.dにあります! windowsでもそのあたりに

ここに公式のcentos6 boxをいれます!

$ ls ~/.vagrant.d/boxes/
bento-VAGRANTSLASH-centos-6.10	p0bailey-VAGRANTSLASH-centos-7
bento-VAGRANTSLASH-centos-6.9	ubuntu-VAGRANTSLASH-bionic64
centos-VAGRANTSLASH-6		ubuntu-VAGRANTSLASH-focal64
centos-VAGRANTSLASH-7		ubuntu-VAGRANTSLASH-trusty64
generic-VAGRANTSLASH-centos6	ubuntu-VAGRANTSLASH-xenial64

centos-VAGRANTSLASH-6これです。

作成してみます…

$ vagrant init centos/6
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

作れました!

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos/6'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'centos/6' version '2004.01' is up to date...
==> default: There was a problem while downloading the metadata for your box
==> default: to check for updates. This is not an error, since it is usually due

動きましたw

キャッシュさえ手に入れば無理やりに動かすことができるわけで

無理やり動かすことでの不具合周り

はじめに環境周りをまとめます

アプリバージョン
Virtual boxVersion 6.1.26
vagrant2.2.14
$ vagrant plugin listvagrant-docker-compose (1.5.1, global)
  – Version Constraint: > 0
vagrant-share (1.1.11, global)
  – Version Constraint: > 0
vagrant-vbguest (0.28.0, global)
  – Version Constraint: > 0

はい、無理やり動かすとなにか問題があるのでしょうか?
その部分を書いておきます!

ま、プレーンではできませんので簡単なWebサーバを想定してみましょう

8888ポートでnginx にてページ表示… って程度
ファイルはプロジェクト直下のpublicがwwwルート

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "centos/6"

  config.vm.network "forwarded_port", guest: 80, host: 8888, auto_config: false
  config.vm.synced_folder ".", "/var/share/www", type: "virtualbox"
end

まだ、nginxの指定はしていないですが、こんな感じでOKですわね

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/6' version '2004.01' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 80 (guest) => 8888 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
[default] No Virtualbox Guest Additions installation found.
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
Unmounting Virtualbox Guest Additions ISO from: /mnt
umount: /mnt: not mounted
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default: 
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

umount /mnt

Stdout from the command:



Stderr from the command:

umount: /mnt: not mounted

あぼーんw Virtualboxのマウントを使うためにVirtualbox Guest Addtions ISOをインストールタイミングで死んでいますね。
理由としてはミラーが見つからないってことですわね

removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt

だったら、どうするか!
Guest ISOをインストール直前でmirrorを書き換えれば…OK!

  config.vbguest.installer_hooks[:before_install] = [
  'sed -i -e "s/^mirrorlist=http:\/\/mirrorlist.centos.org/#mirrorlist=http:\/\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo' ,
   'sed -i -e "s/^#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo',
   'yum -y update'
   ]
Installing Virtualbox Guest Additions 6.1.26 - guest version is unknown

入りました!ぱちぱちぃ〜

解説は… ま、デフォルトのカーネルバージョンとかGuestのカーネルバージョンのミスマッチとかだったはずです

そもそも、yumのリポジトリがないので… それどころではないってことですw

簡単なhttpアクセスできるVagrantfileファイル

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "centos/6"

  config.vm.network "forwarded_port", guest: 80, host: 8888, auto_config: false
  config.vbguest.installer_hooks[:before_install] = [
  'sed -i -e "s/^mirrorlist=http:\/\/mirrorlist.centos.org/#mirrorlist=http:\/\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo' ,
   'sed -i -e "s/^#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo',
   'yum -y update'
   ]
   config.vm.synced_folder "./public", "/var/www/html/", type: "virtualbox"
   config.vm.provision "shell", inline: <<-SHELL
    sudo yum -y install httpd
    sudo service httpd start
    httpd -v
  SHELL
end

8888ポートにアクセスするとpublicのhtmlが表示されます。難しくないですねw

ただ、apache http serverのバージョンが…

    default: Server version: Apache/2.2.15 (Unix)
    default: Server built:   Jun 19 2018 15:45:13

終わっていますねw

まともなApache http serverを使う!

先日の脆弱性を放置しないように最新ソースを使いましょう!

httpd-2.4.51.tar.gzを使いますw
バージョンとかは、自分でなんとかしてね

メモ : コンパイルが予想以上に難産だったw

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "centos/6"

  config.vm.network "forwarded_port", guest: 80, host: 8888, auto_config: false
  config.vbguest.installer_hooks[:before_install] = [
  'sed -i -e "s/^mirrorlist=http:\/\/mirrorlist.centos.org/#mirrorlist=http:\/\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo' ,
   'sed -i -e "s/^#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo',
   'yum -y update'
   ]
   config.vm.synced_folder "./public", "/usr/local/apache2/htdocs/", type: "virtualbox"
   config.vm.provision "shell", inline: <<-SHELL
    yum -y -q install gcc-c++ expat-devel

    curl --silent -o pcre-8.45.tar.gz https://free.nchc.org.tw/osdn//sfnet/p/pc/pcre/pcre/8.45/pcre-8.45.tar.gz
    tar zvfx pcre-8.45.tar.gz
    sudo tar zfx pcre-8.45.tar.gz -C /usr/local/src/
    cd /usr/local/src/pcre-8.45
    ./configure --prefix=/usr/local/pcre --silent
    make
    make install

    curl --silent -o apr-1.7.0.tar.gz https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz
    sudo tar zfx apr-1.7.0.tar.gz -C /usr/local/src/
    cd /usr/local/src/apr-1.7.0
    ./configure --silent
    make
    make install

    curl --silent -o apr-util-1.6.1.tar.gz https://dlcdn.apache.org//apr/apr-util-1.6.1.tar.gz
    sudo tar zfx apr-util-1.6.1.tar.gz -C /usr/local/src/
    cd /usr/local/src/apr-util-1.6.1
    ./configure --with-apr=/usr/local/apr --silent
    make
    make install

    curl --silent -o httpd-2.4.51.tar.gz https://dlcdn.apache.org//httpd/httpd-2.4.51.tar.gz
    sudo tar zfx httpd-2.4.51.tar.gz -C /usr/local/src/
    cd /usr/local/src/httpd-2.4.51
    ./configure --with-apr=/usr/local/apr --with-pcre=/usr/local/pcre --silent
    make
    make install

    sudo /usr/local/apache2/bin/apachectl start
    /usr/local/apache2/bin/apachectl -v

  SHELL
end

ま、これで、最新のapache http serverが使えました!

    default: Server version: Apache/2.4.51 (Unix)
    default: Server built:   Oct 15 2021 06:02:28