Vagrant ITかあさん

ITかあさん

Vagrantでpingが通らない!ゆえにVagrantネットワークを学び直したよ

Vagrantでpingが通らない発生

Vagrant
こんにちは、大変ご無沙汰しております。仕事忙しくて死んでましたが比較的元気です。
比較的元気めに死んでました。
Vagrant環境を構築したら事件に遭遇。

vagrantでWebサーバー立てたのにブラウザから全くアクセス出来ない

問題解決するまでに3連休使ってしまいましたよ。
結果として、ネットワーク失敗したvagrantを一度destroyしてもう一度upするとうまくいったのですが、vagrantはもとい、centos7のネットワーク関係を学ぶのによい機会となったので備考録として残しておきたいと思います。

Vagrantfileを今一度しっかり読もう

明らかにVagrantのネットワークに関する問題にぶつかって、初めてしっかりとVagrantfileに目を通しました。
(遅せーよ)
私が今回使ったVagrantfileはこちらです。まっさらな状態からvagrant環境を作る手順を記載してあります。

空っぽのCentOS7のboxを追加して、環境を作ります。

initしたVagrantfileの中身を確認

今回使ったvagrantfileをそのまま記載。vagrantfileのあるところでvagrant upをするとまっさらなCentOS7の環境が出来ます。

Vagrant network

お手軽に自分のマシンに仮想環境が作れると思っていたvagrantですが、Vagrantfileのネットワークについてちゃんと理解できていなかったので復習。

forwarded_port

vagrant_network

中からアクセスする時(localhost)はforward(転送)し、IPアドレスでアクセスする(guest)はguestに設定したポートでアクセスする

public_networkでもprivate_networkを設定していても設定することが出来る。
ゲストは80ポートへアクセスすると8080ポートへ転送されることになります。urlに
http://192.168.10:8080 とか、URLにポートが含まれるのが嫌な場合、forwarded_portの設定が必要。
firewall側ではゲスト向けの80ポートだけ開放すればよい。

http://192.168.10/でアクセスすると、http://192.168.10:8080/にアクセスしたことになる

特にURLにポートが含まれても別にどうって子とない場合、この設定はなくても大丈夫。

public_network

public_networkだと同じネットワーク回線に接続しているマシンに対して接続を許可する

他の端末からもアクセスする可能性がある,複数人で作業する場合はpublic_networkがよいですね。
vagrant upで起動する際、publicでよいか聞かれるので、「1」を入力するとpublic_networkで起動できます。

private_network

環境を構築したホストマシンからのみのアクセスを許可する

自分1人で作業するならprivate_networkで十分そうです。

vagrant upでサーバー起動したらまずすること

vagrant upでVMサーバー起動したら最初にすることはapacheやら必要なソフトのインストールではなくネットワークやfirewallの確認をします。

itKaasan-MacBook-Pro:root# vagrant up
itKaasan-MacBook-Pro:root# vagrant ssh
[vagrant@localhost ~]$ ifconfig
enp0s3: flags=4163 mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::a00:27ff:fede:e0e prefixlen 64 scopeid 0x20 ether 08:00:27:de:0e:0e txqueuelen 1000 (Ethernet)
RX packets 1831 bytes 151847 (148.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1356 bytes 161553 (157.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

enp0s8: flags=4163 mtu 1500
inet 192.168.33.12 netmask 255.255.255.0 broadcast 192.168.33.255
inet6 fe80::a00:27ff:fe9f:1d69 prefixlen 64 scopeid 0x20 ether 08:00:27:9f:1d:69 txqueuelen 1000 (Ethernet)
RX packets 5362 bytes 768787 (750.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5694 bytes 10079743 (9.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Lokale Schleife)
RX packets 76 bytes 10872 (10.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 76 bytes 10872 (10.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

vagrant upで起動したらサーバーログインをして、ifconfigでvagrant fileに記載したIPアドレスがちゃんと設定されているかを確認します。
なお、私はこれが何をやっても出ませんでした!(これで3日潰したのですが、腹がたってvagrant destroyして再度vagrant upしてifconfigでIPアドレス確認したら設定したIPアドレスが出現したんです!)
私はvagrantを再構築することで思った通りのIPアドレスを確認出来ましたが、centos7のネットワークマネージャー(nmtui)で固定IP設定出来ます。なければnmtuiでvagrantfileに記載のIPアドレスを追加設定するというやり方もあります。案外vagrant再構築すれば復活したのは私の例ですが。

config.vm.synced_folder

synced_folderはまんまフォルダの設定のこと。vagrantfileと同じ階層にappフォルダがあって、vagrant sshでサーバーログインすると、appフォルダという名称ではなくvagrantフォルダという名称にappフォルダが変わっています。
vagrantのサーバーの中からみたフォルダ名と、ホストマシンから見たフォルダの名称が違うという点に注意してください。

pingで外からのアクセスをチェック

一度vagrant sshをexitしてvagrantのサーバーから離脱するか、ターミナルをもうひとつ立ち上げてvagrantfileに記載のIPアドレスに接続できるかチェックしてみましょう。

# pingでvagrantの外からアクセスできるかチェック
itKaasan-MacBook-Pro:chihiro-matsuda$ ping 192.168.33.12
PING 192.168.0.1 (192.168.33.121) 56(84) bytes of data.
64 bytes from 192.168.33.12: icmp_seq=1 ttl=255 time=0.574 ms
64 bytes from 192.168.33.12: icmp_seq=2 ttl=255 time=0.536 ms

このとき、pingテストで「Request timed out.」が出たらこの後どんなにWebサーバーを立てようがブラウザアクセスも何も出来ません。
私はsshでログインは出来るのにpingがどうしても通らない問題が解決せず、destroyしてからvagrant upしたら普通につながりました。なんだったんだろうね。

firewallを空ける

Sequence Diagram

# ポート開放
firewall-cmd –add-port=22/tcp –zone=public –permanent
firewall-cmd –add-service=ssh –zone=public –permanent
# サービスの削除
firewall-cmd –remove-port=22/tcp –zone=public –permanent

# 利用可能なサービス一覧
firewall-cmd –get-services

# firewalldのリロード
firewall-cmd –reload

# firewallの無効化
systemctl stop firewalld

# OS起動時無効化
systemctl disable firewalld

仮想VMであってもポートはデフォルトでは全て閉じているので必要最低限だけ空けるか、
あるいは自分1人しか使わないprivate_networkならいっそfirewallを切ってもいいかなって思ってる。
(ただし本番のサーバーでやったらダメ、絶対)

vagrantのネットワーク関連まとめ

手順として、
・vagrant init
・vagrant up
・vagrant ssh
・ifconfig
・pingで確認

実は以前node.jsでスクレイピングでデータを自働取得するスクリプトをvagrantの中に立てたCentOSサーバーでやってたんです。
全てsshでログインしてlocalhost内でスクリプト実行していたのでguestからのアクセスはテストしていませんでした。
で、そこにwebサーバーをいざ立ててウェブブラウザからアクセスしても全くつながらず連休3日つぶした次第。。

結局なぜsshでログインできるのにprivate_networkでホストマシンからping叩いても通らなかったのはなぞですが
サーバー立てた直後にpingテストさえしておけば原因究明には時間がかかりませんでした。

おかげでvagrantのネットワーク設定の部分は勉強しなおすよいきっかけになったのでよかったと言えばよかったかも。

vagrant環境構したら、epelリポジトリエラーでPHPもApacheもインストール出来なかった問題

vagrant upしても Apacheはおろか、PHPもmySQLも入らない!

Vagrant

お久しぶりです、ITかあさんです。無事に生きています、ここまでブログを放置したのは久しぶりですが、全然生きています。

とにかくエラーばかり!CentOSだけが入り、何もインストールされない!

今回試したvagrant ファイルはこちら

上記2つを試したのですが、PHPやら何やら入らず、びっくり!で、冷静にコマンドのエラーをたどると、

Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

奥様!リポジトリよ!リポジトリエラーでございますよ!
リポジトリエラーなら、当然PHPすら入らないのも納得。

同じようにリポジトリにつながらない問題はあるようで、vagrant sshで対象のサーバーにSSHで入って、
epelリポジトリのファイル
/etc/yum.repos.d/epel.repoこちらを編集します。

//コメントアウトをはずす
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
こちらをコメントアウトに
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

これでOK。あとは、vagrant provisionを実行すればリポジトリのエラーを回避することができます。

もう一つ問題発生。VirtualBoxで、新規仮想環境作成が失敗する

このepelリポジトリの解決方法は分かっていたのに、なぜかVirtualBoxでvagrant upで仮想環境を作ることすら失敗する問題
エラーはこの通り。どうやら、何度もvagrant upに失敗した際にゴミファイルが残ってしまったようです。

Command: ["modifyvm", "6516deb0-e52b-4950-86ef-321cd4891baf", "--name", "lamp-sample"]

Stderr: VBoxManage: error: Could not rename the directory '/Users/matsudachihiro/VirtualBox VMs/cakephp' to '/Users/matsudachihiro/VirtualBox VMs/lamp-sample' to save the settings file (VERR_ALREADY_EXISTS)

/Users/matsudachihiro/VirtualBox VMs/までcdコマンドで移動して、ゴミファイルを削除して、再度vagrant upすると、無事仮想環境構築できました!ちゃんちゃん!

覚えておきたい基本のVagrantコマンド 基本のき!

基本のVagrantコマンド 基本のき

Vagrant

ぎゃー!Vagrantが立ち上がらないよー!どーしよー!プロジェクトががが

とかなる前に基本のVagrantコマンドを覚えておこう。かあさんVagrantコマンドはvagrant upしか知らなくて、

Macがバッテリー切れして落ちる→Vagrant環境で作った仮想環境も落ちる→Mac起動してvagrant upする→起動しない→vagrant upする→起動しない→vagrant up する 起動しない 。。。。。。。。。

超!ドキドキしました。なので、基本のvagrantコマンドはしっかり覚えておきまっしょい。

なお、Vagrantコマンドはvagrantファイルの存在する場所までcdコマンドで移動してから実行します。

仮想マシンの起動

vagrant up

vagrant upは仮想マシンの起動コマンドです。Vagrantfileと同じディレクトリまでターミナルでcdコマンドで移動してからこのコマンドをぽちります。初めてVagrantFileを設置したら、一番最初に打つのがこのコマンドですね。

仮想マシンへSSHログイン

例えば前回の記事での仮想環境はCentOS系です。もちろん、ファイルの編集は自分のローカル環境のファイルを自分の好きなエディタで編集すればよいのですが、やれMySQLだー、あーyumコマンド打ちたいわーとかあるじゃないですか。なのでvagrant環境で作った仮想環境には

vagrant ssh

これだけでvagrantでつくった仮想環境にログインすることが出来ます。

$ vagrant ssh
The following plugins were installed with a version of Vagrant
that had different versions of underlying components. Because
these component versions were changed (which rarely happens),
the plugins must be uninstalled and reinstalled.

トップにcdで移動します

$cd /
ls コマンドで share ディレクトリの存在を確認します。
[vagrant@cakephp /]$ ls
bin dev home lib64 media opt root selinux srv tmp vagrant
boot etc lib lost+found mnt proc sbin share sys usr var

今回だとshareフォルダ以下がドキュメントルート直下になります。

$ cd share/
[vagrant@cakephp share]$ ls
README.md cake composer.lock crontab lib vagrant
app composer.json composer.phar deployer up vendor

ほら、ローカルと一緒ですよね。

仮想マシンの状態の確認

vagrant status
$ vagrant status
vagrant-vbguest
Current machine states:

default running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

default running (virtualbox)

となっているので、defaultという名前のvirtualboxが起動しているのが分かります。

仮想マシンの停止

仮想マシンの停止するには

vagrant halt
$ vagrant halt

vagrant-vbguest
[default] Attempting graceful shutdown of VM…

仮想マシンの消去

vagrant destroy

すると、削除してもよか質問されるので、yキーを押して実行します

$ vagrant destroy -f

-fのオプションで強制的に実行します。

プロビジョニングとかscript.shを何か変更したら

起動している仮想マシンに対して実行します。プロビジョニングをします。

vagrant provision

後からモジュールやらナンやら追加したい場合もありますね。
そんな時はscript.shに追記するのですが、追記してから
vagrant provisionを実行します。
すると、追記した分のインストールも実行してくれます。

Macの電源が落ちる→vagrant upしてもダメ。

そういう時は

$ vagrant halt
(一度正しく終了)
$ vagrant up
(起動)
$ vagrant provision
(プロビジョニングを実行)

正しく終了して、vagrant up実行してから vagrant provisionを実行します。

なお、haltしてからupなら

$ vagrant reload 
(再起動)

これでも同じです。

この他にもプラグインインストールのvagrant plunin installやsuspendなど色々あるのですが、配布されているVagrantfileを利用して仮想サーバーを運用するだけならこれら基本コマンドだけで大丈夫かも。