実践記録4
実践記録3でVagrantを用いて作成した環境ですが、重大な欠陥を見つけてしまいました。
それは、「Could not resolve host」エラーが発生してDNSの名前解決ができないこと。
これを解消しなければ、構築後のマシンでyumコマンドで新しいソフトウェアをインストールすることができないので解消したいと思います。
前提
VirtualBoxとVagrantがインストールされていること。
インストール方法は以下の記事を参考
関連記事
実践記録1VirtualBoxをインストールしてローカル開発環境を構築してみたいと思います。AWSなどのクラウドサービスを使った方が最近は簡単に環境を準備できますが、まずは自分のPCに仮想環境を構築してみようと思います。[…]
関連記事
実践記録2実践記録1でVirtualBoxを使ってローカル開発環境を構築してみましたが、今回はVagrantという仮想環境構築ツールを使ってVirtualBox上に仮想マシンを構築してみようと思います。前提使用する環境にVi[…]
DNS設定の追加
実践記録3で使用したVagrantfileを使用していきます。
関連記事
実践記録3実践記録2でVirtualBoxとVagrantを使って仮想マシンを作成してみましたが、空っぽな仮想マシンで少し味気なかったのでVagrantfileを編集してもう少し遊んでみようと思います。さほど複雑なことはまだ[…]
1 2 3 4 5 6 7 8 9 10 11 12 | Vagrant.configure("2") do |config| config.vm.box = "centos/7" config.vm.hostname = "demo" config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder "./", "/vagrant_data",type:"virtualbox" config.vm.provision "shell", inline: <<-SHELL yum -y install epel-release yum -y install nginx echo "hello world!!" > /usr/share/nginx/html/index.html systemctl start nginx SHELL end |
vagrant up
vagrant ssh
vagrant ssh
ここまでは実践記録3と同様です。
ここでAnsibleをインストールしてみようとすると以下の様なエラーが出ました。
「Could not resolve host」という事はどうやら名前解決ができていないようです。
ということで名前解決ができるように、DNSの設定を追加していきたいと思います。
Linux環境でDNSの設定と言えば、とりあえず「/etc/resolv.conf」でしょうか。
内容を確認してみます。
内容を確認してみます。
cat /etc/resolv.conf
ここにDNSの設定を追加してみます。
今回はGoogleが提供しているパブリックDNS「8.8.8.8」の定義とその代替DNSの「8.8.4.4」を追加します。
今回はGoogleが提供しているパブリックDNS「8.8.8.8」の定義とその代替DNSの「8.8.4.4」を追加します。
sudo sh -c “echo -e ‘nameserver 8.8.8.8\nnameserver 8.8.4.4’ >> /etc/resolv.conf”
ちなみに上記のコマンドは深い意味を持っています。
sudoコマンドはrootユーザーでコマンドを実行する為のものですが、
普通に「sudo echo -e ‘nameserver 8.8.8.8\nnameserver 8.8.4.4’ >> /etc/resolv.conf」としてしまうと権限不足でエラーとなってしまうようです。
普通に「sudo echo -e ‘nameserver 8.8.8.8\nnameserver 8.8.4.4’ >> /etc/resolv.conf」としてしまうと権限不足でエラーとなってしまうようです。
そこでsudoコマンドでshコマンドを呼び出し、shコマンドのオプションcで以降の入力内容をシェルとして扱う、、、
要するにroot権限で書き込みを行うシェルを実行する形式とする必要があるようです。
要するにroot権限で書き込みを行うシェルを実行する形式とする必要があるようです。
脱線しましたが、これで本来の目的であるDNSの名前解決ができるようになったか確認してみましょう。
sudo yum -y install ansible
ansible –version
ansible –version
Complete!
いい響きですね!!
無事に名前解決してインストールができるようになりました。
無事に名前解決してインストールができるようになりました。
しかし戦いはまだ続くのです。。。
Vagrant作成環境においてDNSの設定が消える
/etc/resolv.confを修正して無事に名前解決ができるようになったのは良いのですが、
時間経過やネットワークの再起動などが行われるとせっかく定義した内容が消えてまた名前解決ができなくなってしまいます。
時間経過やネットワークの再起動などが行われるとせっかく定義した内容が消えてまた名前解決ができなくなってしまいます。
確かに「/etc/resolv.conf」の内容を見ると以下の様にコメントされているので、
NetworkManagerの方をいじってあげる必要がありそうです。
NetworkManagerの方をいじってあげる必要がありそうです。
# Generated by NetworkManager
結論としては以下の様にコマンドを打てばresolv.confのDNS定義が書き換えられることはなくなるようです。
sudo sh -c “sed -i -e ‘/^\[main\]$/a dns=none’ /etc/NetworkManager/NetworkManager.conf”
sudo systemctl restart NetworkManager
sudo systemctl restart NetworkManager
echoコマンドではなく、sedコマンドを使用しているのは対象ファイルの文末ではなく、
文中の[main]の下に定義「dns=none」を追加したかったからです。
文中の[main]の下に定義「dns=none」を追加したかったからです。
定義追加後にNetworkManagerを再起動させることで定義を反映させます。
Vagrantfileの修正
では今回の教訓をVagrantfileに追加したいと思います。
Vagrantfile内ではsudoコマンドを実施する必要はないようなのでそこは省き、
restartは直後にwaitコマンドを入れてあげた方が安全ですね。
restartは直後にwaitコマンドを入れてあげた方が安全ですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Vagrant.configure("2") do |config| config.vm.box = "centos/7" config.vm.hostname = "demo" config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder "./", "/vagrant_data",type:"virtualbox" config.vm.provision "shell", inline: <<-'SHELL' sed -i -e '/^\[main\]$/a dns=none' /etc/NetworkManager/NetworkManager.conf systemctl restart NetworkManager wait echo -e 'nameserver 8.8.8.8\nnameserver 8.8.4.4' >> /etc/resolv.conf yum -y install epel-release yum -y install nginx yum -y install ansible echo "hello world!!" > /usr/share/nginx/html/index.html systemctl start nginx SHELL end |
そして最後の落とし穴です。
✖:config.vm.provision “shell”, inline: <<-SHELL
〇:config.vm.provision “shell”, inline: <<-‘SHELL‘
〇:config.vm.provision “shell”, inline: <<-‘SHELL‘
もっと端的に記載すると、
✖:SHELL
〇:‘SHELL‘
〇:‘SHELL‘
ここです。。。
シングルコーテションで囲わないとシェル実行時にエスケープが働かず?sedコマンドやechoコマンドが正常に機能しませんでした。
シングルコーテションで囲わないとシェル実行時にエスケープが働かず?sedコマンドやechoコマンドが正常に機能しませんでした。
色んな罠にはまり続けてきましたが、今回はここまでにします。
続きは以下の記事です!
関連記事
実践記録5ここまでは一つの仮想マシンだけを作成していましたが、ここからはマシンの数を複数台にしてみようと思います。今後Ansibleを使ってみたいと思っているので、Ansible用のホストサーバーと、Ansible構築対象用[…]
コメントを書く