VagrantによるMultiNodeの一発構築(CentOS7編)

#はじめに

意外とこういうのってなかったな、と思って作ってみました。
例えば以下のような準備を一発で行うという話です。
CentOS7用しか作ってないので今度Ubuntu版も作ってみようと思います。

```
・VMを複数ノードたち上げる
・各VMを同じネットワークに所属させる
・各VMをインターネットに抜けれるようにする
・1号機VMから公開鍵認証により、ノーパスで全VMにsshできるようにする
・1号機VMに全ノードknown_hostsを登録する
```

もともとAnsible等のインフラ学習のために、環境準備に時間がかかり面倒なため、作成しました。
下記のような構成が欲しいときにローカル上で一瞬に準備します。


```
        　SSH⇒
デプロイVM ---- 設定対象VM
```

#手順

Vagrant ファイルを準備してださい。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  
  ###############↓設定対象VMを増やす際にはここを追加↓################
  config.vm.define :node2 do |node2|
    node2.vm.hostname = "node2"
    node2.hostmanager.enabled = true
    node2.vm.provider "virtualbox" do |vb|
      vb.customize ["modifyvm", :id, "--nic2", "natnetwork", "--nat-network2", "net001"]
      vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "1"]
    end
    node2.vm.provision "shell", inline: <<-SHELL
      yum install git curl wget epel-release sshpass -y
      sudo mkdir -m 600 /root/.ssh
      echo "password" | passwd --stdin root
      sudo sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
      systemctl restart sshd
      sudo sed -i -e 's/DEFROUTE=yes/DEFROUTE=no/g' /etc/sysconfig/network-scripts/ifcfg-eth0
      sudo cat <<'EOF' > /etc/hosts
192.168.10.8 node1
192.168.10.9 node2
EOF

      sudo cat <<'EOF' > /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
ONBOOT="yes"
TYPE="Ethernet"
PERSISTENT_DHCLIENT="no"
IPADDR="192.168.10.9"
GATEWAY="192.168.10.1"
dns1="8.8.8.8"
DEFROUTE="yes"
EOF
      sudo sed -i -e '$a nameserver=8.8.8.8' /etc/resolv.conf
      sudo systemctl restart network
      sleep 10
    SHELL
  end
  ###############↑設定対象VMを増やす際にはここを追加↑################
  
  config.vm.define :node1 do |node1|
    node1.vm.hostname = "node1"
    node1.hostmanager.enabled = true
    node1.vm.provider "virtualbox" do |vb|
      vb.customize ["modifyvm", :id, "--nic2", "natnetwork", "--nat-network2", "net001"]
      vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "1"]
    end
    node1.vm.provision "shell", inline: <<-SHELL
      yum install git curl wget epel-release sshpass -y
      sudo mkdir -m 600 /root/.ssh
      echo "password" | passwd --stdin root
      sudo sed -i -e 's/DEFROUTE=yes/DEFROUTE=no/g' /etc/sysconfig/network-scripts/ifcfg-eth0
      sudo cat <<'EOF' >> /etc/hosts
192.168.10.8 node1
192.168.10.9 node2
EOF

      sudo cat <<'EOF' > /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
ONBOOT="yes"
TYPE="Ethernet"
PERSISTENT_DHCLIENT="no"
IPADDR="192.168.10.8"
GATEWAY="192.168.10.1"
dns1="8.8.8.8"
DEFROUTE="yes"
EOF
      sudo sed -i -e '$a nameserver=8.8.8.8' /etc/resolv.conf
      sudo systemctl restart network
      sleep 10
      sudo ssh-keyscan -H 192.168.10.8 >> sudo /root/.ssh/known_hosts
      sudo ssh-keyscan -H 192.168.10.9 >> sudo /root/.ssh/known_hosts  # 設定対象VMを増やす際はssh-keyscan先を追加してください
      sudo sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
      systemctl restart sshd
      ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
      sshpass -p password ssh-copy-id -i ~/.ssh/id_rsa.pub -o "StrictHostKeyChecking no" 192.168.10.8
      sshpass -p password ssh-copy-id -i ~/.ssh/id_rsa.pub -o "StrictHostKeyChecking no" 192.168.10.9  # 設定対象VMを増やす際はssh-copy-id先を追加して下さい
    SHELL
  end
end

```

いつもの通り以下でデプロイです。

```
Vagrant up
```

以下で構築対象に入れます。

```
$ vagrant status
Current machine states:

node2                     running (virtualbox)
node1                     running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
$
```

#確認
以下の通りnode1 からnode2にホスト名で、鍵認証のsshができます。

```
$ vagrant ssh node1
[vagrant@node1 ~]$ sudo su -
[root@node1 ~]# ssh node2
The authenticity of host 'node2 (192.168.10.9)' can't be established.
ECDSA key fingerprint is SHA256:QhUYshVh8feVy4pYNNUHXK2nFMQOKNull8+4Rtqh360.
ECDSA key fingerprint is MD5:2a:97:92:f2:b5:03:89:53:ea:a9:c4:51:08:ef:7c:d8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node2' (ECDSA) to the list of known hosts.
[root@node2 ~]#
```

今回の `Vagarantfile` をテンプレにして利用する場合は以下の値を置換してください。

```
node1  #デプロイVM
node2  #設定対象VM
192.168.10.8  #デプロイVm
192.168.10.9  #設定対象VM

#IPに192.168.10.0/24以外を使用される場合は192.168.10.1も置換が必要
```

設定対象VMを増やす際にはnode2分をコピーして上記置換部分と、 `ssh-keyscan` 、 `ssh-copy-id` を編集・追記してください。
※node1の下には記載しないでください(ssh-copy-id等が通らなくなります)

～以上～