Edited at

cloud-initでOCI Computeの初期設定を済ませる


cloud-initによるインスタンスのカスタマイズ

Computeインスタンス作成すると、初期状態ではタイムゾーンやロケールなどが日本向けに設定されていない。そのため手動で変更しなければならない。そんなときに便利なのがcloud-initである。cloud-initを使用すると、はじめから変更した状態でインスタンスを作成できる


今回設定すること

今回はcloud-initで以下の設定を行う。cloud-initの詳細は公式ドキュメントを参照のこと。


  • ロケールの変更

  • タイムゾーンの変更

  • パッケージのアップデート

  • 便利パッケージの追加

なお手動で設定する方法は、以下のエントリで紹介している。設定意図や確認方法の詳細は、こちらを参考にして欲しい。


対象環境

cloud-initのコードは、Linuxディストリビューションの種類やバージョンとは独立している。そのため6系でも7系でも同じコードを利用できる。試していないが、おそらくUbuntuでも。またWindowsでは、ほぼ同様のcloudbase-initが利用できる。

ただし本文の後半では、設定されていることをOracle Linux 7で確認している。6系のディストリビューションでの確認方法は 「OCI Compute払い出し直後にやること」を見て欲しい。


Computeインスタンス作成時の指定方法


管理コンソールでComputeインスタンスページを選択

管理コンソールのComputeページで[Create Instance]をクリックして作成ページに移動する。一番下までスクロールすると[Show Advanced Options]があるのでクリックするとオプションが展開する。


User dataにcloud-initのコードを入力

表示された部分をさらに下にスクロールすると「User data」が表示される。[Past cloud-init script]にトグルすると、その下のテキストボックスに入力できるようになる。もしくは[Choose cloud-init script file]でファイルを指定できる。



テキストボックスに以下のコードをコピーする。Oracle Linux 6と7で試したところ、まったく同じコードを利用できた。

#cloud-config

timezone: Asia/Tokyo
locale: ja_JP.utf8
package_upgrade: true
packages:
- man-pages-ja
- multitail
- nmap
- nc
- tmux
- tree

これで終了である。あとは[Create]をクリックし作成を開始する。

注意:YumリポジトリにアクセスできないNWではpackageを記述しない

上記のサンプルではRPMパッケージのアップデートやインストールを行なっている。そのためYumリポジトリにアクセスできないネットワークでは、意図した通りに動作しない。

またService Gatewayを設定していればYumリポジトリにアクセスできる。しかし非常にセキュアな環境では、インターネットへのアクセスをプロキシ経由に限定することがある。そのようなときも払い出し直後の状態ではプロキシ設定が無いためYumに失敗する。


作成した環境を確認する


タイムラグがあること理解する

今回テストした環境ではタイムラグがあり、起動直後にログインしたときはタイムゾーンはUTCのままだった。その後5分くらい経過したらJSTになっていた。


  • はじめてyum updateを実行するときには、リポジトリとのメタデータ同期に時間がかかるにもかかわらず、インスタンス作成にかかる時間は通常と変わらなかった

  • 起動直後は変わっていなかった

  • 起動して5分後くらいには変わっていた

以上の事実を踏まえると、インスタンス作成が終わってから、cloud-initのコードが実行されると思われる。cloud-initでパッケージアップデートするときは確認作業をするまで5分程度待って欲しい。

タイムラグがある理由について調べたことを、下記の別エントリに記述した。興味のあるかたは読んで欲しい。


cloud-initが終了したことを知る方法

よく分からない時間を待つのはつらいだろう。cloud-initのログ/var/log/cloud-init.logで判別できる。

# tail -f /var/log/cloud-init.log

次のようにfinish: modules-finalの行が表示されれば終了している。

2019-05-16 13:04:25,343 - util.py[DEBUG]: Read 14 bytes from /proc/uptime

2019-05-16 13:04:25,343 - util.py[DEBUG]: cloud-init mode 'modules' took 0.208 seconds (0.21)
2019-05-16 13:04:25,344 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final

またOracle Linuxの場合、Kspliceが有効になっているためyum updateに時間がかかる。topなどで確認してCPU使用率が10%を超えていれば「まだcloud-initは終わっていない」と考えていいだろう。Kspliceについては、近いうちに別エントリとして書く予定である。

★topの出力例

top - 13:02:50 up 3 min, 2 users, load average: 1.27, 0.89, 0.39
Tasks: 136 total, 5 running, 76 sleeping, 0 stopped, 0 zombie
%Cpu(s): 50.9 us, 3.6 sy, 0.0 ni, 43.6 id, 1.5 wa, 0.0 hi, 0.0 si, 0.3 st
KiB Mem : 15117488 total, 12620128 free, 467276 used, 2030084 buff/cache
KiB Swap: 8388604 total, 8388604 free, 0 used. 14282896 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15786 root 20 0 4632 1552 1272 R 100.0 0.0 0:07.13 gzip ★
15785 root 20 0 4484 708 632 R 7.6 0.0 0:00.35 cpio
8554 root 20 0 162020 4556 3876 R 0.7 0.0 0:00.08 top
1 root 20 0 128256 8400 5676 S 0.3 0.1 0:03.11 systemd


設定されていることを確認する

タイムゾーンを確認すると日本になっている。

$ timedatectl

Local time: 火 2019-05-14 21:29:08 JST ★
Universal time: 火 2019-05-14 12:29:08 UTC
RTC time: 火 2019-05-14 12:29:08
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a

ロケールも変更されている。Keymapは通常は影響が無いのでよしとしよう。

$ localectl

System Locale: LANG=ja_JP.utf8
VC Keymap: us
X11 Layout: us

$ cat /etc/locale.conf
LANG=ja_JP.utf8

インストールされているパッケージを調べると、cloud-initで指定したものがインストールされている。

$ rpm -qa --last |less

tree-1.6.0-10.el7.x86_64 2019年05月14日 21時24分40秒
tmux-1.8-4.el7.x86_64 2019年05月14日 21時24分40秒
multitail-6.4.2-1.el7.x86_64 2019年05月14日 21時24分40秒
man-pages-ja-20130615-3.el7.noarch 2019年05月14日 21時24分40秒
nmap-6.40-16.el7.x86_64 2019年05月14日 21時24分38秒
nmap-ncat-6.40-16.el7.x86_64 2019年05月14日 21時24分37秒
python-jinja2-2.7.2-3.el7_6.noarch 2019年05月14日 21時22分14秒
kernel-3.10.0-957.12.1.el7.x86_64 2019年05月14日 21時22分10秒
sos-3.6-17.0.1.el7_6.noarch 2019年05月14日 21時22分06秒
libgomp-4.8.5-36.0.1.el7_6.2.x86_64 2019年05月14日 21時22分05秒
python-perf-3.10.0-957.12.1.el7.x86_64 2019年05月14日 21時22分04秒

アップデート可能なパッケージがあるか調べてみると、こちらも表示されない。うまくいった!

$ sudo yum check-update

読み込んだプラグイン:langpacks, ulninfo
★何も表示されない★


おわりに

カスタムイメージを作成すれば同じものを複製できる。またAnsibleやChefなどを使っても同様なことを実現できる。だけれど、とても手軽に使えるのがcloud-initの魅力だ。時間のあるときに、もっと調べてみたい。