OCI で Oracle Linux を使うときに超絶便利なツール oci-utils

#####この記事は [Oracle Cloud Advent Calendar 2018](https://adventar.org/calendars/3077#list-2018-12-01) の12/3の記事として書かれています

突然ですが、みなさん Red Hat 系の Linux ディストリビューションは何を使っていますか? CentOS派? Fedra派?
私はオンプレミス(=自宅)では昔は Scientific Linux、今はだいたい CentOS を使うのですが、OCI で使う場合はほぼ100% Oracle Linux を使います。

なぜって? そりゃ理由はもちろん、デフォルトのまま変えるのが面倒くさいから・・・ ではなく、今日ご紹介する **oci-utils** というパッケージが使えるからなんです。これを使うと、OCI を使う際にどうしても避けられない面倒なコマンドライン操作のあれやこれやが、スパッと簡単にできてしまうんです。

# oci-utilsを使うと便利なこと
oci-utilsを使うと、例えばこんなことができます。

- iSCSIモードでのブロックボリュームを「簡単に」アタッチ、デタッチする
- インスタンスのセカンダリvNICをOSに「簡単に」認識させる
- インスタンスのOCIDをインスタンスの中から「簡単に」調べる
- インスタンスに割りあたっているパブリックIPアドレスをインスタンスの中から「簡単に」調べる
- ブートボリュームのサイズを大きくしたあと、ファイルシステムも「簡単に」大きくする

そう、ポイントはどれも頑張ればできるんだけど、oci-utilsを使うとそれが簡単だってことです。
では、さっそく使ってみましょう。


# oci-utilsのインストール、起動、準備
oci-utils は、Oracle Linux のパッケージとして提供されています。とはいっても実は OCI 上の Oracle Linux のイメージにはには予めパッケージが含まれているので、普通はインストールは不要です。もしお手元のインスタンスに oci-utils が含まれていない場合は `sudo yum -y install oci-utils` でインストールすることができます。

フル機能を使うには ocid.service というサービスを立ち上げておく必要があります。必須ではないですがあると便利なので起動しておきましょう。

```
$ sudo systemctl start ocid.service
```

そうすると、/usr/libexec/ocid というプロセスが立ち上がってきます。

```
[opc@ol7 ~]$ ps -ef | grep ocid
root     16970     1  0 03:04 ?        00:00:00 python2.7 /usr/libexec/ocid
opc      17267 16849  0 03:08 pts/0    00:00:00 grep --color=auto ocid
```

# 使ってみる
まずは簡単なところから試してみましょう。インスタンスに割り当てられているパブリックIPを知るコマンドです。

```
[opc@ol7 ~]$ oci-public-ip
Public IP address: 129.213.0.1
```

インスタンスのメタデータを取得するコマンドです。基本的にコンソールのインスタンスの詳細画面に表示されている情報が取得できます。

```
[opc@ol7 ~]$ oci-metadata
Instance details:
  Instance name: ol7
  Region: iad - us-ashburn-1 (Ashburn, VA, USA)
  Availability Domain: xSEP:US-ASHBURN-AD-1
  Fault domain: FAULT-DOMAIN-1
  Instance shape: VM.Standard2.1
  Instance created at: 2018-12-03 02:43:28 UTC
  Instance state: Running
  Instance OCID: ocid1.instance.oc1.iad.abuwcl......poa6tq
  Compartment OCID: ocid1.compartment.oc1..aaaaaa......hxkxgq
  Image OCID: ocid1.image.oc1.iad.aaaaaa......mktdiq
  canonicalRegionName: us-ashburn-1
  Instance Metadata:
    user_data: dW5kZWZpbmVk
    ssh_authorized_keys: ssh-rsa AAAAB3NzaC1......i6WudnDSvw1JHw== mmarukaw@MMARUKAW-LAP2
Networking details:
  Private IP address: 10.0.0.8
  MAC address: 02:00:17:02:A9:99
  Subnet CIDR block: 10.0.0.0/24
  Virtual router IP address: 10.0.0.1
  VNIC OCID: ocid1.vnic.oc1.iad.abuwcl......bgmohq
  VLAN tag: 588
```

`--get` オプションを使うとマッチする特定キーの値のみが取得できます。

```
[opc@ol7 ~]$ oci-metadata --get region
Instance details:
  Region: iad - us-ashburn-1 (Ashburn, VA, USA)
[opc@ol7 ~]$ oci-metadata --get shape
Instance details:
  Instance shape: VM.Standard2.1
```

インスタンスにアタッチされているiSCSIブロック・ボリュームの情報を見てみます。

```
[opc@ol7 ~]$ oci-iscsi-config --show
Currently attached iSCSI devices:

Target iqn.2015-02.oracle.boot:uefi
   Persistent portal:    169.254.0.2:3260
      Current portal:    169.254.0.2:3260
               State:    LOGGED_IN
     Attached device:    sda
                Size:    46.6G
          Partitions:    Device    Size  Filesystem   Mountpoint
                         sda1      200M        vfat   /boot/efi
                         sda2        8G        swap   [SWAP]
                         sda3     38.4G         xfs   /

Need OCI services to display available devices.
```

##便利な機能を試してみる
さて、ここまでならインスタンスの情報をちょっと見るのにいいコマンド、くらいなかんじですが、一番便利な機能は実はここからです。先程 ocid というデーモンサービスを起動しましたが、実はこいつはバックグラウンドで素敵なことをしてくれるのです。具体的には・・・

**1. インスタンスにブロック・ボリュームがアタッチされたら、自動的にiSCSIでログインしてくれる
2. インスタンスに追加のVNICがアタッチされたら、自動的に仮想インタフェースを登録してくれる**

という仕事をしてくれます。

さあ、やってみましょう!! ということでまずはブロック・ボリュームのアタッチです。

詳しい手順は割愛します。もしやり方がわからない方は、[こちらのチュートリアル](https://community.oracle.com/docs/DOC-1019345)を参考にブロック・ボリュームを作成してインスタンスにiSCSIでアタッチしてみてください。

普通はこのあと、インスタンスにsshでアクセスして、このiscsiadmコマンドを流す必要がありますよね。
![WS000421.JPG](https://qiita-image-store.s3.amazonaws.com/0/117710/c11d1d29-c7f0-8f66-e76f-e0febac1c013.jpeg)

でも今回はこの手順は必要ありません。しばらくすると ocid デーモンがアタッチされたボリュームを検知して、自動でデバイスとして見えるようになります。`oci-iscsi-config --show` コマンドでアタッチされたボリュームの情報が確認できます。

```
[opc@ol7 ~]$ oci-iscsi-config --show
Currently attached iSCSI devices:

Target iqn.2015-12.com.oracleiaas:1515ce34-f006-4568-a8c5-f8c358fe724c
   Persistent portal:    169.254.2.2:3260
      Current portal:    169.254.2.2:3260
               State:    LOGGED_IN
     Attached device:    sdb
                Size:    50G
    File system type:    Unknown
          Mountpoint:    Not mounted

Target iqn.2015-02.oracle.boot:uefi
   Persistent portal:    169.254.0.2:3260
      Current portal:    169.254.0.2:3260
               State:    LOGGED_IN
     Attached device:    sda
                Size:    46.6G
          Partitions:    Device    Size  Filesystem   Mountpoint
                         sda1      200M        vfat   /boot/efi
                         sda2        8G        swap   [SWAP]
                         sda3     38.4G         xfs   /

Need OCI services to display available devices.
```
この上のボリュームが、自動的にアタッチされたブロック・ボリュームです。`lsblk`コマンドでも`/dev/sdb`として見えています。

```
[opc@ol7 ~]$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   50G  0 disk
sda      8:0    0 46.6G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi
```

では、次にネットワークの方も試してみましょう。
OCIコンソールから、仮想NICをもうひとつアタッチします。

![WS000424.JPG](https://qiita-image-store.s3.amazonaws.com/0/117710/55670bd7-1ee8-a4cb-f5cf-9fa8a43574c1.jpeg)

しばらくすると、ocid が自動的に新しい仮想NICを検知して、インタフェースとして登録してくれます。その情報は `oci-network-config` コマンドで確認できます。( root 権限が必要です)

```
[opc@ol7 ~]$ sudo oci-network-config --show
CONFIG ADDR            SPREFIX         SBITS VIRTRT          NS         IND IFACE      VLTAG VLAN        STATE MAC               VNIC
-      10.0.0.8        10.0.0.0        24    10.0.0.1        -          0   ens3       -     -           UP    02:00:17:02:a9:99 ocid1.vnic.oc1.iad.abuwcljtf52zh5piglznfcjpcl4u5osqvurj54drtww2gatcpefuqkbgmohq
-      10.0.0.10       10.0.0.0        24    10.0.0.1        -          1   ens4       -     -           UP    02:00:17:02:41:62 ocid1.vnic.oc1.iad.abuwcljtmnwvccrsi2ztvo7jxxve2qu5w77eqzhp5udwcfoft5wxmgddzrea
```

もちろん `ip` コマンドでも確認できます。

```
[opc@ol7 ~]$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:02:a9:99 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.8/24 brd 10.0.0.255 scope global dynamic ens3
       valid_lft 68291sec preferred_lft 68291sec
3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:02:41:62 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/24 scope global ens4
       valid_lft forever preferred_lft forever
```



# OCI CLIをセットアップするともう少し高度なこともできる

さて、これだけでも十分便利な oci-utils ですが、OCI CLI と合わせて使うともう少しいろいろなことができたりします。OCI CLI のセットアップ方法は、[このチュートリアル](https://community.oracle.com/docs/DOC-1019624)あたりを参考に実施してみてください。ただ、Oracle Linuxからだとインストール自体はもっと簡単に、`yum` コマンドを使ってインストールできます。

```
[opc@ol7 ~]$ sudo yum -y install python-oci-cli
Loaded plugins: langpacks, ulninfo
Resolving Dependencies

(略)

Complete!
```

###ブロックボリュームを作成し、インスタンスにアタッチして、iSCSIでログインする
さて、oci-utils + CLI がセットアップできたので、遊んでみましょう。

`oci-iscsi-config --create-volume` コマンドを使うと、ブロック・ボリュームを作成し、インスタンスにアタッチし、iSCSIでログインするという一連の作業がシングルコマンドでできてしまいます。こんなかんじ。

```
[opc@ol7 ~]$ sudo oci-iscsi-config --create-volume 50
Creating a new 50 GB volume
Volume abuwcljtvsiu6zdwy4rsmd3ss3z7gn6o5fvvsqqqhjlu6v55x73sxpvyv6vq created
Volume abuwcljtvsiu6zdwy4rsmd3ss3z7gn6o5fvvsqqqhjlu6v55x73sxpvyv6vq is ATTACHED
```

`--create-volume` のあとの50という数字は、50GBのブロック・ボリュームを作るというコマンドです。
ボリュームの作成、インスタンスへのアタッチ、iSCSIでのログインまで完了していますので、`lsblk` でOSから見ることができます。

```
[opc@ol7 ~]$ sudo lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   50G  0 disk
sda      8:0    0 46.6G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi
```

CLIを使って一つずつコマンドを実行してもいいですが、ちょっとしたディスクの追加作業がコマンド一つでできてしまうのはとても便利ですね。

###ブートボリュームを大きくした場合に、rootのファイルシステム領域も大きくする
インスタンスのブート・ボリュームは、初期値のままだと46.6GBで作成されますが、あとからサイズを大きくすることができます。

例えばこんなかんじです。これは、46.6GBで作成したブート・ボリュームを、あとから100GBに拡大した場合の例です。
![WS000425.JPG](https://qiita-image-store.s3.amazonaws.com/0/117710/2e64e9cd-29c1-e908-4fb2-d7dd9f94e304.jpeg)
しかし、ファイルシステムとしては46.6GBが最初に固定で作られるため、100GBのうちファイルシステムが作られているのは46.6GBだけです。

```
[opc@ol7 ~]$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi
```
残念ながらあとから拡大した部分は、まだ使われていませんね。
普通はここでパーティションを切って、vgextendで拡張して・・・みたいな作業が必要になるわけですが、`oci-utils` の `oci-growfs` コマンドを使うと、これも簡単にやってくれます。
このコマンドにはなぜかpathが通っていないので、`/usr/libexec/oci-growfs` のようにフルパスで指定する必要があります。

```
[opc@ol7 ~]$ sudo /usr/libexec/oci-growfs
CHANGE: disk=/dev/sda partition=3: start=17188864 old: size=80486399,end=97675263 new: size=192526302,end=209715166
Confirm? [y/n]: y
CHANGED: disk=/dev/sda partition=3: start=17188864 old: size=80486399,end=97675263 new: size=192526302,end=209715166
meta-data=/dev/sda3              isize=256    agcount=4, agsize=2515200 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0 rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=10060800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=4912, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10060800 to 24065787
```
簡単ですね。途中に確認メッセージが出るので、`y`と答えるだけです。これ、再び `lsblk` コマンドで見てみると、

```
[opc@ol7 ~]$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 91.8G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi
```
無事にroot以下が91.8GBまで拡張されました!!


# まとめ

というわけで、oci-utils を使うと

* OCIコンソールにいかなくても、インスタンスの中から様々な情報が簡単に調べられる
* デーモンを立ち上げておけば、ボリュームやNICを追加しても勝手にいい感じに認識してくれる
* CLIと組み合わせると、普通ならちょっと面倒な操作をコマンド一発で実行できる

みたいないいことがあるので、OCI で Oracle Linux を使うときは、oci-utils をぜひ使ってみてください。きっと手放せなくなりますよ!!


# Oracle Cloud Advent Calendar2018に参加しています
さて、こちらのアドベントカレンダーに参加しています。まだ3日目ですが、25日まで埋まっているようですので、その他の記事も毎日楽しみにチェックしてみてください。
そしてパート2にはまだ空きもあるようなので、我こそと思う方はぜひご参加ください!
[Oracle Cloud Advent Calendar 2018 - Adventar](https://adventar.org/calendars/3077)