Nutanix Syslogをサーバに出力してみる

# はじめに

本記事は[[4枚目]Nutanix Advent Calendar 2019][Nutanix Advent Calendar 2019]の記事です
[Nutanix Advent Calendar 2019]:https://adventar.org/calendars/4475
本内容は2019/12/18時点での内容となります。また、本記事による万が一の不測の損害・不利益等は負いかねます。

# 環境

- 今回のお話は以下の環境です
  - 当初AOSは5.10.0.1だったが後述のトラブルも踏まえVerUPした
 
| ソフトウェア | バージョン    | 
|:-----------|:------------|
| AOS        | 5.10.6      |
| HV         | AHV         |
| HV Version | 20170830    |


# きっかけ
- 社内規則上、一定期間内・一定プライオリティ以上のログを保管する必要があったが
   **Nutanixのログローテート契機は保持期間ではなく容量（9GB）で決められる（容量を超えると自動でローテート）**
ことがわかったため、自前でsyslogサーバを構築し、そこに蓄積させることにした
  - 今回は自前syslogサーバの設定は割愛し、HCI側の設定のみ抜粋

# 事前知識

- Nutanixのログファイルは「genesis status」コマンドで得られるプロセス単位で出てくる

```
nutanix@NTNX-SERIALNUMBER-A-CVM:CVM_IPADDRESS:~$ genesis status
YYYY-MM-DD hh:mm:ss: Services running on this node:
  abac: []
  acropolis: [11951, 12056, 12057, 12058]
  alert_manager: [11851, 11914, 11915, 11996]
  aplos: [13142, 13181, 13182, 13189, 13387, 13565]
  aplos_engine: [12939, 13003, 13004, 13005]
  arithmos: [11874, 11948, 11949, 12115]
  athena: [11513, 11607, 11608, 11609]
  cassandra: [10591, 10626, 10627, 10632, 10732]
  catalog: [11901, 11983, 11984, 11985]
  （省略）
```

- 場所は /home/nutanix/data/logs配下
  - .outがメインのログ、.XXXは各プライオリティのログ

```
nutanix@NTNX-SERIALNUMBER-A-CVM:CVM_IPADDRESS:~$ ls /home/nutanix/data/logs/
acropolis.FATAL
acropolis.out
acropolis.out.YYYYMMMDD-hhmmss
acropolis-scheduler.out
acropolis-scheduler.out.YYYYMMMDD-hhmmss
alert_manager.ERROR
alert_manager.INFO
（省略）
```

# 設定内容

- Nutanixクラスタのどれか一つのCVMにログインしてncliを開始

```
$ ssh CVM_IPADDRESS -l nutanix 
Nutanix Controller VM 
nutanix@CVM_IPADDRESS's password:
nutanix@NTNX-SERIALNUMBER-A-CVM:CVM_IPADDRESS:~$ ncli 
Welcome, admin 
You're now connected to CULSTER_ID (CLUSTER_NAME) at 127.0.0.1 
<ncli> 
```

- 設定変更前に一度syslogを無効する

```
<ncli>   rsyslog-config set-status enable=false 

     RSyslog Status            : Disabled 
     RSyslog Servers           : [None] 
```

- 転送先のsyslogサーバを登録
  - 転送プロトコルはTCPも選べるがUDPにした（この理由も後述）

```
<ncli> rsyslog-config add-server name=SYSLOG_SERVER_HOSTNAME relp-enabled=false ip-address=SYSLOG_SERVER_IPADDRESS  port=514 network-protocol=udp |

     Name                      : SYSLOG_SERVER_HOSTNAME 
     IP Address                : SYSLOG_SERVER_IPADDRESS
     Port                      : 514
     Protocol                  : UDP 
     Relp Enabled              : false 
```

- 登録を確認

```
<ncli>  rsyslog-config ls-servers 
     Name                      : SYSLOG_SERVER_HOSTNAME 
     IP Address                : SYSLOG_SERVER_IPADDRESS
     Port                      : 514 
     Protocol                  : UDP 
     Relp Enabled              : false 
```

- モジュール（対象のプロセスとそのレベル） をプロセスごとに設定

```
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=ACROPOLIS level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=AUDIT level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=CASSANDRA level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=CEREBRO level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=CURATOR level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=GENESIS level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=PRISM level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=STARGATE level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=SYSLOG_MODULE level=ERROR include-monitor-logs= false  
<ncli> rsyslog-config add-module server-name=SYSLOG_SERVER_HOSTNAME module-name=ZOOKEEPER level=ERROR include-monitor-logs= false  
```

- モジュール追加はls-modulesオプションで確認可能 

```
<ncli> rsyslog-config ls-modules server-name=SYSLOG_SERVER_HOSTNAME 
     Module Name               : ACROPOLIS 
     Log Level                 : ERROR 
     Include Monitor Logs      : false
     Module Name               : AUDIT 
     Log Level                 : ERROR 
     Include Monitor Logs      : false

     Module Name               : CASSANDRA
     Log Level                 : ERROR 
     Include Monitor Logs      : false 

     Module Name               : CEREBRO 
     Log Level                 : ERROR 
     Include Monitor Logs      : false 

     Module Name               : CURATOR 
     Log Level                 : ERROR
     Include Monitor Logs      : false 

     Module Name               : GENESIS
     Log Level                 : ERROR
     Include Monitor Logs      : false

     Module Name               : PRISM
     Log Level                 : ERROR 
     Include Monitor Logs      : false

     Module Name               : STARGATE
     Log Level                 : ERROR
     Include Monitor Logs      : false

     Module Name               : SYSLOG_MODULE
     Log Level                 : ERROR 
     Include Monitor Logs      : false
     
     Module Name               : ZOOKEEPER
     Log Level                 : ERROR
     Include Monitor Logs      : false 
```

- syslogを有効にする

```
<ncli>  rsyslog-config set-status enable=true 

     RSyslog Status            : Enabled 
     RSyslog Servers           : 1 
     Name                      : SYSLOG_SERVER_HOSTNAME 
     IP Address                : SYSLOG_SERVER_IPADDRESS 
     Port                      : 514 
     Protocol                  : UDP 
     Relp Enabled              : false 
```

# ポイントなど
 - **Prismからは設定不可能**、nCLIから設定する
 - ファシリティは**local0で固定**（変更不可） 
 - プライオリティは**デフォルトだとERROR**
   - 今回の設定は明示的にERRORに設定した例 
 - AOS5.10.0.1の環境で試行錯誤していたところ、**何故かクラスタ上のVMが不用意に落ちる**トラブル発生
  - 当該AOSのバグで、「syslog転送（TCP）に失敗するとHCI内部のキューがスタック（?）」したようだ
  - 対応策は「syslogをUDPで転送」 or 「AOSを上げる」 → 他の影響もないので両方とも実施した

# わからなかったこと・今後理解したいこと

 - 「Include Monitor Logs」のオプションの意味・必要性？
  - Trueにすると、指定したログレベルに関わらずログファイルの出力される？なんのため？（INFOではだめなのか？）
 - ローカル（/home/nutanix/data/logs/）に生成されるログファイルの出力規則はどう決まるのか？
  - プロセスXXXは「XXX.out」と「XXX.WARNING」は出力されているがプロセスYYYは「YYY.out」と「YYY.ERROR」と「YYY.INFO」が出力されているようだ


以上