SNMPPython + AgentX + systemd + Raspberry Piを介しおセンサヌの枬定倀を読み取り、別のモニタヌを䜜成したした

みなさんこんにちは。



画像



叙情的な䜙談
説明したオブゞェクトを完成させる時間がなかったため、この蚘事は数週間ドラフトにありたした。 しかし、私が圌らの蚘事で蚀いたかったこずの半分をすでにカバヌしおいる同志たちの猛攻撃の䞋で、私は「早くリリヌスし、早くリリヌスし、がらくたをリリヌスする」ずいう原則に埓い、内容を公開するこずにしたした。 さらに、開発は80完了しおいたす。


「Universal Control Unitを最倧限に掻甚する」ずいう蚘事が公開されおから、倚くの時間が経過したした正確には1幎以䞊。 このデバむス甚の通垞の゜フトりェアスタッフィングを䜜成するのに十分ではありたせんが、十分ではありたせん。 結局のずころ、それは矎しさのためではなく、センサヌからデヌタを収集し、このデヌタが監芖システム私の堎合はZabbixに衚瀺されるこずを確認する必芁がありたす



パヌト1-゜フトりェア



過去に、゜フトりェアの充填から以䞋が実装されたした。





ntpdずgpsdに別々のモニタヌを䜜成する詊みがありたした。 zabbixがこのデヌタを読み取れるようにしながら、構成を読み取り、構成に埓っおさたざたな゜ヌスからデヌタ収集プロセスを開始し、これらのプロセスからデヌタを収集し、画面に読み取り倀を衚瀺できるはずのスヌパヌモニタヌに倚くの時間が費やされたした。 実際、蚭定を読み取っお必芁なプロセスを生成するプロセスマネヌゞャヌを実装するこずが刀明し、非垞にクヌルであるこずが刀明した画面䞊の描画は、蚭定からレむアりトを読み取り、タむマヌによっお画面の内容を倉曎する方法さえ知っおおり、その時点でプロセスからデヌタを収集したす必芁です。 このスヌパヌモニタヌには、デヌタを収集する実際のプロセスだけがありたす。 さらに、ボタンに機胜を割り圓おるための信号システムを䜜成したり、さたざたなデヌタ゜ヌスの優先順䜍を考慮したりするなどのアむデアがありたしたが、すべおが私の自由時間に出おきたため、このスヌパヌモニタヌは非垞に肥倧化しお巚倧なものになりたした。



しばらくの間、本栌的な゜フトりェア充填の開発で埗点したした。 Nenuacho、スクリプトは動䜜し、ルヌルは「動䜜する-觊れないでください」ず圌らが蚀うように、管理者の聖なるルヌルです。 しかし、それは䞍運です-監芖したいほど、より倚くのスクリプトを蚘述し、zabbixのSELinuxに远加する必芁がある私はraspiを監芖しおいるだけではありたせんこれは理解できたす。 私は本圓にzabbiksのSELinuxを完党に無効にしたくはありたせんでした。 したがっお、私は考えなければなりたせんでした。



そしお、監芖システムにデヌタを収集する方法を理解したしょう。





私はプルの監芖を䜿甚しおいたすが、宗教的な理由ではなく、たたたた行われたした。 実際、特に軜い負荷では、プッシュずプルの間に倧きな違いはありたせん以前の䜜品の1぀では、Nagios + NSCAを行いたしたが、倧きな違いに気づかなかったので、ただ手で芁玠を䜜成する必芁がありたす。 すでにプッシュモニタリングを行っおいる堎合はzabbix_senderを䜿甚できたすが、そこに存圚せず、詊甚版もありたせん。たた、互いに干枉するのは面倒です。 しかし、どのプロトコルを監芖するかずいう問題では、遞択肢は倧きいように芋えたすが、そうではありたせん。怜出ぱヌゞェントたたはSNMPを介しおのみサポヌトされ、2぀のオプションしか残されおいたせん。 説明されおいるSELinuxの問題により、゚ヌゞェントが衚瀺されなくなりたす。 出来䞊がり、SNMPによるプルモニタリングがただありたす。



ほら なぜ也杯ですか Linuxでは、snmpdがあるように芋えたすが、どうすれば必芁なものを返すこずができたすが、snmpdは䜕を知らないのですか snmpdには、任意のOIDによっお任意のデヌタを提䟛するための3぀の根本的に異なる方法がありたす。





私はPythonで曞いおいるので、だれかがすでにagentxプロトコルを実装しおいるかどうかを探しに行きたした。 そしお、結局のずころ、 https://github.com/rayed/pyagentxずhttps://github.com/pief/python-netsnmpagentずいう玠晎らしい人々がいたした。 2番目のプロゞェクトはより掻気があるように芋えたすが、最初のプロゞェクトはよりシンプルに芋えたす。 私は最初のものpyagentxから始めたした。それは動䜜し、必芁なこずはすべお行いたす。 しかし、このラむブラリにデヌタを転送する方法に぀いお考え始めたずき、2番目のパッケヌゞpython-netsnmpagentを扱いたいず思いたした。 pyagentxの問題は、曞き蟌み方法であり、呌び出し関数からデヌタを受信できないため、新しいデヌタの芁求はsnmpdに曎新を送信する関数で盎接発生する必芁があるこずです。これは垞に䟿利で垞に可胜ずは限りたせん。 もちろん、独自の䜕かを再構築しお機胜を再定矩するこずもできたしたが、実際にはクラスをほが完党に曞き換える必芁がありたすが、これもやりたくありたせんでした-私たちは膝の䞊で開発しおいたす。すべおがシンプルで迅速でなければなりたせん。 ただし、python-netsnmpagentを凊理するこずに抵抗はありたすが、pyagentxからアップデヌタヌにデヌタを転送する方法を芋぀けたしたが、それに぀いおは以䞋で詳しく説明したす。



次の質問は-アヌキテクチャはどのように芋えたすか デヌタ゜ヌスをフォヌクし、そこからデヌタを読み取るディスパッチャヌを䜜成しようずする詊みは既に完了しおおり、あたりうたく終了しなかったため䞊蚘を参照、ディスパッチャヌの実装を攟棄するこずになりたした。 それで、どこかでsystemdに぀いおの蚘事を芋たか、それずもより密接に察凊したいずいう叀い欲求をもう䞀床くすぐったので、ディスパッチャをシステム化するこずにしたした。 嫌いは嫌いだし、箱から出しおすぐにそれがすでにラスピにあるかどうかを私たちは理解したす。



私が芋぀けたsystemdの䟿利な機胜は䜕ですか





これらの調査結果を念頭に眮いお、アヌキテクチャが描かれたした。





非垞に悪い堎所の1぀は、コレクタヌストリヌムずagentxストリヌムの間の共有内郚状態です。 しかし、Pythonには2぀のスレッド間の同期の問題を解決する魔法のGILがあるため、私はこれを蚱したした。 もちろん、これは非垞に悪いこずであり、本によるずそうではありたせん。 共有状態を別のプロセスに移動し、agentxプロセスずコレクタヌプロセスを゜ケットを介しお状態プロセスで動䜜させるずいうアむデアがありたしたが、別の゜ケットを䜜成し、別のナニットを䜜成したい、などです。



このタスクに関連しお Python で IPCが奜きではなかった理由





dbusはすべおのトラブルの解決策のように芋え、systemdが存圚するずころならどこにでも存圚したすが、問題はpydbusがAPIを公開するためにGLib> = 2.46を必芁ずし、raspbianでは2.42のみであるずいうこずです。 dbus-pythonは非掚奚であり、サポヌトされおいたせん。 芁するに、ロバの雄鶏がロバに刺されるたで、私は安党でない方法で状態を共有したす。



汚い目的でSNMPを䜿甚する堎合、別の問題がありたすが、デヌタセットにOIDを遞択する方法はありたすか これを行うために、゚ンタヌプラむズず呌ばれるプラむベヌトの特別なブランチがありたす-.1.3.6.1.4.1。<enterprise_id>。 IANAから䞀意の゚ンタヌプラむズIDを取埗できたす。 OIDスキヌムが定矩されおいる堎合、MIBを蚘述しお、どこで、䜕を、そしおシステムを監芖しやすくするのを忘れないようにしおください。 MIBを曞くこずぞの玹介はここにありたす 。



ある時点で、察応するMIBでntpsnmpdを発芋し、bげた頭たで喜んでいたしたが、この奇跡をコンパむルしたずき、筆者はいく぀かのトップレベルの定数を実装するだけで、蒞気が足りないこずがわかりたした。 コヌドを少し掘り䞋げお最埌たで掘り䞋げたしたが、䜜成者がntpdたたはntpqず巧劙に察話しお、出力を気にせずにこれらの定数を匕き出す方法を理解しおいたせんでした。 私は確かに1぀のこずを理解したした-既補のPython APIはありたせん。぀たり、キャッチするものは䜕もないこずを意味し、このMIBを自分で実装する必芁がありたす。



憎しみの5分
いいえ、たあ、真実は、誰もAPIなしでntpd、smartctl、lm_sensorsおよび他のナヌティリティの類䌌物をこれらすべおの幎の間曞いおいたせんか 誰もSNMP゚ヌゞェントをそれらにねじ蟌みたせんでしたか そのような類䌌物、あなたがテキスト出力を解析する必芁がないように いいえ、Unixwayなどを理解しおいたすが、そうではありたせん。 たあ、マシンで読み取り可胜な圢匏でデヌタを出力するこずは可胜でしょうが、いや、すべおは人だけのものです。 そしお、むンタヌネットロシア語ず倖囜語での叫びから刀断するず、私だけが䞍幞なわけではありたせん。 たあ、lm_sensorsが蚱されるずしたしょう。なぜなら、同じデヌタを機械可読圢匏でsysfsから差し匕くこずができるからです。



䞀般に、この蚭蚈党䜓が機胜し、非垞に粘り匷いです。 ディスカバリヌはzabbixで機胜し、アむテムが䜜成され、グラフィックが描画され、トリガヌがアラヌトを送信したす。幞犏に必芁なものは他にありたすか コヌドはただ完成しおいないので、公開したせん。



パヌト2-ハヌドりェア



ナニットケヌスを台無しにするこずは垞に可胜ずいうわけではありたせんが、壁に錻氎が垂れおいるような気もしたせん。 非垞に゚レガントな゜リュヌション-DINレヌルがありたす。 レヌル付きの構造物の山は垂堎で販売されおおり、ラックマりント電源私はMeanWell DR-15-5を䜿甚、およびあらゆる皮類の自動機を眮くこずができたす。 したがっお、私はraspi甚のDINレヌル䞊のケヌスが欲しかった。 これら2人の同志は候補者ず芋なされたした-ItaltronicずRasPiBoxのモデル。 RasPiBoxの利点は、プロトタむピングボヌドが既にあり、ネゞ接点GPIOのスタビラむザヌを介しおから電力が䟛絊されるこずです。これは䟿利ですが、安党ではない堎合がありたす。 しかし、3倍以䞊の費甚がかかり、レヌル䞊のスペヌスをより倚く占有し、透明な窓がありたせん。 Italtronicモデルも理想的ではありたせん-その幅は、既補の16x2 LCDスクリヌンがすべおその幅に収たらないようなものです。぀たり、透明なりィンドりの䟡倀は急激に䜎䞋したすが、䜎䟡栌でこの欠点を蚱す準備ができおいたした。



ケヌスは非垞に䟿利であるこずが刀明し、2枚のプリント回路基板たたは䜕かのシヌトを取り付けるためのスペヌスがありたす。 非導電性のESD保護フィルム、ドレメル付きののこぎりに包たれたアクリルから基板を䜜成したす。







内郚のボヌドは、摩擊力ず䞡偎の小さな棚でのみ保持されたす。぀たり、内郚に堅固な固定はありたせん。 芋かけのサむズにもかかわらず、ケヌスは小さく、特にボヌドを䞋のレベルに挿入する堎合は、raspi自䜓の䞊にあたりスペヌスが残りたせん。 たた、耇数のLEDずRTC付きのボヌドを配眮する必芁があるため、ボヌドが必芁です。



ケヌス写真














枩床および湿床センサヌを新しいモニタヌに接続したい。 枩床に぀いおは、ds18b20を遞択したすが、動䜜したすが、読み取り倀を信頌できる枩床蚈ず比范する䟡倀があり、センサヌは仕様に応じお0.5床の䜍眮にありたす。 補正するために、構成内の定数の読み取り倀の基本的な修正を远加し、そのような枩床蚈でチェックしたした







私のds18b20むンスタンスは自分自身に嘘を぀かないこずが刀明したした。 しかし、次のセンサヌはちょうど暪たわっおおり、最倧0.6床です。 ただし、これもむンスタンスに䟝存したす。1぀は嘘を぀き、もう1぀はほずんど嘘を぀きたせんでした。



湿床があるず、それほど単玔ではありたせんでした。 安䟡であるか、raspiでた​​ったく機胜しないアナログであるため、ラむブラリがないすぐに䜿いたい、たたは航空ケヌブルのように高䟡です。 利䟿性ずヒキガ゚ルの劥協点がAdafruit BME280センサヌで芋぀かりたした。これは、ボヌナスずしお枩床も衚瀺したすただし、䞊蚘のように嘘を぀くこずもありたす。



ds18b20を単玔に熱収瞮で包んで喜ぶこずができる堎合、BME280ではこのような焊点は機胜したせん。 ケヌスに぀いおは倚くのアむデアがありたした-そのたたにしお、ワむダヌをはんだ付けしお接着剀ノズルで埋めたすすでに固定甚の耳があり、刀明しおいたす、コンポヌネントの基板ず同じアクリルからミニケヌスを䜜成し、 3Dプリンタヌ、手元にあるので...しかし、その埌、私は卵に぀いお思い出したした







これは理想的なケヌスです。 センサヌ甚の十分なスペヌスがあり、コネクタを配眮したり、メンテナンスのために䟿利にアクセスしたり、どこにでもぶら䞋げたり、どこかに投げたりするこずができたす。



DB9を介しおraspiにセンサヌを接続するこずにしたした。 USBラむンはほずんどなく、RJ45゜ケットは寞法に適合したせん。 切断されたUSBケヌブルの残骞がキャビネットで芋぀かったため、卵センサヌをUSB経由で接続するこずにしたした。







raspiのGPIOコヌムを保護し、ケヌスを分解するために、別のコヌムを取り出しおはんだ付けしたした。 櫛は角床があり、垂盎方向のスペヌスが少し増えたしたが、少し蚈算しなかったため、この櫛はLEDの抵抗噚に埋もれおいたした。 もちろん、すべおが熱収瞮でしっかりず包たれおいたすが、将来的に芚えおおく䟡倀のある瞬間です。 その結果、ケヌスの半分を分離しお、たずえばrtcたたはraspi自䜓のバッテリヌを亀換するこずができたす。 他のすべおより正確には、フラッシュドラむブは、ケヌスを開かずに亀換できたす。



半分の準備ず準備の写真












1぀の掚奚事項-ボタンを保存しないでください。 私はそれを保存したので、ボタンはがたがた音を立おるだけでなくRPi.GPIOラむブラリはがた぀きに察する保護を提䟛したす、非垞に特定の䜍眮でのみ機胜したす。 電源をオフにする必芁がある堎合に備えお、プログラムでデバむスをオフにするボタンを提䟛したしたUSBフラッシュドラむブでFSをずさんなシャットダりンで䜕床か匷制終了したしたが、提䟛するものがあたりないこずがわかりたした-たた、ドキュメントを読む必芁がありたした。 あなたが私のようにドキュメントを読んでいない堎合、知っおいる-オヌバヌレむgpio_shutdownはあなたが期埅するかもしれないものではなく、切断されたずきにいく぀かのピンで高/䜎レベルを公開するだけなので、䟋えば倖郚電源が切れる可胜性がありたす。 ボタンでraspiを無効にするには、カヌネルモゞュヌルrpi_power_switch ただし、コンパむルする必芁がありたすが、これにはカヌネルヘッダヌが必芁ですたたはカスタムデヌモンAdafruit-GPIO-Haltがありたす。 私は自分のhostdを持っおいお、LEDを点滅させたすが、同時にボタンに応答したす。



おわりに



その結果、監芖甚のハヌドりェアず゜フトりェアの耇合䜓が拡匵可胜になり、珟圚の技術を䜿甚しお、障害に匷いようになりたした。 ゜フトりェアの䞀郚は、他の郚分ずは独立しお曎新および再起動できたすsystemdのおかげで、開発者ずしおの私からの努力は必芁ありたせんでした。 そしお最も重芁なのは、プロセスず結果から倚くの喜びを埗るこずでした。 さお、新しい知識の小さなカヌトが远加されたした。



読んでくれおありがずう



All Articles