paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

2023上半期見た映画メモ

GW明けてからちょっとしたトラブル続きでほぼ出社している状況が続いています。
休みは取れるレベルではありますがあっという間に今年も後半に入ってしまいました。

恒例の映画振り返りです。

今回は使っていたtweet getの機能がAPIプランの関係で使えません。
今後の移行も考えアーカイブデータを作って引っ張ってくる事にしました。

準備

普通にtwitterのアカウント回りでアーカイブデータ作成依頼ボタンを押すだけです。
24時間以内にデータ準備のお知らせが来てダウンロード出来ます。

全件貰えるのでファイルは省略しますがtreeはこんな感じ。

2813616a0cb59de0d9$ tree -d
.
├── assets
│   ├── fonts
│   ├── images
│   │   └── twemoji
│   │       └── v
│   │           └── latest
│   │               ├── 72x72
│   │               └── svg
│   └── js
└── data
    ├── community_tweet_media
    ├── deleted_tweets_media
    ├── direct_messages_group_media
    ├── direct_messages_media
    ├── moments_media
    ├── moments_tweets_media
    ├── profile_media
    ├── tweets_media
    ├── twitter_article_media
    └── twitter_circle_tweet_media

20 directories

dataの中にtweets.jsファイルがあってこれが投稿データです。
これをgrepすればよさそう。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/Downloads/twitter-2023-07-11-de7533042449ea07415d39cadb56c0752218515b9ab4a42813616a0cb59de0d9$ head -20 tweets.js
window.YTD.tweets.part0 = [
  {
    "tweet" : {
      "edit_info" : {
        "initial" : {
          "editTweetIds" : [
            "1678045323875450881"
          ],
          "editableUntil" : "2023-07-09T15:15:56.000Z",
          "editsRemaining" : "5",
          "isEditEligible" : true
        }
      },
      "retweeted" : false,
      "source" : "<a href=\"https://tweeter.com\" rel=\"nofollow\">moviesinfo</a>",
      "entities" : {
        "hashtags" : [ ],
        "symbols" : [ ],
        "user_mentions" : [ ],
        "urls" : [ ]

上半期みた映画

成形しつつgrep。wslで実行してます。

twitter APIみたいにアプリ名で引っかけられないのでgrepで投稿データ抜くだけでは手動で投稿したものも引っ掛かってしまいます。
なのでsortを2回咬ませて重複を削除しました。
uniqって行離れてたら重複って認識しないのね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/Downloads/twitter-2023-07-11-de7533042449ea07415d39cadb56c0752218515b9ab4a42813616a0cb59de0d9$ grep '視聴しました' tweets.js | grep -oP "      \"full_text\" : \"\K2023-0[1-6].+」" | sed 's/に/ /g' | sort -k 2 | uniq -s 14 | sort -r | nl
     1  2023-06-25 「Blade」
     2  2023-06-18 「Nobody」
     3  2023-06-17 「The Saint」
     4  2023-06-04 「The Client List」
     5  2023-05-29 「Passengers」
     6  2023-05-28 「The Mask」
     7  2023-05-22 「John Wick」
     8  2023-05-21 「Rough Night」
     9  2023-05-15 「Hollywood Homicide」
    10  2023-05-14 「How to Be Really Bad」
    11  2023-05-07 「School of Rock」
    12  2023-05-06 「Shaft」
    13  2023-05-04 「Wrath of Man」
    14  2023-05-04 「Justice League」
    15  2023-05-02 「Half Brothers」
    16  2023-04-24 「Sydney White」
    17  2023-04-16 「Get Smart with Money」
    18  2023-04-15 「The Great Hack」
    19  2023-04-09 「Hanna」
    20  2023-04-03 「Punch-Drunk Love」
    21  2023-03-26 「Tomcats」
    22  2023-03-25 「The Losers」
    23  2023-03-21 「Ocean's Eight」
    24  2023-03-19 「Guns Akimbo」
    25  2023-03-18 「The Peacemaker」
    26  2023-03-12 「Good on Paper」
    27  2023-03-05 「The Usual Suspects」
    28  2023-03-05 「The Last Shift」
    29  2023-02-26 「Ghost Rider」
    30  2023-02-19 「The Do-Over」
    31  2023-02-19 「Death Becomes Her」
    32  2023-02-12 「The Avengers」
    33  2023-02-05 「The Takeover」
    34  2023-01-29 「Premium Rush」
    35  2023-01-29 「Coffee &amp; Kareem」
    36  2023-01-21 「The Rainmaker」
    37  2023-01-15 「White Chicks」
    38  2023-01-14 「Money Monster」
    39  2023-01-09 「Ocean's Thirteen」

今回は39件。
基本週一、二ペースですがコロナ引きこもりのリハビリを兼ねて出掛けたりしてたのでちょい少なめです。

上半期ベスト3

今回は面白い作品が多くて選ぶのめっちゃ悩みました。

  1. Hanna (2011)
    山奥で父と暮らす主人公ハンナが年頃になり山を下りるというあらすじです。
    父関係のCIAからの逃亡とロードトリップなど緊迫や日常などもりもりで面白かったです。
    ハンナの環境柄戦闘シーンも面白いです。
  2. Rough night (2017)
    バチェロレッテパーティー系の映画です。この手の映画はうるさいだけなので見ないのですがスカーレットヨハンソンが主演だったので見てしまいました。
    あらすじに反してパーティーからサスペンス物に様変わりし、結構面白い作品でした。
    ネトフリって逆あらすじ詐欺が多いですね。
  3. Blade (1998)
    高校のときの自習でBlade2か3を見たのですが戦闘アクションだけ凝ったB級映画か?みたいな印象でした。
    おすすめに出てきたので視聴しましたが思いのほかストーリーもしっかりしていてよかったです。
    Seints row the thirdのナイトブレイドの元ネタって名前も設定も絶対これですねw

次点でDeath Becomes Her(永久に美しく)、マスク辺りですかね。

まとめ

ここでは映画ジャンル書いてないのでわかりませんが今回はバランスよい視聴だったと思います。
だから選出も悩んだのでしょう。
ネトフリオリジナル作品も面白いものが多いので映画視聴はまだまだ続けたいですね。

アーカイブはhtmlで参照できるようになっているので本当はスクレイピング等で抜きたかったのですが、
オートリロードというかスクロールで次のツイートを出すという処理が難しくて全件抜けなかったので諦めてgrepにしました。
久しぶりにselenium触ったのですがすっかり忘れてましたw

後半戦もがんばるぞいっと。

twitter API v2でtweepyからPOSTする

自分用の映画視聴履歴としてtwitterに投稿しておくという事をやっているのですが昨年からAPIが有料になるどうこうで4月半ばから投稿ツールが使えなくなってしまいました。
v2用のナレッジもそろってきたという事で投稿ツールを修正しました。

ツールの投稿系の動作はこちらです。

paloma69.hatenablog.com

v2の変更

変更点は公式や色々なサイトに乗っていますので割愛します。

Developer portalのアカウントがfree, basic, proと有料プランが増えたのが大きな変更でしょうか。
投稿ツールのためにお金出すのもなあということでfreeプランを使います。

認証系詳しくないのですがOath2.0というのになったようで新しくBearer tokenというものが増えました。

Developer portalで取得できますのでこの辺も割愛します。

インタラクティブインタシェルで練習

v2用のキー系を取得したので練習します。
tweepyも関数が変わりますのでこちらもアップデートしました。

ちなみに動かしていたUbuntuが電源故障で壊れたのでメインWindowsのWSL上に退避させました。

(python3) masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/share/ubuntubackup/movietweet$ pip list
Package            Version
------------------ ---------
…
tweepy             4.14.0

認証。

>>> import configure, tweepy
>>> client = tweepy.Client(bearer_token=configure.BA)
>>>
>>> client.get_me()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

(略)

    raise TypeError("Consumer key must be string or bytes, not "
TypeError: Consumer key must be string or bytes, not NoneType

Bearer tokenだけだとダメ見たいです。
公式Docに書いてあるのになあ。

一応ConsumerキーやAccess token系も投入。

>>> client = tweepy.Client(bearer_token=configure.BA, consumer_key=configure.CK, consumer_secret=configure.CS, access_token=configure.AT, access_token_secret=configure.AS)
>>> client.get_me()
Response(data=<User id=xxxxxxxxxx name=masashi username=palomax69>, includes={}, errors=[], meta={})

自分のユーザ情報は取れました。
自分のツイートはというと…

>>> client.get_users_tweets(xxxxxxxxxx) # <- User idを入れてます
Traceback (most recent call last):
  (略)
    raise Forbidden(response)
tweepy.errors.Forbidden: 403 Forbidden
When authenticating requests to the Twitter API v2 endpoints, you must use keys and tokens from a Twitter developer App that is attached to a Project. You can create a project via the developer portal.

Developer portalのProjectに紐づいてないからダメって言われます。
紐づいてるんだけどな。

freeプランはPOST、DELETEのみでした

プランの内容をよく見てみるとfreeはPOST、DELETEと自分のユーザのみ見れるようです。

GET使えないと困りますが、一旦POSTだけ出来ればいいか。

POSTしてみます。

>>> client.create_tweet(text='post from api v2')
Response(data={'edit_history_tweet_ids': ['1672791196266266625'], 'id': '1672791196266266625', 'text': 'post from api v2'}, includes={}, errors=[], meta={})

いったっぽい。

OKですね。

コード修正

投稿用の認証とPOST周りのコードを修正します。
といってもちょっとコマンド変えただけ。

(python3) masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/share/ubuntubackup/movietweet$ git diff tweetapi.py
diff --git a/tweetapi.py b/tweetapi.py
index 793e395..24f6c34 100755
--- a/tweetapi.py
+++ b/tweetapi.py
@@ -3,15 +3,14 @@
 import tweepy
 import configure

+Bearer_Token=configure.BA
 Consumer_Key=configure.CK
 Consumer_Secret=configure.CS
 Access_Token=configure.AT
 Access_Secret=configure.AS

 def TWauth():
-    auth = tweepy.OAuthHandler(Consumer_Key, Consumer_Secret)
-    auth.set_access_token(Access_Token, Access_Secret)
-    api = tweepy.API(auth)
+    api = tweepy.Client(bearer_token=Bearer_Token, consumer_key=Consumer_Key, consumer_secret=Consumer_Secret, access_token=Access_Token, access_token_secret=Access_Secret)

     return api
(python3) masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/share/ubuntubackup/movietweet$ git diff posttw.py
diff --git a/posttw.py b/posttw.py
old mode 100644
new mode 100755
index 0ce3f30..08682a6
--- a/posttw.py
+++ b/posttw.py
@@ -6,5 +6,5 @@ import sys
 api = TWauth()

 # ツイート
-api.update_status(sys.argv[1])
+api.create_tweet(text=sys.argv[1])

投稿

昨日BLADEというヴァンパイアハンターのアクション映画を見たので投稿してみます。

(python3) masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/share/ubuntubackup/movietweet$ bash twmovieinfo.sh blade
2023-06-25に「Blade」を視聴しました。

Infomation
---
Year: 1998
Genre: Action, Horror, Sci-Fi
Director: Stephen Norrington
Actors: Wesley Snipes, Stephen Dorff, Kris Kristofferson
Production: N/A
---

from API v2

投稿しますか?: [y/n]y
投稿を完了しました。
tweepy.errors.Forbidden: 403 Forbidden
220 - Your credentials do not allow access to this resource.

のエラーが出ていません。
上手くいった様ですね。

無事投稿も出来てます!

まとめ

API仕様が変更になってからすぐ対応したかったのですがいろんな事情でなかなかできませんでした。
手動で投稿したりと運用は出来ていたものの修正してもPOSTしかできないのでは少し困りますね。
2回同じ映画を見ないようにこのツールを作ったのでGET機能もセットで欲しいところです。有料プランにするかスクレイピングしか方法が思いつきません。

自宅ラボも出来たことだし新しい記録方法を考えてみてもいいかもしれませんね。

Homelabにモニタリングサーバ導入4 dockerホストをcAdvisorで監視する

今回はcAdvisorを導入してコンテナのリソースを取りたいと思います。

cAdvisorインストール

コンテナの監視はcAdvisorというものが有名のようです。
公式に沿ってインストールします。監視用のコンテナを立てるだけ。

github.com

ホストごとにしか乗せられないようなのでswarmではなくstandaloneで立てます。
監視コンテナをreplicateして両機に乗せるのもなんか違うなと思い、エージェントみたいなものと思って各ホストに載せます。

1号機にインストール

masashi@lab-docker1:~$ docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
  gcr.io/cadvisor/cadvisor:latest
Unable to find image 'gcr.io/cadvisor/cadvisor:latest' locally
latest: Pulling from cadvisor/cadvisor
188c0c94c7c5: Pull complete
2d4828968d6c: Pull complete
b28a9b13dc6d: Pull complete
031224e6222c: Pull complete
Digest: sha256:ddadf3e2fd880deb4e0f3606d34a0d9da1165e3801116075d98a1901635dc9e8
Status: Downloaded newer image for gcr.io/cadvisor/cadvisor:latest
2da2ddf130766c730348403622b5cba70ac256348e65126a29c0b4488dda1349

コンテナが立ち上がりました。

masashi@lab-docker1:~$ docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS                             PORTS
                          NAMES
2da2ddf13076   gcr.io/cadvisor/cadvisor:latest   "/usr/bin/cadvisor -…"   19 seconds ago   Up 17 seconds (health: starting)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   cadvisor
4910b4db6c72   pihole/pihole:latest              "/s6-init"               6 minutes ago    Up 6 minutes (healthy)             53/udp, 53/tcp, 80/tcp, 67/udp              pi-hole_pihole.1.bnq31qeabtjyncogacmvy1qfj
0a1ecf78ca39   portainer/portainer-ce:2.18.2     "/portainer -H tcp:/…"   6 minutes ago    Up 6 minutes                       8000/tcp, 9000/tcp, 9443/tcp                portainer_portainer.1.f0rk74q8x7vsnl0ai64t7ileu
9352d9b0acd3   portainer/agent:2.18.2            "./agent"                6 minutes ago    Up 6 minutes
                          portainer_agent.i06s83zzw3xyfjpvp8fj4jybk.4ckbckqmlnwwfnbdvna2lunqe

cAdvisorへアクセス

8080ポートで上げたのでアクセスしてみます。

OK。画面見えてます。
コンテナ上げるだけでここまで見れちゃうのは便利すぎる。

2号機でも同じことやります。

prometheus.yml

prometheusが認識できるようにcAdvisor用のconfigを書きます。
2機あるので2つ記載。
インターバルはグローバルに合わせるべくコメントアウトしました。

  - job_name: "cadvisor1"
    # scrape_interval: 5s
    static_configs:
    - targets: ["10.0.1.1:8080"]

  - job_name: "cadvisor2"
    # scrape_interval: 5s
    static_configs:
    - targets: ["10.0.1.2:8080"]

prometheusを再起動してtargetの認識もOK。

Grafanaで取得

ここは前回と同じなので割愛します。
pfSenseとは別のdocker監視用のダッシュボードを作成。 とりあえずCPU、メモリ率、I/Oの情報など取ってみました。

psSenseの画面とあまり変わり映えしませんがいったんこんなもので。
CPUは使用率が上がらないので見えませんがメモリは一応コンテナの分も取得して少し見た目変化を付けました。

これで家の監視環境もひとまず完成です。 アラート系は何も設定していないのでしばらくは手動で監視を行います。
家の環境だから大量トラフィックは起きないのでピーク等が測れないのが残念。

Homelabにモニタリングサーバ導入3 prometheusで取った情報をGrafanaで見る

prometheusでリソース取れるようになったのでGrafanaでいい感じに可視化してみます。

リポジトリからもインストールできるようなのですが、ここを参考にパッケージをインストールしました。
(最初に発見したのがここだったので)

grafana.com

cloud利用などもできるようですが初めてなのでローカル環境へインストールします。

前提パッケージインストール

サイトに倣ってインストールします。
まずは前提となる依存パッケージのインストール。

masashi@lab-monitor1:~$ sudo apt-get install -y adduser libfontconfig1
...
adduser is already the newest version (3.118ubuntu5).
adduser set to manually installed.
libfontconfig1 is already the newest version (2.13.1-4.2ubuntu5).
libfontconfig1 set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 16 not upgraded.

Ubuntuサーバの標準インストールだと最初から入ってるみたい。

パッケージインストール

本体のパッケージをダウンロード。

masashi@lab-monitor1:~$ wget https://dl.grafana.com/oss/release/grafana_9.5.2_amd64.deb

そのままdpkgでインストールします。

masashi@lab-monitor1:~$ sudo dpkg -i grafana_9.5.2_amd64.deb
Selecting previously unselected package grafana.
(Reading database ... 129376 files and directories currently installed.)
Preparing to unpack grafana_9.5.2_amd64.deb ...
...
### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd
 sudo /bin/systemctl daemon-reload
 sudo /bin/systemctl enable grafana-server
### You can start grafana-server by executing
 sudo /bin/systemctl start grafana-server

開始等々のコマンドも出力されました。
スタートしてみます。

masashi@lab-monitor1:~$ sudo /bin/systemctl start grafana-server
masashi@lab-monitor1:~$ ps aux | grep gra
root          15  0.0  0.0      0     0 ?        S    May21   0:03 [migration/0]
root          21  0.0  0.0      0     0 ?        S    May21   0:07 [migration/1]
root         715  0.0  0.3 109748  3868 ?        Ssl  May21   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
grafana    38399 45.0 12.3 1402644 122816 ?      Ssl  06:31   0:03 /usr/share/grafana/bin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var/log/grafana cfg:default.paths.data=/var/lib/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins cfg:default.paths.provisioning=/etc/grafana/provisioning
masashi    38409  0.0  0.2   6608  2172 pts/1    S+   06:31   0:00 grep --color=auto gra

プロセスも上がりましたね。

masashi@lab-monitor1:~$ ss -lt
State        Recv-Q       Send-Q               Local Address:Port                 Peer Address:Port       Process
LISTEN       0            4096                 127.0.0.53%lo:domain                    0.0.0.0:*
LISTEN       0            128                        0.0.0.0:ssh                       0.0.0.0:*
LISTEN       0            4096                             *:3000                            *:*
LISTEN       0            4096                             *:9116                            *:*
LISTEN       0            4096                             *:9090                            *:*
LISTEN       0            128                           [::]:ssh                          [::]:*

アクセス用にポート調べませんでしたがListenの状態見ると3000番っぽいですね。

アクセス

無事にアクセス完了。画面が見えました。

パスワード登録してログイン

とりあえずデフォルトのadminユーザで入るとパスワード変更を促されます。

変更後、ログイン初期画面はこんな感じ。
(初回のスクショがとれていなかったので後付けの。いくつかcompleteになってます)

セットアップしていきます。
prometheusの監視対象がまだpfSenseしかいないのでまずはこの子用にセットアップします。

Data source

まずは取得対象のデータを選択します。 prometheusのフォーマット的があるのでこちらを選択。
とりあえずURLのみprometheusのものを設定しました。

Dashboard

ここで監視するデータのパネルを作っていきます。

prometheusと同じクエリが使えるので同じようにグラフ化できます。
意外と難しくないね。

最初のダッシュボードでCPU使用率を取得してみました。
グラフの下のペインにクエリを書く欄があります。

ダークな配色なのでprometheusと対照的なのもありかっこいいですね。

同じようにメモリ、In/Outインターフェースの使用率(量)を作成し、並べてみました。

これだけでもなかなかおしゃれに見えます。

桁合わせと判例を消してシンプルにするといい感じ。
職場で見るやつじゃん!

まとめ

Grafana等今どきの可視化ツールを使うのは初めてだったのですが、データ取得の構文はprometheusのものなので思った以上に簡単にデータ連携ができてしまいました。
デザイン等もカスタマイズ項目が多くてもっとオシャレにできそう。
取得データのクエリとか紹介しそびれましたが、コンテナ監視のタスクも残っていますので全部そろった後に改めて整理して紹介したいと思います。

次はDockerホストのデータ取得をしてみます。

Homelabにモニタリングサーバ導入2 prometheusからpfSenseリソース取得

前回pfSenseのリソースを取得するべくprometheusのsnmp exporterを使ってみたのですが、CPU・メモリ系の取得ができないのでこちらでの取得は諦めることにしました。
snmp.ymlにCPU、メモリのOIDを直書きしたのですがmetricsに表示されなかったのでいったん諦めです。

他の方法を探してたらprometheus用にnode exporterの機能があったのでこっちでいいじゃんと思ってこちらを試してみます。

coldnorthadmin.com

パッケージインストール

管理画面からnode expoterをインストールします。
(画面はインストール済み)

有効可

インストールしたものの画面からは有効可できなかったのでshellから行います。

[2.6.0-RELEASE][admin@pfSense1.home.arpa]/root: service node_exporter onestart

[2.6.0-RELEASE][admin@pfSense1.home.arpa]/root: ps aux | grep node
nobody  51211   0.0  1.3 726500 12352  -  I    15:49       0:00.01 /usr/local/bin/node_exporter --web.listen-address=:9
root    73721   0.0  0.0    536   348  0  R+   15:50       0:00.00 grep node

プロセス動いてます。

metricsもOK。見えてます。

prometheusから監視

node exporterの連携もできました。

snmpの時と同様に取得するパラメータを入力してみます。

CPUとメモリを取ってみました。(rateで5分間隔)

  • process_cpu_seconds_total
  • node_memory_active_bytes

OK!

もう少し詳しいパラメータを書いてみます。

  • process_cpu_seconds_total{mode!="idle"}
    • idle状態以外のCPU使用率を取得
  • node_memory_active_bytes + node_memory_inactive_bytes

色分けされた。いいですね。

まとめ

なんとかCPU、メモリ系取得の目途がつきました。
prometheusで便利に取得できるのはいいのですが、可視性がそんなによろしくないという記事がたくさん出ていますので私も流行りに習って可視ツールを入れていたいと思います。
prometheusはダッシュボードも保存とかできなさそう。ほかのツール連携ありきなのか、クエリ込みURL管理とかやるのでしょうか。

とにかく次はGrafanaに挑戦です。

Homelabにモニタリングサーバ導入1 prometheusデプロイ

Homelabが動き出して2週間ほどですがそろそろ監視系のサーバも欲しくなってきました。 でもこれはHomelab。欲しかったら作れます。

構成

監視サーバもswarm内に立ててもいいですが、切り分けもしやすいしまずは単体のゲスト作成でやってみます。
構成はこんな感じでコンテナ環境とpfsenseのリソース監視をやります。

監視ツール

仕事では監視の設定は別部隊がいるので実はがっつりやったことありません。 なのでほぼ1からですから有名なもので作ってみたいと思います。

2、3年前から存在を知ったprometheusを作ってみます。
エージェントレスなのが試しやすくていいですね。

prometheus.io

dockerのリソースはcAdvisorで取れることは検証環境で確認済みなので今回はまずpfsenseのリソース取得をします。
デフォルトはsnmpの機能は無くモジュールのsnmp exporterというのを導入すれば取れるみたい。

監視サーバ用OSデプロイ

ovaとってあったubuntuvirtualboxにimport。
割愛。

prometheusインストール

ダウンロードしたファイル内のバイナリを実行すればとりあえず使えるようです。

masashi@lab-monitor1:~$ wget https://github.com/prometheus/prometheus/releases/download/v2.37.8/prometheus-2.37.8.linux-amd64.tar.gztar xfvz prometheus-2.37.8.linux-amd64.tar.gz
masashi@lab-monitor1:~$ cd prometheus-2.37.8.linux-amd64/
masashi@lab-monitor1:~$ ./prometheus

9090ポートで接続。

とりあえず簡単にデプロイ完了。

exporterインストール

こちらはgit clone。

masashi@lab-monitor1:~$ git clone https://github.com/prometheus/snmp_exporter.git
masashi@lab-monitor1:~$ cd snmp_exporter/
masashi@lab-monitor1:~/snmp_exporter$ ls
CHANGELOG.md        config           Dockerfile  go.mod   main.go         Makefile.common  SECURITY.md  testdata
CODE_OF_CONDUCT.md  config_test.go   examples    go.sum   MAINTAINERS.md  NOTICE           snmp-mixin   VERSION
collector           CONTRIBUTING.md  generator   LICENSE  Makefile        README.md        snmp.yml

pfsense用のmibを取り込んで設定ファイルに書く必要があります。
ここでgeneratorの出番。

masashi@lab-monitor1:~/snmp_exporter$ cd generator/
masashi@lab-monitor1:~/snmp_exporter/generator$ ls
config.go   Dockerfile-local  generator      generator.yml.org  Makefile  net_snmp.go  snmp.yml  tree_test.go
Dockerfile  FORMAT.md         generator.yml  main.go            mibs      README.md    tree.go

mibファイルを作ります。

masashi@lab-monitor1:~/snmp_exporter$ make generator mibs

メジャーどこのmibをgenerateしたらpfsenseのmibをコピー。

masashi@lab-monitor1:~/snmp_exporter/generator/mibs$ scp admin@192.168.0.101:/usr/share/snmp/mibs/* .

generator.ymlに取りたい情報を書いて設定ファイルを作ります。
サンプルでこんな感じで追記。

masashi@lab-monitor1:~/snmp_exporter/generator$ tail generator.yml
        # pfSense

  pfsense:
    walk:
      - ifEntry
      - pfStatus
      - pfStateTable
      - pfInterfaces
    auth:
      community: public

OS上ではgeneratorがmake出来なかったのでOS内でdockerコンテナ(standalone)を立ち上げでsnmp.yml書き出し。

masashi@lab-monitor1:~/snmp_exporter$ sudo docker build -t snmp-generator .
masashi@lab-monitor1:~/snmp_exporter$ sudo docker run --rm -ti   -v "${PWD}:/opt/"   snmp-generator generate
masashi@lab-monitor1:~/snmp_exporter/generator$ grep -A10 pfsense snmp.yml
pfsense:
  walk:
  - 1.3.6.1.2.1.2.2.1
  - 1.3.6.1.4.1.12325.1.200.1.1
  - 1.3.6.1.4.1.12325.1.200.1.3
  - 1.3.6.1.4.1.12325.1.200.1.8
  metrics:
  - name: ifIndex
    oid: 1.3.6.1.2.1.2.2.1.1
    type: gauge
    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1

こう言うツール系でもコンテナは役立ちますね。

exporterアクセス

exporterの実行ファイルは別のようで違うリンクから落とします。 これもバイナリを実行するだけ。

masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ wget https://github.com/prometheus/snmp_exporter/releases/download/v0.21.0/snmp_exporter-0.21.0.linux-amd64.tar.gz
masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ tar xfvz snmp_exporter-0.21.0.linux-amd64.tar.gz
masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ cd snmp_exporter-0.21.0.linux-amd64/
masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ ./snmp_exporter
ts=2023-05-21T07:44:25.499Z caller=main.go:148 level=info msg="Starting snmp_exporter" version="(version=0.21.0, branch=HEAD, revision=0d8c3527cac0c26f1d6005b84b74413d14264c37)"
...

9116ポートでアクセス。

pfsenseのmibが取れるようになりました。

exporterのデーモン化

prometheusがexporterにアクセスして情報を取ってくるようです。
systemdで起動できるようにserviceファイルを作成。

masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ cat /etc/systemd/system/sshd.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

デーモンとして起動。
読み込むファイル系もコピーしておきます。

masashi@lab-monitor1:~$ sudo cp -R snmp_exporter-0.21.0.linux-amd64 /home/prometheus/snmp_exporter
masashi@lab-monitor1:~$ sudo cp /etc/snmp_exporter/snmp.yml /home/prometheus/snmp_exporter/
masashi@lab-monitor1:~$
masashi@lab-monitor1:~$ systemctl status snmp_exporter
○ snmp_exporter.service - SNMP Exporter
     Loaded: loaded (/etc/systemd/system/snmp_exporter.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
masashi@lab-monitor1:~$ sudo systemctl start snmp_exporter

prometheusの設定

ymlファイルにsnmp exporterの設定を追加して読み込めるようにします。

masashi@lab-monitor1:~/prometheus-2.37.8.linux-amd64$ grep pfsense -A10 prometheus.yml
  - job_name: "snmp_pfsense"
    static_configs:
      - targets:
        - "10.0.1.254"
    metrics_path: "/snmp"
    params:
      module: [pfsense]
    scrape_interval: 10s
    scrape_timeout: 5s
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.1.3:9116

prometheus起動

これでsnmp exporter経由でprometheusでsnmpのリソースが取れるようになりました。 再度prometheusを起動して仮のパラメータを入れてみます。

サンプルを打ち込んでみましょう。

OK!取れてます。

あと取得パラメータをチューニングすれば完成です。
追加で色々入れないといけないかもしれませんが、
cpu、memory、interface使用率、セッション数辺りは取りたいですね。

といあえず今回はここまで。

参考サイト

Brendon Matheson - A Step-by-Step Guide to Connecting Prometheus to pfSense via SNMP

Prometheus SNMP Exporter導入メモ - suueiの備忘録

homelabにdokuwikiのデータを移植する

LXDで動かしていたサーバ群をdocker環境に移し替えているのですが今回はdokuwikiを移植しました。
dokuwikiディレクトリを抜いてコピればデータリストアは完了なのでお手軽さも相まって気に入ってます。

公式のイメージはなかったのですが自作もなんだしbitnamiのコンテナがあったのでこれを使います。

コンテナデプロイ

docker hubを参考にcomposeファイルを落としてきてカスタマイズします。

hub.docker.com

443番は落として82番で上げることにしました。

masashi@lab-docker1:~/dokuwiki$ cat docker-compose.yml
version: '3.3'
services:
  dokuwiki:
    image: docker.io/bitnami/dokuwiki:20230404
    ports:
      - '82:8080'
      # - '443:8443'
    volumes:
      - 'dokuwiki_data:/bitnami/dokuwiki'
volumes:
  dokuwiki_data:
    driver: local

swarmで動かそうとしたらエラーを吐いたのでバージョンを3に上げてます。

masashi@lab-docker1:~/dokuwiki$ docker stack deploy -c docker-compose.yml dokuwiki
unsupported Compose file version: 2
masashi@lab-docker1:~/dokuwiki$ docker stack deploy -c docker-compose.yml dokuwiki
Creating network dokuwiki_default
Creating service dokuwiki_dokuwiki

立ち上がりました。

masashi@lab-docker1:~/dokuwiki$ docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE                           PORTS
mkssjuq5nwyw   dokuwiki_dokuwiki     replicated   1/1        bitnami/dokuwiki:20230404       *:82->8080/tcp
plup1b33qmjy   firefly_app           replicated   1/1        fireflyiii/core:latest          *:80->8080/tcp
u0009w7ryo30   firefly_db            replicated   1/1        mariadb:latest
luna6ms9v7bi   pi-hole_pihole        replicated   1/1        pihole/pihole:latest            *:53->53/tcp, *:81->80/tcp, *:53->53/udp
fyijaxnx2903   portainer_agent       global       2/2        portainer/agent:2.18.2
ddrxmnjz9is4   portainer_portainer   replicated   1/1        portainer/portainer-ce:2.18.2   *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp
masashi@lab-docker1:~/dokuwiki$ docker service ps dokuwiki_dokuwiki
ID             NAME                  IMAGE                       NODE          DESIRED STATE   CURRENT STATE           ERROR     PORTS
o9eru7ihz52d   dokuwiki_dokuwiki.1   bitnami/dokuwiki:20230404   lab-docker2   Running         Running 2 minutes ago

docker系のプロセスもOKですね。
画面も見えてます。

データ移植

データコピーはswarmのmanagerノードからは出来ないようなのでコンテナが稼働しているサーバ直でコピーします。
scpでデータは転送済み。
markdown記法のプラグインも使っていたのでこれも入れます。

masashi@lab-docker2:~/dokuwiki$ ls
data.tar  dokuwiki-plugin-markdowku-master.tar

展開してコピー。

masashi@lab-docker2:~/dokuwiki$ docker cp dokuwiki-plugin-markdowku-master e3e30bcac2a3:/bitnami/dokuwiki/lib/plugins/markdowku
Successfully copied 65kB to e3e30bcac2a3:/bitnami/dokuwiki/lib/plugins/markdowku
masashi@lab-docker2:~/dokuwiki$ docker cp data e3e30bcac2a3:/bitnami/dokuwiki/
Successfully copied 5.37MB to e3e30bcac2a3:/bitnami/dokuwiki/

コピーOKです。
アクセスすると…

あら、なんかエラーが出てます。 アクセスかwrite出来ないよって言ってる。

転送元のパーミッションを見ます。

masashi@lab-docker2:~/dokuwiki$ ls -l data
total 100
drwxrwxr-x  2 masashi masashi  4096 Jan 27 05:53 attic
drwxrwxr-x 18 masashi masashi  4096 Jan  5 14:36 cache
drwxrwxr-x 12 masashi masashi  4096 Feb  6  2021 data
...

その他ユーザのwriteがないと動かないのか。

masashi@lab-docker2:~/dokuwiki$ sudo chmod -R 777 data
masashi@lab-docker2:~/dokuwiki$ ls -l data
total 100
drwxrwxrwx  2 masashi masashi  4096 Jan 27 05:53 attic
drwxrwxrwx 18 masashi masashi  4096 Jan  5 14:36 cache
drwxrwxrwx 12 masashi masashi  4096 Feb  6  2021 data
...

再度データコピー。
プラグインディレクトリ名変更してます。

(この間に切り分けで数回コンテナを作り直してます)

masashi@lab-docker2:~/dokuwiki$ docker cp markdowku 9f916b88135b:/bitnami/dokuwiki/lib/plugins/
Successfully copied 65kB to 9f916b88135b:/bitnami/dokuwiki/lib/plugins/
masashi@lab-docker2:~/dokuwiki$ docker cp data 9f916b88135b:/bitnami/dokuwiki/
Successfully copied 5.37MB to 9f916b88135b:/bitnami/dokuwiki/

アクセス。

OKですね。移植完了です。
markdownプラグインはリアルタイムでは反映されなくて一回編集を挟まないと反映しないようです。

レイアウトも直ってOK!

labは外からもアクセスできるので見放題、更新し放題です。
もっとページ増やしたいですね。

まとめ

今回の作業ですが、
labのdocker swarm環境は一応本番扱いにしているので別筐体のdockerスタンドアロン環境で検証してました。
その時はデータコピーした後一発で表示できたのでlabへのデプロイもすんなりいくと思ったらパーミッション問題でこけて少し時間食ってしまいました。
docker環境の違いなのかどうかが分からず切り分けに時間がかかりました。

またbitnamiのコンテナはrootユーザが無効になっているので中に入っての切り分けができずこちらも苦労しました。
(コンテナのセキュリティとしてはこの姿があるべきの様ですが)
ホスト側で何とかして切り分けるという経験ができたのは良かったです。 記事に書き起こしたらなんてことなく、見たらすぐわかるじゃんwとなるかもしれませんが作業中はなんで動かないんだ…となってました。

検証機からlabへデータファイルをscp(オプションなし)したときにパーミッションが変わってしまったっぽい。
まずは環境は同じにしとかないと不要な切り分けポイントが出来てしまいますね。(仕事ではちゃんとやってるのに)