実践記録6
実践記録5でAnsibleが使えるように複数サーバ間のSSH接続用の公開鍵認証設定を行いました。
しかし手動での設定は無くしたいので、
Vagrantfileを修正して公開鍵認証の設定を自動でできるようにしたいと思います。
前提
VirtualBoxとVagrantがインストールされていること。
インストール方法は以下の記事を参考
実践記録1VirtualBoxをインストールしてローカル開発環境を構築してみたいと思います。AWSなどのクラウドサービスを使った方が最近は簡単に環境を準備できますが、まずは自分のPCに仮想環境を構築してみようと思います。[…]
実践記録2実践記録1でVirtualBoxを使ってローカル開発環境を構築してみましたが、今回はVagrantという仮想環境構築ツールを使ってVirtualBox上に仮想マシンを構築してみようと思います。前提使用する環境にVi[…]
Vagrantfileの公開鍵認証設定
現在のVagrantfileの定義は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | Vagrant.configure("2") do |config| # boxの指定 config.vm.box = "centos/7" # hostサーバの作成 config.vm.define :demohost do |server| server.vm.hostname = "demohost" server.vm.network "private_network", ip: "192.168.33.10" server.vm.synced_folder "./host", "/vagrant_data",type:"virtualbox" server.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 ansible SHELL end # webサーバの作成 config.vm.define :demoweb do |server| server.vm.hostname = "demoweb" server.vm.network "private_network", ip: "192.168.33.11" server.vm.synced_folder "./web", "/vagrant_data",type:"virtualbox" server.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 echo "hello world!!" > /usr/share/nginx/html/index.html systemctl start nginx SHELL end end |
実践記録5ここまでは一つの仮想マシンだけを作成していましたが、ここからはマシンの数を複数台にしてみようと思います。今後Ansibleを使ってみたいと思っているので、Ansible用のホストサーバーと、Ansible構築対象用[…]
Ansibleで他のサーバに対して処理を行うためにはSSH接続ができる必要があります。
ホストOSから仮想マシンへのSSH接続であればvagrant up実行時にキーが作成されますが、仮想マシン間のSSH接続用のキーは別途用意する必要があります。
以下にまさに私がやりたかったような事をやってくれている記事がありましたので
この記事の内容を参考に実施していきたいと思います。
要約すると以下のことをめざします。
ただし標準の設定ではホストOSは仮想マシンごとに異なる秘密鍵を使用するので、どの仮想マシンへ接続しても同じ秘密鍵を使用するように設定する。
まずは現在のホストOS・仮想マシン間の公開鍵認証について確認してみます。
上記コマンドでSSH接続情報を確認することができます。
IdentifyFileを確認すると2つのサーバで異なる秘密鍵を使用していることがわかります。
まずはVagrantfileに仮想マシンごとに使用している秘密鍵を統一する設定を入れます。
※この定義を追加する場合は、構築済みの環境は事前にvagrant destroyを実施しておくことをおすすめします。
destroy実行時にホストマシンが秘密鍵の場所を正しく認識できなくなり、destroyに失敗するようになります。(私はひっかかりました)
1 | config.ssh.insert_key = false |
この定義を含んだVagrantfileで作成された仮想マシンは、以下の秘密鍵を用いてホストから仮想マシンへSSH接続するようになります。
※このファイルはVagrantをインストールした時に作成されるものです。
C:\Users\<ユーザー名>\.vagrant.d\insecure_private_key
公開鍵については仮想マシン作成時に各サーバに配置されますが、
上記の秘密鍵を各サーバに配置してやらないと、仮想マシン間で公開鍵認証はできません。
以下の定義を追加することで、各仮想マシンに秘密鍵を共有することができます。
※「~」は省略しているのではなく、このままで大丈夫です。フルパス記載に変えたりする必要はありません。(私は変えてひっかかりました)
1 | config.vm.provision "file", source: "~/.vagrant.d/insecure_private_key", destination: "/home/vagrant/.ssh/id_rsa" |
“file”タイプでプロビジョニングすることでホスト環境から仮想環境へファイルを転送することができます。
そして最後に、ただコピーしただけでは権限設定が不十分です。
以下のコマンドで権限を変更してやらなければSSH接続はできません。(SSH接続時の秘密鍵の制約です。)
1 2 3 | config.vm.provision "shell", privileged: false, inline: <<-SHELL chmod 600 $HOME/.ssh/id_rsa SHELL |
「privileged: false」は特権ユーザー(rootユーザー)で処理を実行するかどうかを指定するオプションです。
このコマンドをrootユーザーで実行してしまうと、「$HOME」が「vagrant」ではなく「root」になってしまい、
秘密鍵が目的とは違う場所に配置されてしまうので、それを防ぐ為にfalse設定を入れています。
ここまでを踏まえてVagrantfile全体として以下の様になりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | Vagrant.configure("2") do |config| # boxの指定 config.vm.box = "centos/7" # 仮想マシン間公開鍵認証設定 config.ssh.insert_key = false config.vm.provision "file", source: "~/.vagrant.d/insecure_private_key", destination: "/home/vagrant/.ssh/id_rsa" config.vm.provision "shell", privileged: false, inline: <<-SHELL chmod 600 $HOME/.ssh/id_rsa SHELL # hostサーバの作成 config.vm.define :demohost do |server| server.vm.hostname = "demohost" server.vm.network "private_network", ip: "192.168.33.10" server.vm.synced_folder "./host", "/vagrant_data",type:"virtualbox" server.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 ansible SHELL end # webサーバの作成 config.vm.define :demoweb do |server| server.vm.hostname = "demoweb" server.vm.network "private_network", ip: "192.168.33.11" server.vm.synced_folder "./web", "/vagrant_data",type:"virtualbox" server.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 echo "hello world!!" > /usr/share/nginx/html/index.html systemctl start nginx SHELL end end |
これでvagrant upしてみたいと思います。
vagrant up後に確認してみたところ、以下の通りdemohostサーバからdemowebサーバへSSH接続できていることが確認できました。
※初回接続時だけ、ここ繋いじゃって大丈夫?的なこと聞かれますので「yes」で入力すればOKです。
今回はここまでにします。
これでAnsibleを使用する環境は整ったので次回からAnsibleを使用していきたいと思います!
続きは以下の記事になります!
実践記録7前回までVagrantを用いて環境構築をしていましたが、今回はAnsibleを使用してみたいと思います。Ansibleを使うことでVagrantだけで構成するよりもより汎用的な構成管理を行うことを目指します。前提V[…]
コメントを書く