OCI ComputeにセカンダリVNICを追加する Part 3

# 前回の続き

前回から続いた内容なので、6から始まる連続した段落番号をつけている。

<font color="red">※7系と書いてあるところは、7系と8系共通と読み替えていただきたい。</font>

* [OCI ComputeにセカンダリVNICを追加する Part 1](https://qiita.com/yamada-hakase/items/a6d4d846e4cf4afb9453)
* [OCI ComputeにセカンダリVNICを追加する Part 2](https://qiita.com/yamada-hakase/items/6b0c49a0b2b3c5e4c4dd)

# 6. セカンダリVNICを永続的に設定する（2）

6系と7系では起動の仕組みがsystemdに代わっているので、それぞれ別に説明する。なお7系では、ocidサービスによる自動割り当てが簡単だ。

### 6-1. 7系Linux OSで設定する

1. secondary_vnic_all_configure.shスクリプトをダウンロードする。以前にダウンロードしているときは省略可能。

```shell-session
sudo su -
cd /tmp
curl -O https://docs.cloud.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh
chmod u+x secondary_vnic_all_configure.sh
```

<font color="red">スクリプトのURIが変わることがあるので、そのときには[マニュアル](https://docs.cloud.oracle.com/en-us/iaas/Content/Network/Tasks/managingVNICs.htm#Linux:)で確認すること。</font>

2.スクリプトを/usr/local/sbinに配置する。

```shell-session
cp /tmp/secondary_vnic_all_configure.sh /usr/local/sbin
```

3.オーナーがrootで実行権限があることを確認する。

```shell-session
ls -l /usr/local/sbin
total 56
-rwxr--r--. 1 root root 55601 Jun 16 17:30 secondary_vnic_all_configure.sh
```

4.OS起動時にスクリプトを実行するユニットファイルを作成する。

```shell-session
vi /etc/systemd/system/secondary_vnic.service
```

```shell-session:/etc/systemd/system/secondary_vnic.service
[Unit]
Description=Setting the secondary vnic 
After=default.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/secondary_vnic_all_configure.sh -c

[Install]
WantedBy=multi-user.target
```

5.secondary_vnicサービスが自動起動するように設定する。

```shell-session
systemctl enable secondary_vnic.service
```

6.自動起動が有効になっていることを確認する。

```shell-session
systemctl list-unit-files | grep secondary
secondary_vnic.service                        enabled ★有効になっている
```

### 6-2. 6系Linux OSで設定する

1. secondary_vnic_all_configure.shスクリプトをダウンロードする。以前にダウンロードしているときは省略可能。

```shell-session
sudo su -
cd /tmp
curl -O https://docs.cloud.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh
chmod u+x secondary_vnic_all_configure.sh
```

2.スクリプトを/usr/local/sbinに配置する。

```shell-session
cp /tmp/secondary_vnic_all_configure.sh /usr/local/sbin
```

3.オーナーがrootで実行権限があることを確認する。

```shell-session
ls -l /usr/local/sbin
total 56
-rwxr--r--. 1 root root 55601 Jun 16 17:30 secondary_vnic_all_configure.sh
```

4.OS起動時にスクリプトを実行するように/etc/rc.localの末尾に追記する。

```shell-session
vi /etc/rc.local
```

```shell-session:/etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

★ここから下の2行を追記する
# for Secondary VNIC
/usr/local/sbin/secondary_vnic_all_configure.sh -c
```

### 6-3. 動作確認する（6系7系共通）

OSを再起動して、正しく設定されていることを確認する。このようにVM2からの応答があれば成功だ。

```shell-session
VM1~]# reboot
```

```shell-session
VM1~]# ping 10.1.1.6
PING 10.1.1.6 (10.1.1.6) 56(84) bytes of data.
64 bytes from 10.1.1.6: icmp_seq=1 ttl=64 time=0.266 ms
64 bytes from 10.1.1.6: icmp_seq=2 ttl=64 time=0.254 ms
```

![sec-nic02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/7b77fcf4-d5f2-1f93-1499-f93b1e3f26ce.png)

# 7. ocidサービスによるIPアドレスの割り当て

これまで`secondary_vnic_all_configure.sh`を使った、セカンダリVNICへのIPアドレス割り当てを説明してきた。しかし、もっと簡単な方法がある。それは`oci-utils`パッケージに含まれる`ocid`サービスだ。

### 7-1. ocidサービスを有効にする

デフォルトでは無効になっているが、有効にするとセカンダリVNICに自動でIPアドレスを割り当ててくれる。検出間隔は60秒。

```shell-session
systemctl enable ocid -now
```

実際に試したところ、IPアドレスが自動設定されるだけで無く、ポリシーベース・ルーティングも設定されていた。

### 7-2. ocidによる自動割り当ての仕組み

ocidサービスが起動していると、セカンダリVNICを自動検知してIPアドレスやポリシーベースルーティングを設定するようになっている。

もし、IPアドレスの割り当てに失敗するときは、`yum update oci-utils`でアップデートを試してほしい。

詳しくは`man ocid`を参照のこと。CentOS 7で使うときは、リポジトリをOracle Linux 7に切り替えればよいだろう。

<font color="blue">**ヒント**</a>
以前のoci-utilsにはsecondary_vnic_all_configure.shが含まれていた。しかしバージョン0.11.1以降はスクリプトが削除され、新たにPythonベースに置き換えられている。

# 8. おわりに

セカンダリVNICを使う機会は少ないかもしれないが、シチュエーションによっては便利なときもあるだろう。

また当初はifcfgファイルを手動で設定するほうが慣れているのでいいと思ったけれど、ルーティングに手こずった。それと共にsecondary_vnic_all_configure.shの高機能さには驚いた。

OCIマニュアルは不親切だと思っていたら、MOSにNoteを発見。アカウントを持っている人はどうぞ。

MOS DocID: 
2470326.1 OCI : Automatically add a Secondary VNIC in OL7 using an Unit file
2470376.1 OCI : Automatically add a Secondary VNIC in OL6 using systemV

# 9. まとめ(総合)

**機能編**

* セカンダリVNICを使用すると、1つのインスタンスから複数サブネットに簡単に接続できる
* セカンダリVNICを追加しても、インスタンスの最大帯域幅は変わらない
* 使用可能なVNIC数はシェイプサイズによって異なる
* セカンダリVNICは、同一AD内であれば異なるVCNにも接続できる


**設定編**

* セカンダリVNICを設定する方法がいくつかあり、Oracle提供のスクリプトがオススメ
* <font color="red">Oracle Linux 7/8ならばスクリプトよりocidサービスがオススメ</font>
* Oracle提供のスクリプトやocidでは、セカンダリVNICに対してポリシーベースルーティングが設定される
* スクリプトによる設定内容は再起動すると失われる。そのためOS起動時にスクリプトを実行するような設定を追加する
* main以外のルーティングテーブルを見落とさないように、ルーティングでうまくいかないときは`ip rule show`コマンドで確認する 

# 10. コピペ用コマンドまとめ

* **7/8系Linux OS版**

```shell-session
sudo su -

# スクリプトのダウンロード
curl -o /usr/local/sbin/secondary_vnic_all_configure.sh https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh

# パーミッション変更
chmod u+x /usr/local/sbin/secondary_vnic_all_configure.sh

# systemd用のユニットファイル作成
cat <<_EOL_ >/etc/systemd/system/secondary_vnic.service
[Unit]
Description=Setting the secondary vnic 
After=default.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/secondary_vnic_all_configure.sh -c

[Install]
WantedBy=multi-user.target
_EOL_

# サービス有効化
systemctl enable secondary_vnic.service
```

* **6系Linux OS版**

```shell-session
sudo su -

# スクリプトのダウンロード
curl -o /usr/local/sbin/secondary_vnic_all_configure.sh https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh

# パーミッション変更
chmod u+x /usr/local/sbin/secondary_vnic_all_configure.sh

# /etc/rc.localでスクリプト実行
cat <<_EOL_ >>/etc/rc.local

# for Secondary VNIC
/usr/local/sbin/secondary_vnic_all_configure.sh -c
_EOL_
```