Puppet のログの収集
このページでは、Puppet 用 Sumo アプリケーションの Puppet ログ、レポート、イベントの収集手順を説明します。
プロセス概要
次のセクションでは、Puppet Master ホストへの Collector のインストール、Sumo Puppet Source (サーバ、アクセス、レポート ログ) のセットアップ、Puppet 用 Sumo アプリケーションのインストール手順を提示します。この設定を使用して、Puppet ログ、イベント、レポートを収集し、アプリケーションが提供するダッシュボードでリソース パフォーマンスと Puppet 実行を視覚化できます。
ステップ 1: アクセス キーの作成
「アクセス キー」の手順に従って、Sumo アクセス ID とキーを作成します。次のステップで Puppet Master ホストに Collector をセットアップするときに使用します。
ステップ 2: Puppet Master への Collector のインストール
このステップでは、Puppet Master ホストに Collector をインストールします。「Linux への Collector のインストール」の手順に従います。
ステップ 3: Puppet サーバ ログ用ローカル ファイル Source の設定
このステップでは、ステップ 2 で作成した Installed Collector に、ローカル ファイル Source を追加します。ローカル ファイル Source は Puppet サーバ ログを受信します。
「ローカル ファイル Source」のステップと、次の追加の手順に従います。
- [File Path (ファイル パス)] に Puppet サーバ ログ ファイル パスを入力します。デフォルトの Puppet サーバ ログ ファイルは次のとおりです。
/var/log/puppetlabs/puppetserver/puppetserver.log
Puppet サーバ ログが別の場所にある場合、正しいパスを入力します。 - [Source Category] では、次のように値を入力します。
prod/web/puppet/server
- [Advanced Options (詳細オプション)] でデフォルト値を許可します。
ステップ 4: Puppet サーバ アクセス ログ用ローカル ファイル Source の設定
このステップでは、ステップ 2 で作成した Installed Collector に、別のローカル ファイル Source を追加します。ローカル ファイル Source は Puppet サーバ アクセス ログを受信します。
「ローカル ファイル Source」のステップと、次の追加の手順に従います。
- [File Path (ファイル パス)] に Puppet サーバ ログ ファイル パスを入力します。デフォルトの Puppet サーバ アクセス ログ ファイルは次のとおりです。
/var/log/puppetlabs/puppetserver/puppetserver-access.log
Puppet サーバ アクセス ログが別の場所にある場合、正しいパスを入力します。 - [Source Category] では、次のように値を入力します。
prod/web/puppet/access
- [Advanced Options (詳細オプション)] でデフォルト値を許可します。
ステップ 5: Puppet レポート スクリプト Source の設定
Puppet レポートは YAML 形式を使用しています。これらは JSON 形式に変換してから、Sumo で取得する必要があります。
このセクションでは、Sumo Collector の取得用に YAML ファイルを JSON に変換するシェル スクリプトを実行する、スクリプト Source のセットアップ手順を紹介します。代替方法として、サードパーティ ツールで YAML ファイルを変換し、指定するディレクトリから JSON を取得するようにインストール済みコレクションのローカル ファイル Source を設定することもできます。
スクリプト Source の前提条件
次の前提条件が、スクリプト Source に適用されます。
- Collector プロセスを実行するユーザは、Puppet レポート ディレクトリへの読み込みおよび書き込みアクセス権を持っている必要があります。
- Collector は、Collector プロセスを実行するユーザとして、スクリプトを実行します。スクリプトは、マシンの stdout または stderror 出力ストリームにデータを出力し、収集されるようにします。詳細については、「スクリプト Source」を参照してください。
- スクリプトを実行するマシンには、Ruby がインストールされている必要があります。
- スクリプトは、問題のケースで確認できる設定済みの作業ディレクトリにログを生成します。
詳細については、「スクリプト Source」を参照してください。
スクリプト Source をセットアップする手順
- Sumo Web アプリケーションで、[Manage Data (データの管理)] > [Collection (コレクション)] > [Collection (コレクション)] を選択します。
- Puppet Master ホストにインストールされた Collector に移動して、[Add (追加)] > [Add Source (Source の追加)] を選択します。
- [Script (スクリプト)] を選択します。バージョン 19.245-4 以降の新しい Collector では、スクリプト Source の作成はデフォルトでは禁止されています。スクリプト Source を許可するには、user.properties 内の Collector のパラメータ
enableScriptSource
を true に設定する必要があります。 - Name (名前): (必須)。
- Description (説明): (省略可能)。
- Source Host (Source ホスト): Source ホストのホスト名または IP アドレスを入力します。ホスト名は最大 128 文字です。
- Source Category: (必須) 次のように値を入力します。
prod/web/puppet/reports
- Frequency (頻度)。デフォルトは 15 分です。
- Command (コマンド): デフォルト値、
/bin/sh,
が選択された状態のままにします。 - Script (スクリプト): [Type the script to execute (実行するスクリプトを入力)] を選択して、テキスト ボックスに次のスクリプトを貼り付けます。
MaxFileSize=20 log_file_name=puppet_rpt_conversion.log #Get size in bytes** file_size=`du -b puppet_rpt_conversion.log | tr -s '\t' ' ' | cut -d' ' -f1` file_size=$(($file_size/1048576)) if [ $file_size -gt "$MaxFileSize" ];then timestamp=`date +%s` mv puppet_rpt_conversion.log puppet_rpt_conversion.log.$timestamp fi echo "YAML to JSON conversion started!!" >> "$log_file_name" echo "Start Time: $(date)" >> "$log_file_name" if [ ! -e last_run_date.tmp ] then date "+%Y-%m-%d" --date=1970-01-01 > last_run_date.tmp; fi find . -maxdepth 2 -type f -name "*.yaml" -newermt "$(cat last_run_date.tmp)" | while read f; do if [ -s "$f" ] then sed 1d "$f" > tmpfile; ruby -rjson -ryaml -e "resource_list = '' json = JSON.generate({});data = JSON.parse(json); obj = JSON.parse(YAML.load_file('tmpfile').to_json); data['host'] = obj['host']; data['time'] = obj['time']; data['configuration_version'] = obj['configuration_version']; data['transaction_uuid'] = obj['transaction_uuid']; data['report_format'] = obj['report_format']; data['puppet_version'] = obj['puppet_version']; data['status'] = obj['status']; data['transaction_completed'] = obj['transaction_completed']; data['noop'] = obj['noop']; data['noop_pending'] = obj['noop_pending']; data['environment'] = obj['environment']; data['metrics'] = obj['metrics']; data['resource_list'] = resource_list; i = 0; obj['resource_statuses'].each{ |j| if i == 0 then tempdata = j[0]; else tempdata = ',' + j[0]; end data['resource_list'] << tempdata; i = i + 1; }; puts data.to_json; obj['resource_statuses'].each{ |y| logsres = y[1]; logsres['transaction_uuid'] = obj['transaction_uuid']; logsres['environment'] = obj['environment']; logsres['host'] = obj['host']; puts logsres.to_json; }; obj['logs'].each { |x|logsjson = x; logsjson['host'] = obj['host']; logsjson['transaction_uuid'] = obj['transaction_uuid']; logsjson['environment'] = obj['environment']; puts logsjson.to_json };" echo "$f conversion status:" $? >> "$log_file_name" date "+%d-%b-%Y %H:%M:%S" > last_run_date.tmp fi done echo "Conversion Completed. End Time: $(date)" >> "$log_file_name"
- Working Directory (作業ディレクトリ)。デフォルト Puppet レポート ディレクトリ:
/opt/puppetlabs/server/data/puppetserver/reports
Puppet が別の場所にインストールされている場合、正しいパスを入力します。 - [Advanced options (詳細オプション)] を設定します。
- Enable Timestamp Parsing (タイムスタンプ parse の有効化)。デフォルトでは、このオプションはオンになっています。
- Time Zone (タイム ゾーン): デフォルトは、[Use time zone from log file (ログ ファイルのタイム ゾーンを使用)] です。
- Timestamp Format (タイムスタンプ形式)。[Specify a format (形式を指定)] をクリックします。
- Format (形式)。以下を入力します。
yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
- Timestamp locator (タイムスタンプ ロケータ)。以下を入力します。
"time":"(.*?)"
- Format (形式)。以下を入力します。
- Enable Multiline Processing (複数行の処理の有効化)。
- Detect messages spanning multiple lines (複数行メッセージの検出)。デフォルトでは、このオプションはオンになっています。
- Infer Boundaries (境界の推定): デフォルトでは、このオプションはオンになっています。
- Boundary Regex (境界正規表現): 複数行処理が有効で、[Infer Boundaries (境界の推定)] が無効な場合は、メッセージ境界用の正規表現を入力します。
- Processing Rules (処理ルール)。 目的に応じて、処理ルールを設定します。詳細については、「処理ルール」を参照してください。
Puppet ログとレポートが Sumo Logic に流入するようになります。
スクリプト Source のトラブルシューティング
問題が発生した場合:
- 「スクリプト Source の前提条件」を確認します。
- 設定した作業ディレクトリで、スクリプトが作成するログ ファイルの内容を確認します。
ログ メッセージのサンプル
Puppet サーバ
2018-08-22 00:03:14,141 INFO [qtp839286351-63] [puppetserver] Puppet Compiled catalog for puppet-node-1 in environment production in 0.18 seconds
2018-08-22 00:19:33,594 ERROR [qtp839286351-62] [puppetserver] Puppet Could not find node statement with name 'default' or 'puppet-node-2' on node puppet-node-2
Puppet アクセス
54.90.112.107 - - [28/Aug/2018:06:42:49 +0000] "PUT /puppet/v3/report/puppet-node-1?environment=production& HTTP/1.1" 200 9 "-" "Puppet/5.5.3 Ruby/2.4.4-p296 (x64-mingw32)" 134
10.1.3.83 - - [28/Aug/2018:06:44:18 +0000] "GET /puppet/v3/node/puppet-node-3?environment=production&configured_environment=production&transaction_uuid=f95ce8bd-f97e-4d99-9a72-3b010a50ceb1&fail_on_404=true HTTP/1.1" 200 11394 "-" "Puppet/5.5.3 Ruby/2.4.4-p296 (x86_64-linux)" 77
Puppet レポート
Puppet レポートは YAML 形式を使用しています。これらは JSON に変換してから、Sumo で取得する必要があります。
これは YAML 形式の Puppet レポートの一部です。
-- !ruby/object:Puppet::Transaction::Report
host: puppet-node-1
time: '2018-08-28T03:25:05.628370065Z'
configuration_version: 1535426713
transaction_uuid: 8a3bb8e5-c5ec-44a2-a3a4-45aed3ae13e9
report_format: 6
puppet_version: 4.10.12
status: unchanged
transaction_completed:
noop: false
noop_pending: false
environment: production
logs:
- level: notice
message: Applied catalog in 2.03 seconds
source: Puppet
tags:
- notice
time: '2018-08-28T03:25:17.345922191Z'
file:
line:
metrics:
resources:
name: resources
label: Resources
values:
- - total
- Total
これは JSON 形式の Puppet レポートの一部です。
{"host":"puppet-node-1","time":"2018-08-14T22:22:50.931239059Z","configuration_version":1534247572,"transaction_uuid":"43b51400-e009-4e5e-b856-1dff5dae9c64","report_format":10,"puppet_version":"5.5.3","status":"unchanged","transaction_completed":true,"noop":false,"noop_pending":false,"environment":"production","logs":[{"level":"err","message":"Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Syntax error at '}' (file: /etc/puppetlabs/code/environments/production/modules/sumo/manifests/nix_config.pp, line: 185, column: 1) on node puppet-node-1","source":"Puppet","tags":["err"],"time":"2018-08-14T22:22:52.910348336Z","file":null,"line":null},{"level":"notice","message":"Applied catalog in 0.05 seconds","source":"Puppet","tags":["notice"],"time":"2018-08-14T22:22:53.024015171Z","file":null,"line":null}],"metrics":{"resources":{"name":"resources","label":"Resources","values":[["total","Total",10],["skipped","Skipped",0],["failed","Fail
クエリのサンプル
失敗したリソース
_sourceCategory=prod/web/puppet/reports
| parse "\"resources\":{\"name\":\"resources\",\"label\":\"Resources\",\"values\":[[\"total\",\"Total\",*],[\"skipped\",\"Skipped\",*],[\"failed\",\"Failed\",*],[\"failed_to_restart\",\"Failed to restart\",*],[\"restarted\",\"Restarted\",*],[\"changed\",\"Changed\",*],[\"out_of_sync\",\"Out of sync\",*],[\"scheduled\",\"Scheduled\",*],[\"corrective_change\",\"Corrective change\",*]]" as total_res,skipped,failed,failed_to_restart,restarted,changed,out_of_sync,scheduled,corrective_change
| sum(total_res) as total_resources, sum(failed) as failed_resources
| failed_resources/total_resources*100 as failed_res_pct
| fields failed_res_pct