大切なことはすべてUbuntuが教えてくれた　無人アップグレードを知りましょう

# はじめに
本記事はUbuntuの無人アップグレードについて記載しています。

Ubuntuは無人アップグレードという機能がデフォルトで有効になっていて、自動的にOSのパッケージのアップデート及びアップグレードを行ないます。

システム管理者として注意しないといけないのは、無人アップグレードの機能を理解することです。

例えば、本番環境でシングル構成で運用しているサーバがあるとします。
無人アップグレードがデフォルトの状態でサービスの自動起動を設定していない場合は、サービスに支障が出るリスクがあります。

過去の事例ですが、サービスがダウンしていていたので原因を調査しました。
`uptime`コマンドを実行すると起動時間が短いことから、サーバ再起動が行われたと判断し、シスログより以下のログを確認しました。

```console
Feb 20 09:14:48 ＜ホスト名＞ systemd[1]: Stopped Unattended Upgrades Shutdown.
```

上記ログの約3〜4分後にOS再起動が行われましたが、その後サービスの自動起動が設定されていなかったため、サービスのダウンタイムを引き起こしました。

本記事では無人アップグレードを考慮し、サービスの自動起動の設定方法についても解説します。

## 無人アップグレード
無人アップグレードを停止することは根本的な問題解決になりません。
無人アップグレードの仕組みは以下になります。（本記事のUbuntuのバージョンは18.04）

### /etc/apt/apt.conf.d/20auto-upgrades
`/etc/apt/apt.conf.d/20auto-upgrades`のファイルを参照するとデフォルトでは以下の設定値になっています。

- /etc/apt/apt.conf.d/20auto-upgrades

```console
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
```

**Update-Package-Lists**が1の場合は、自動でパッケージのリストを更新します。**Unattended-Upgrade**が1の場合は、自動でパッケージのアップグレードが行われます。

値を0にすることで無効にできます。

また、パッケージのアップデートに関するログは、`/var/log/apt/history.log`ファイルから履歴を確認できます。

### /etc/apt/apt.conf.d/50unattended-upgrades
自動アップグレードが有効な状態でスケジュールに従って、OSの再起動を行いたい場合は、`/etc/apt/apt.conf.d/50unattended-upgrades`のファイルでスケジュールを設定できます。以下はアップグレードがあった場合に、23:00に再起動を行う例です。

- `/etc/apt/apt.conf.d/50unattended-upgrades`

```coonsole
// Automatically reboot *WITHOUT CONFIRMATION*
//  if the file /var/run/reboot-required is found after the upgrade 
Unattended-Upgrade::Automatic-Reboot "true";

// If automatic reboot is enabled and needed, reboot at the specific
// time instead of immediately
//  Default: "now"
Unattended-Upgrade::Automatic-Reboot-Time "23:00";
```

**Automatic-Reboot**のデフォルトは**false**で、**Automatic-Reboot-Time**はコメントアウトされています。設定を有効にする場合は、**Automatic-Reboot**を**true**にし、**Automatic-Reboot-Time**に任意の時刻を設定します。

## 自動起動設定
サービスの自動起動の方法はいくつか方法があります。
大きく分けるとOS機能のsystemctlで設定するか、MWのパッケージなどを利用することができます。

例としてnodeアプリケーションの場合、**PM2**というデーモンプロセスマネージャなどがあります。本記事ではsystemctlで一度だけ実行するサービスの設定方法について解説します。

systemctで設定する場合は起動スクリプトを作成し、`/etc/systemd/system`配下に以下のファイルを配備します。

- node.service

```text
[Unit]
Description = Node.js
After=local-fs.target
ConditionPathExists=/root

[Service]
ExecStart=/root/node_start.sh
Restart=no
Type=oneshot
RemainAfterExit=yes

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

次に以下のコマンドを実行し、systemctlに登録します。

`# systemctl daemon-reload`

また、OS起動時にsystemctlにより、登録したサービスを自動起動させる場合は以下のコマンドを実行します。

`# systemctl enable node.service`

```console
Created symlink /etc/systemd/system/multi-user.target.wants/node.service → /etc/systemd/system/node.service.
```

サービスの自動起動確認は以下のコマンドを実行します。

`# systemctl list-unit-files --type=service | grep enable | grep node`

```console
node.service                                   enabled
```

# おわりに
CoreOSにも同じ様な機能があります。
以下のサービスを停止することで、OSの自動起動を防ぐことができます。

`# systemctl status update-engine`

## 参考
- [apt/unattended-upgrades stalls shutdown
](https://askubuntu.com/questions/878630/apt-unattended-upgrades-stalls-shutdown)
- [Reboot strategies on updates](https://coreos.com/os/docs/latest/update-strategies.html)
- [RHEL 7 における systemd の概要](https://access.redhat.com/ja/articles/1379593https://access.redhat.com/ja/articles/1379593)
- [PM2](https://pm2.keymetrics.io/)