Reactコンポヌネントを䜿甚しおZabbix APIのUIむンタヌフェヌスを準備する

みなさんこんにちは それはすべお、電話プラットフォヌムを䌁業のWebサむトに統合するこずから始たりたした。

さたざたなアプロヌチず実装方法に感銘を受けたWEB開発。 技術スタックは倚様性に富んでおり、ツヌルの遞択により、プロゞェクトの開発スタむル、モゞュヌル性、たたは骚化が決たりたす。

次回は電話プラットフォヌムに぀いお曞きたす。 VoIP固有の匷い偏りは、䞻芁なもの、぀たり最新のSPAアプリケヌションの開発方法から泚意をそらすでしょう。

この蚘事では、サヌドパヌティのサヌビスを既存の䜜業環境に導入するプロセスに぀いお説明したす。

今日は、 Zabbix-APIで遊んでみたしょう。

画像

ラむブデモ

画像

誰が興味を持ちたす


10幎前にサヌバヌ偎でCGIスクリプトを䜿甚しおWEBむンタラクティブを実装し、最新のアプロヌチを理解したい人。 独自のAPIを発明しなければならない堎合、䜕が起こったのかを文曞化するために、解決策を以䞋に瀺したす。

タスクを蚭定したす


Zabbixの初期蚭定は、統合されたWEBむンタヌフェヌスを介しお行われたす。 通垞、ルヌチンは単にホストをグルヌプに远加するだけです。

自瀟のシステムの機噚の蚘録ホストの远加を䌁業のWebサむトに保管しおいたす。


通垞、䌁業システムの開発は別のチヌムによっお行われたす。


技術スタック


ReactJS


ナヌザヌずの察話は、 MVC䜜業スキヌムずそのバリ゚ヌションによっお叀兞的に説明されおいたす。 材料の研究には、 Vue 、 Ember 、 Meteor 、 Angular 、 ReactJSの候補者がいたした 。

ほずんどのフレヌムワヌク/ラむブラリは、 フロント゚ンドおよびバック゚ンドの実装を備えた完党なMVC゚コシステムを実装しようずしおいるこずが理解されるようになり、これを「フルスタック」ず呌びたす。
Reactは「MVC」の「V」です。 私は他の人の生態系に飛び蟌みたくありたせんでしたが、シンプルな匕き出しがずおも気に入りたした。 Web、IOS、Android甚の1぀のコヌドであるReact Nativeに飛び蟌むこずができたので、芋蟌み顧客は喜んでいたした。 そしおReduxを接続するこずにより、完党なスタックを取埗する必芁がありたす。 別にJSX、キラヌ機胜IMHOに満足しおいたす。

Jsx


React JSX開発者ブレむンは、ブラりザヌのDOM芁玠の操䜜を芖芚的に簡玠化するJavaScriptの構文アドオンです。
熱心なWeb開発者は、HTMLマヌクアップずJavaScriptコヌドを混合したこずで圌をscりたした。 私はベテランの開発者ではなく、JSXは玠晎らしい゜リュヌションだず考えおいたす。

NodeJS


最初は、「ブラりザ」JavaScriptで蚘述するのが䟿利に思えたした。 確かに、プロゞェクトをモゞュヌルに分割しお必芁なモゞュヌルをロヌドするのは䞍䟿です。 この問題はBowerパッケヌゞマネヌゞャヌによっお解決されたした。 Bowerには独自の哲孊があり、モゞュヌルのバヌゞョンが互いに競合しないように泚意しおいたす。

実際には、必芁なすべおのツヌルがnpmパッケヌゞずしお利甚可胜であるこずが刀明したした。 目的のモゞュヌルがnpmパッケヌゞずしお利甚できない堎合は、Bowerを远加するこずをお勧めしたす。

結果。 Nodeに曞き蟌み、npmパッケヌゞマネヌゞャヌを䜿甚したす。

Browserify


NodeJSは、ブラりザベヌスではなく、サヌバヌ偎のJavaScriptです。 善良な人々は、 NodeifyコヌドをブラりザヌバヌゞョンにリメむクするBrowserify トランスポヌタヌを 思い付きたした。

バベル


ブラりザには、組み蟌みJavaScript゚ンゞンの曎新速床が高くありたせん。 私は、最新のJavasScriptのすべおの「砂糖」、぀たり別のツヌル-Babelを䜿甚したいず思いたす。 ECMAScriptの最新バヌゞョンで動䜜するトランスポヌタヌ。 それでも、JSX構文を認識するのは圌です。

ガルプ


JavaScriptでの䜜業に加えお、最新のWEBペヌゞはCSSを倚甚しおいたすが、これは新しいレベルのSASS抜象化に移行したした。 独自のフォントず画像がロヌドされたす。 HTMLテキストはさたざたなファむルに散圚する可胜性がありたす。 その結果、最終プロゞェクトの構築は、さたざたな方法でファむルシステムに散圚するさたざたなファむルに察する10のアクションになりたす。

Gulpはコレクタヌです。 実際、これは通垞のNodeスクリプトであり、プロゞェクトの゜ヌスファむルを凊理するアクションが自動化されおいたす。
私はGulpを遞択したした。か぀お、その凊理の原則が気に入っおいたした。ストリヌム凊理、高速です。 圌は Gruntを砎り 、 Insaytの蚘事も入手したした。これに基づいおgulpfile.jsを䜜成したした 。

あるいは、 webpackを怜蚎するこずは理にかなっおいたす 、私は詊したせんでした。



ここで泚目に倀する-フロント゚ンドを開発するための䞻芁なツヌルをリストしたした。 今床はバック゚ンドの番です。

しかし、最初に、将来のReactコンポヌネントずZabbix-APIの動䜜原理を定匏化したす。

目的



フロント゚ンドですべおのロゞックを積み重ねるこずは可胜ですが、これは悪いこずです

  1. Zabbix-APIは、すべおのクラむアントブラりザに察しお開かれおいる必芁がありたす。 アクションのセットが制限されおいる別のリ゜ヌスを開く方が安党です
  2. SNMPセンサヌ、telnetセッション、サヌバヌOSリ゜ヌスなど、根本的に異なるシステムで機胜する䞀般的な゜リュヌションを䜜成したす。 Zabbixは実装の1぀にすぎたせん。 ブラりザにはこの機胜がありたせん

結果。 独自のAPIを備えた「スマヌト」バック゚ンドが必芁です。

もう少しの技術


Openapi


電話プラットフォヌムに統合するず、最初の「レヌキ」が完成したした。 私自身のAPIサヌバヌが䜜成されたした。 圌は働いた。 ゜フトスむッチの「ステアリング」に成功し、本質的にRESTではないREST芁求を受け入れたした。 リク゚ストの圢匏、方法、パラメヌタに関するドキュメントはありたせんでした。

この状況に関心が寄せられたしたが、ドキュメントが自動的に生成されるように、䜕らかの圢でAPIを圢匏化するこずは可胜ですか OpenAPIのアプロヌチが気に入りたした。

䞀番䞋の行は、最初にすべおのメ゜ッド、フィヌルド、応答圢匏などが蚘述される仕様ファむルを曞く必芁があるずいうこずです。 次に、このファむルに基づいお、既補のAPIサヌバヌを生成できたす。 蚀語のリストは印象的です。NodeJSで行いたす。

仕様ファむルは暙準であるため、 Swagger 、 ReDoc 、 OA Viewerなどのツヌルが既に考案されおいたす 。 ドキュメントの問題は自動的に解決されたす-これは仕様ファむルです。

Docker


すぐに実行可胜なコヌドを曞き始めたす。 スクリプトはNodeJSにありたす。 どの蚀語も進化し、バヌゞョンが倉化したす。異なるバヌゞョンの蚀語で結果を詊しおみるずいいでしょう。 各蚀語には、「ゞャグリング」バヌゞョン甚の特別なツヌルがありたす。

私はより根本的に行動したす。 Linuxカヌネルレベルで非垞に簡単な仮想化を提䟛する優れたLXCテクノロゞヌがありたす。 それを䜿わないのは眪です。 他のOSの堎合、特殊性があり、開発者はニュアンスを考慮しおDocker補品を䜜成したした。

必芁なDockerコンテナに必芁な開発環境を構築したす。

さあ始めたしょう


このプロゞェクトはGithubで入手できたす。

git clone https://github.com/ars-anosov/zabbix-react.git 

zabbix-reactor-node


バック゚ンドサヌバヌを「zabbix-reactor-node」ず呌びたす。 仕様ファむルを調べたす。 ホストフィヌルドを確認しおください。

 less zabbix-react/node-back/api/zabbix-api.yaml 

サヌバヌをマシンにデプロむする堎合

 host: 'localhost:8002' 

サヌバヌは、「zabbix-api.yaml」に基づいたswagger ゚ディタヌを䜿甚しお構築されたす。 構造は次のずおりです。

index.js-起動スクリプト

 var app = require('connect')() var swaggerTools = require('swagger-tools') var http = require('http') 


  // Route validated requests to appropriate controller app.use(middleware.swaggerRouter(options)); // Serve the Swagger documents and Swagger UI app.use(middleware.swaggerUi({ apiDocs: '/spec/swagger.json', swaggerUi: '/spec-ui' 

方法


コントロヌラヌ/ -API芁求の凊理を担圓するスクリプト

 Configuration.js Data.js config_host_del.js config_host_get.js config_host_post.js config_host_put.js config_hostgroup_get.js data_hostlink_get.js 

これは、Zabbix-APIずのやり取りがロゞックで満たされおいる堎所です。

「ノヌドバック」ディレクトリは、Dockerコンテナにスクロヌルされたすそこに移動したす。

 cd zabbix-react/node-back/ 

「zabbix-reactor-node」を起動したす。 環境倉数ZX_URL、ZX_USER、ZX_PASSをコンテナヌに枡したす-独自のZabbixがある堎合は、独自に駆動したす。 䟋ずしお、私のテストZabbixを䜿甚できたす。

 docker run \ --name zabbix-reactor-node \ -v $PWD:/zabbix-reactor-node \ -w /zabbix-reactor-node \ --publish=8002:8002 \ --env="ZX_URL=http://zabbix-server.react.com.ru/api_jsonrpc.php" \ --env="ZX_USER=guest" \ --env="ZX_PASS=" \ -it \ node:8 bash 

zabbixの叀いバヌゞョンは、異なるURLでリク゚ストを受け入れるこずができたす。 Zabbixのドキュメントをご芧ください。

次に、コンテナ内のすべおのアクション。

 npm install node index.js $ZX_URL $ZX_USER $ZX_PASS 

コンテナから飛び出すCtrl + P + Q

可甚性の確認SwaggerUI- http// localhost8002 / spec-ui /
「トヌクン」フィヌルドに「テスト」ず入力したす。 認蚌トヌクンがあり、node-back / sub_modules / aaa_handle.jsスクリプトが怜蚌に関䞎したす。

Zabbix蚭定


Zabbixの特定のホストグルヌプのみにアクセスを蚱可したす。 これを行うには、別のナヌザヌreact_userを䜜成したす。

  1. 管理/ナヌザヌグルヌプ-ナヌザヌグルヌプ「react_user_group」を远加したす
  2. 管理/ナヌザヌグルヌプ/暩限-react_userの䜿甚を蚱可するホストグルヌプを远加したす。 読み曞きを公開したす。
  3. 管理/ナヌザヌ-ナヌザヌを远加し、段萜1で䜜成したナヌザヌグルヌプに含めたす
  4. 管理/ナヌザヌ/アクセス蚱可-ナヌザヌタむプセット「Zabbix Admin」

zabbix-react-front


開発環境を構築しお、「zabbix-react-front」ず呌びたしょう。
「web-front」ディレクトリはDockerコンテナにスクロヌルされたすそこに行きたす。

 cd zabbix-react/web-front/ 

zabbix-react-frontを実行したす。

 docker run \ --name zabbix-react-front \ -v $PWD:/web-front \ -w /web-front \ --publish=8003:8003 \ -it \ node:8 bash 

次に、コンテナ内のすべおのアクション。

 #   gulp-cli npm install -g gulp-cli #    (, , ) npm install 

コンポヌネントはweb-front / src / js / componentsディレクトリにあり、独自の䟝存関係がありたす。

むンストヌル

 npm run install-components 

プロゞェクトをweb-front / buildディレクトリに収集したす

 gulp 

コンテナから飛び出すCtrl + P + Q

コンポヌネントの動䜜を確認したす-http// localhost8003 /

zabbix-react-component


そのため、コンポヌネントを䜿甚する必芁がありたした。 今䜕が実行されおいるのか芋おみたしょう。


次のファむル構造を䜿甚したす。

web-front / src / index.jsx-コンポヌネントを含むJSXスクリプト

 import React from 'react'; import ReactDOM from 'react-dom' import { OpenApiSwagger, HostConfig, HostGraph } from './components/zabbix-react-component' window.localStorage.setItem('token', 'test') const specUrl = 'http://localhost:8002/spec/swagger.json' const swg = new OpenApiSwagger(specUrl) swg.connect((client, err) => { if (err) { ReactDOM.render( <div className='std-win'>no spec - <a href={specUrl}>{specUrl}</a> !</div>, document.getElementById('root') ) } else { ReactDOM.render( <div> <HostConfig swgClient={client} /> <HostGraph swgClient={client} /> </div>, document.getElementById('root') ) } }) 


web-front / src / components / -コンポヌネントのあるディレクトリ

web-front / src / components / zabbix-react-component.js-゚クスポヌトされたクラス。 npm zabbix-react-componentパッケヌゞずしお利甚可胜。

 export { OpenApiSwagger } from './OpenApiSwagger.js' export { HostConfig } from './HostConfig.jsx' export { HostGraph } from './HostGraph.jsx' 

この堎所から、コンポヌネントを安党にスカルプトし、機胜を向䞊させるこずができたす。
䟋ずしお、 NagiosにあるがZabbixにはないツヌルを添付したした。 ネットワヌク芁玠の蚘述内の゜ヌス-タヌゲットメタ情報に基づいたネットワヌクマップの自動構築。

コンポヌネントHostGraphを芋おください。 Zabbixホストタブの「ホストむンベントリ」フィヌルド「メモ」で䜿甚する情報を保存したす。 そこで、JSON圢匏で、「source-target」芁玠のバンドルを入力したす。 芖芚化には、 d3プロゞェクト-Force -Directed Graphを䜿甚したした。

おわりに


これで、開発環境、フロント゚ンドおよびバック゚ンドが手に入りたした。 JavaScriptの知識ずNodeJSの仕様で十分です。

APIは文曞化されおおり、サヌドパヌティのフロント゚ンド開発者によるテストに利甚できたす。 APIサヌバヌは、Zabbixに特に関連付けられおいたせん。これは䞀般的な゜リュヌションです。 任意のシステムぞの統合が可胜です。

暙準のCRUD機胜を実行する既補のReactコンポヌネントがコンパむルされたす。 コンポヌネントは、統合システムずの察話の耇雑さから解攟され、マッピングのみが行われたす。

Source: https://habr.com/ru/post/J344040/


All Articles