あきろぐ

いろいろめもするよ🐈🐈🐈

elasticsearch+logstash+grafanaを試してみるよ1(インストール編)


今回は、twitterプラグインを用いて取得したログをLogstashで加工しElasticsearchに保存した後、Grafanaで可視化するところまでやりたいと思います。

環境

  • CentOS7.6
  • Grafana6.16
  • Elasticsearch5.6.16
  • Logstash5.6.16

インストール

Java確認&インストール

Logstashを使うにはJava8が必要なので、事前にJava8が入っているか確認します。

java -version

CentOS7はデフォルトでjava8が入っていないので、インストールします。
今回はOpenJDKのディストリビューションを使います。
※現在サポートされているのはjava8のみなので、他のバージョンが入っていた場合は、バージョン変更を実施してください。

#java8のインストール
$ sudo yum -y install java-1.8.0-openjdk
#javaのバージョン確認
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

ElasticsearchとLogstashのインストール

続いて、ElasticsearchとLogstashをインストールしていきます。
yumでインストールする場合、公開署名キーをインポートする必要があります。

$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

その後、/etc/yum.repos.d/配下にrepoファイルを新規で作成します。
repoファイル名は何でも良いらしいですが、今回はドキュメントと同様"logstash.repo"ファイルとして作成します。

$ vi /etc/repos.d/logstash.repo
[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

repoファイルを作成したら、ElasticsearchとLogstashをインストールします。

$sudo yum -y install elasticsearch
$sudo yum -y install logstash

www.elastic.co

サービスの自動起動設定

インストールが完了したら、サービスの自動起動設定を行います。
設定したらサービスのステータスが「enabled」になっていることを確認しましょう。

#サービス自動起動の設定
$ sudo systemctl enable elasticsearch
$ sudo systemctl enable logstash
#確認
$ systemctl list-unit-files  -t service
elasticsearch.service                         enabled
logstash.service                              enabled

Twitterプラグインのインストール

今回はTwitterプラグインを使ってみますが、他のプラグインを使ってみたい方はLogstashで使用できるプラグインが下記リンクに書かれているので、インプットしたいデータソースがあるか確認してください。
コマンドでもLogstashで使用できるプラグイン確認できますよ。

#プラグイン一覧
 /usr/share/logstash/bin/logstash-plugin list

www.elastic.co

プラグインのインストール方法は下記リンクを参考にしました。
少しインストールに時間がかかるので焦らず待ちましょう。
「Installation successful」が表示されて入ればOKです!

#twitterプラグインをインストール
$ /usr/share/logstash/bin/logstash-plugin install logstash-input-twitter
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Validating logstash-input-twitter
Installing logstash-input-twitter
which: no javac in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
Installation successful

www.elastic.co

今回はここまで~('ω')ノ

参考文献

今回のインストール方法等は下記の書籍を参考にしました。
Elasticのドキュメントは英語なので、少ししんどい・・・と思う方や初心者の方におすすめですよ。

Grafanaを使ってZabbixの監視画面を作成する

f:id:akngo22:20190502195824p:plain
最近業務でGrafanaを使った監視画面の作成を行っているのですが、現場で貸与されているPCがロースペックで作業する度にイラついて仕方ないので、自宅で快適に試す環境があったらいいな~と思い作ってみました。

環境

  • Vagrant2.2.3
  • CentOS7.6 (Zabbix、Grafanaを入れるVM
  • CentOS6.10 (監視対象VM
  • Grafana6.1.6
  • Zabbix4.0

手順

VagrantCentOSは既に準備済みとして進めます。

1.Zabbixサーバーの準備

Zabbixの導入手順は、下記のリンクに沿って進めていけば問題なく設定完了します。
www.zabbix.com

Zabbixで監視するサーバーにもZabbix-agentを導入するのを忘れずに行います。
今回は監視するサーバーはCentOS6なので下記手順でやりました。
qiita.com

監視可能になっているかどうかは、ZabbixサーバーのGUI画面で確認します。
Configuration⇒Hosts⇒対象ホストのAvailabilityがグリーンであればOKです。
f:id:akngo22:20190502171542j:plain

監視ホストや監視アイテムは、公式ドキュメントを見て登録しデータを取得しておきます。
www.zabbix.com

2.Grafanaインストール

こちらも公式ドキュメントを見て導入しました。
grafana.com

 CentOS7はデフォルトでwgetコマンドが入っていないので、まずコマンドをインストールしてからレポジトリ追加していきます。

#wgetあるか確認
which wget 
#wgetのインストール
yum -y install wget 
#レポジトリ追加
wget https://dl.grafana.com/oss/release/grafana-6.1.6-1.x86_64.rpm 
#grafanaインストール
sudo yum localinstall grafana-6.1.6-1.x86_64.rpm 

Grafanaのインストールが完了したらGrafanaを起動させます。

sudo service grafana-server start

続いて「http://[Grafana_server_IP_address]:3000」にアクセスしGrafanaのGUI画面にログインします。デフォルトはのログインはユーザー名・パスワードともadminで入ることができます。ログインするとパスワード変更画面が表示されるので安全なものに変更しましょう。
パスワード変更すると下記のようなホーム画面に遷移します。
f:id:akngo22:20190502174802j:plain

3.Zabbixプラグインの追加

GrafanaはデフォルトのままだとZabbixをデータソースとして使えないので、Zabbixプラグインを追加する必要があります。
Zabbixサーバーで下記のコマンドを実行。

#zabbixプラグインのインストール
grafana-cli plugins install alexanderzobnin-zabbix-app
#grafanaの再起動
systemctl restart grafana-server

Grafanaの再起動後GUI画面を開きなおしzabbixプラグインがインストールされていることを確認します。
ホーム画面に追加されたと表示されていることを確認し、右側の「Enable now」をクリック。
f:id:akngo22:20190502175501j:plain

4.データソースの追加

ダッシュボードのConfigurationからDatasourceをクリックし、Zabbixをデータソースとして登録します。
Name、HTTPのURL、Zabbix API detailsのUsername、Password、ZabbixVersionは最低限入力しましょう。
入力が完了したら、画面下の「Save&Test」をクリックしてデータソースとして認識されたかどうか確認してください。
f:id:akngo22:20190502201451j:plain
テストが失敗した場合、URLが正しいかユーザー名・パスワードが間違っていないか見直します。

ダッシュボード&グラフ作成

ここまできたら後は、ダッシュボード追加してグラフを作成するだけです。
Create⇒Dashboardダッシュボードを新規追加し、AddPanelで好きな表示形式を選択しグラフを作成しましょう。
f:id:akngo22:20190502202548j:plain
とりあえず、Ping疎通に問題ないか確認する画面をSinglestatパネルで、CPU使用率の変動をグラフパネルで作成してみました。数値を文字にマッピングしたり、閾値を設けて現在の状態を分かりやすくすることも可能なので、結構便利だと思います。
後はZabbixの監視項目を色々追加してみるとサーバーの状態を分かりやすく表示できますよ。(今回は適当なので)
どういう風に可視化できるかはGrafanaが例をたくさん示しているので参考にしてみると良いかと!
play.grafana.org
Grafana-zabbixの公式ドキュメントもあるのでこちらも見てみると良いです。
alexanderzobnin.github.io

所感

Grafanaを使うとZabbix以外にもElasticsearchやMySQLなど様々なデータを可視化できて面白いです。
結構簡単に導入することができるのでぜひ試してみてください。

Azure Bot Service を使ってLINEbotを作成する(Cogbot勉強会)

f:id:akngo22:20190420232818j:image

Cogbot 勉強会 2019/04/20に行ってきました

以前slackbot作ったら結構楽しかったので、「今度はLINEbotを作成しよう!」と思って以下の勉強会に参加してきました。

cogbot.connpass.com

初めてLINEのオフィスに行ったのですが、おしゃれすぎて感動しました!こんなところで働いてみたいですね。今回は、LINEで翻訳Bot(多言語対応)を作成しました。

 

LINEbot作成の流れ

  1. Azure サブスクリプションの申し込み(無償版)、LINE Developer の登録をする
  2.  Azure Bot ServiceでEcho botを作成する
  3. LINE Developer ConsoleでMessaging APIの作成、Azure Bot Serviceと接続する
  4. Cognitive Services Translator Text APIの設定をする
  5. Azure App Service Editorでコードを追加する(C#かNode.js)
  6. Azure App Service Editor からのビルドする
  7. 完成!

 ハンズオン資料に沿って進めていったら、つまづくことなくビルドまでいったので1時間程度で終わりました。コードを書くことも少ないのでエンジニア経験の浅い方でもサクサク進むと思います!

完成物

できたものは、こちら。

翻訳kumabotとしてデプロイしました!イラストは自分で書いたものを使ってます。

f:id:akngo22:20190422223720p:image

ちょっと反応が鈍いですが、無料枠で使う分には十分かなと!

自分が書いたイラスト使うと愛着が湧くのでおすすめです。

参考文献

祝 LINE チャンネル追加!Azure Bot Service で翻訳チャットボット作成 (1)Azure Bot Service から LINE 接続 編 - Qiita

祝 LINE チャンネル追加!Azure Bot Service で翻訳チャットボット作成 (2)Cognitive Services Translator Text API 編 - Qiita

所感

  • ちょまどさんの説明がとても分かりやすかった!そしてとても可愛い!
  • ノベルティMicrosoftの黒トートバックがおしゃれ!普段使いできそう!
  • LINEキャラのステッカーも可愛い!
  • オリジナルクッキーも可愛い!
  • クリスピードーナツとタリーズコーヒーの差し入れがありがたかった!

可愛い連呼しましたが、すべてのクオリティが高くて唯々感動しました。。。

今回は資料に沿って作りましたが、他にも応用が利きそうなので違うbotも作ってみたいと思います。

f:id:akngo22:20190422222956j:plain

以上!

 

 

ansibleもくもく会(サーバー編)行ってきたよ

f:id:akngo22:20190327192718p:plain

遅くなりましたが、ansibleユーザー会主催のもくもく会に初参加してきました。

参加したのはこちら↓

ansible-users.connpass.com

今回のもくもく会は、オイシックス・ラ・大地(Osaki kitchen studio)で開催されました。オイシックス提供の美味しい野菜ジュースを飲みながらもくもくです。

 会場となったスタジオはこちら↓(若干迷ったw)

無料で会場提供しているとのことなので、勉強会等開催したい方、する予定がある方は連絡すると良いかもです。

www.wantedly.com

 もくもく内容

今回実施した内容については以下の通りです。

  • Ansible Engine

   アドホックコマンド

   Playbook

   変数、ループ、ハンドラ

   Ansible Galaxy

  • Ansible Tower

   Ansible Towerのインストール 👈私はここまで。。。

   Ansible Towerのコンフィグレーション

   Job Templateの作成と実行

大きく分けて、Ansible EngineとAnsible Towerの2つに触れてみるのが今回の目的でした。私は全部終わらなかったので、Ansible Towerは後日やります。。。

実際にAnsibleを試してみる環境は、事前に用意していただいていたので、参加者はSSHで準備済みの環境に接続するだけ!とてもありがたかったです。

アドホックコマンド

Ansibleのアドホックコマンドは、ワンライナーで処理を実行することができるので、「ささっと処理を実行してしまいたい!」って時にとても便利です。

デフォルトのインベントリファイルは、.ansible.cfgにパスが記載されているので事前にチェックしておきましょう。.ansible.cfgにインベントリファイルを指定していれば、-iオプションを使わなくてもそのファイルに書かれたホストに対して処理を実行してくれます。

f:id:akngo22:20190328202115j:plain

 例えば、以下のようにアドホックコマンド使うことができます。

-oオプションは、通常数行で表示されるコマンド結果を1行で表示させるオプションで、-bオプションはroot権限でコマンドを実行させるオプションです。

その他のコマンドオプションが知りたい場合は、ansible --helpコマンドを実行してみてください。

$ ansible [対象] -m ping  #対象のノードが操作可能か確認
$ ansible [対象] -m command -a "uptime" -o #対象ノードにuptimeコマンドを実行
$ ansible [対象] -m yum -a "name=httpd state=present" -b #対象ノードにapacheインストール 

Playbookの作成

アドホックコマンドは、ワンライナーで処理を実行することができますが、Playbookというスクリプトを書けば管理ノードに対する処理を一括で実行することができます。

f:id:akngo22:20190328232938j:plain

例えば、ApacheをインストールするPlaybookを書く場合は以下のようにします。

※インデントには注意しましょう。※

---
- hosts: web #対象のノードを指定
  name: install apache #任意で処理の内容など書くことが可能
  become: yes #root権限で処理を実行する
 
  tasks:
     - name: install apache #タスクの名前
       yum: #モジュール指定
           name: httpd
           state: present #インストールする

    - name: start httpd #タスクの名前
      service: #モジュール指定
          name: httpd
          state: started #起動させる
これくらいのPlaybookの長さだとインデントのミスに気づきやすいですが、記述が長くなってくると間違いに気づきにくくなるのが難点ですね。。。皆さんどうしてるんだろうか。

変数、ループ、ハンドラについて

Playbookでは、管理ノードに対する処理を一括で実行できるというメリットがありました。上記のようにそれぞれのグループに対して処理を書いていくのも良いですが、Playbookが長くなってしまうのが難点です。そこで、Playbookをより強力に使うために「変数」、「ループ」、「ハンドラ」を扱えるようになると、使いまわしがしやすくなります。

変数は、ターゲットサーバーごとに違う部分(IPアドレスディレクトリ等)を吸収し扱うことができます。変数はPlaybookだけでなくインベントリファイルでも指定することが可能です。

ループは、繰り返し実行するタスクがある場合に使用します。これによって、タスクを複数作成する必要がなくなります。

ハンドラは、サービスを再起動する必要がある場合に使用します。設定ファイルの変更・新規パッケージの導入など、再起動しなければ設定が反映されないときに活用できます。

例えば、上記のPlaybookに書き加えるとするなら、変数だとこのように指定できます。

---
- hosts: web 
  name: install apache 
  become: yes 
  vars: #変数は3つ
      httpd_packages: #"htpd_packages"という変数に"httpd"と"mod_wsgi"を代入する
         - httpd
         - mod_wsgi
      apache_test_message: This is a test message #文字列を変数に代入
      apache_max_keep_alive_requests: 115 #数字を文字列に代入

 "httpd_packages"はリスト型の変数であり、"httpd"と"mod_wsgi"の2つのパッケージをリストに入れるように定義しています。以下のようにすると要素を一行で書くことも可能です。

      httpd_packages: 
         [ httpdmod_wsgi ] #コンマで区切り、[]で囲むと1行で表せる

変数名は、自由に決めることができますが、「英数字とアンダースコア」で定義しなければならないので注意してください。例えば、"foo-port"や"foo port"、"555"などは変数名として使えません。

続いて、ループについてです。例えば、複数のパッケージをインストールしたい場合、同じようなタスクを複数書くのは面倒ですよね。ループを使えば、1つのタスクに収めることができます。

  tasks:
     - name: install httpd packages
       yum:
           name: "{{ item }}" #定義した変数に格納されたものを1つ1つ展開
           state: present
       with_items: "{{ httpd_packages }}" #"httpd_packages"に格納したものを使う

"items"と"with_items"はセットで使います。ここでは、"httpd_packages”を"items"の中に展開するという意味になるので、変数に入れたhttpdとmod_wsgiをそれぞれインストールすることができます。

f:id:akngo22:20190409222618p:plain

ハンドラに関しては、再起動が必要なタスクにnotifyキーを指定して使います。タスクにnotifyキーを指定するとhandlersキーを呼びだして、指定したサービスを再起動させることができます。ハンドラは基本Playbookに書かれたタスクが全て完了した後に実行されます。

  tasks:
     - name: install httpd packages
       yum:
           name: httpd
           state: present
       notify: restart apache service #ハンドラを呼び出して再起動する

  handlers: restart apache service
     - name: restart apache service
       service: name=httpd state=restarted

遭遇したエラー

1つ目

ERROR! Extraneous options or arguments

無効なオプションまたは引数を使っていませんか?実行した処理をもう一度見直してみましょう。これはたぶんオプションを間違えたときに出たやつです。

2つ目

fatal: [node1]: FAILED! => {"msg": "'httpd_pachages' is undefined"}
"httpd_pachages"は定義されていないですよと言われました。定義したのは"httpd_packages"なのでそりゃそうだ。。。シンタックスチェックコマンドでは、変数のミスは引っかからないなので気をつけましょう。

3つ目

fatal: [node2]: FAILED! => {"changed": false, "checksum": "26fd90c27a2f629a9ba00619e8e7b3fe4c9cfa59", "msg": "Unsupported parameters for (copy) module: notify Supported parameters include: _original_basename, attributes, backup, checksum, content, delimiter, dest, directory_mode, follow, force, group, local_follow, mode, owner, regexp, remote_src, selevel, serole, setype, seuser, src, unsafe_writes, validate"}
「モジュールのパラメータがサポートされていない」とのメッセージが表示されていますが、原因はインデントが間違っていたためでした。。。(全然気づかなかったw)

最後

自分の理解を深めるために色々書いてたら長くなってしまったので、ここまでで割愛。。。Roleを使ったPlaybookの書き方もまとめたいので今度書きます。