【工具】一款基於go語言的agent
一 介紹
在構建資料庫自動化運維繫統的時候,資料庫伺服器上必須要有一個agent來執行web伺服器端發起的命令,我們研究了好幾種技術Celery,Redis Queue 或者基於socket實現,當然還有自己寫,因為之前有同事已經完成了一個agent---,在和同事溝通之後,我們決定複用servant,不用重複造輪子。servant是一款基於go語言編寫的,透過http協議呼叫,提供許可權認證和遠端呼叫,支援非同步執行命令的agent ,滿足我們目前資料庫備份任務,定時收集資料庫後設資料資訊,定時校驗備份的有效性的任務需求。本文是一篇how to 文件,相對比較詳細的介紹如何安裝和使用servant,希望對讀者朋友有所幫助。
二安裝
2.1 軟體準備
因為該agent是基於go語言編寫的,所以要安裝 go語言包
2.2 目錄結構
編譯之後檢視主要的目錄結構
bin # 編譯的二進位制檔案
conf # 配置檔案目錄
example #
README.md
scripts #servantctl 執行檔案 用於啟停 檢視狀態等
src #原始碼檔案
維護servant的操作命令
/opt/servant/scripts/servantctl (start|stop|restart|status|help)
啟動的時候遇到報錯請到/data/logs/servant/servant.log 檢視log的資訊哪裡有錯
2.3 配置檔案詳解
預設在/opt/servant/conf裡面有配置檔案 servant.xml
example 的配置檔案,使用的時候需要根據實際情況進行調整
以上針對常用的配置做了解釋,更加詳細的解釋可以參考
2.4 具體的測試用例 為了測試方便,先去掉許可權認證。
comand 支援get 和post 兩種方式呼叫
檔案型別操作
獲取檔案內容
建立檔案
更新檔案內容
開啟許可權驗證,生產環境下從安全的角度考慮建議開啟許可權驗證
修改配置檔案 啟用auth 為true 和設定user 配置
log報錯 執行失敗,因為ts 的實際時間是22:16:50,執行的實際時間是22:30:30 超時時間是30s,故呼叫失敗
重新設定時間 ts 再次執行 成功。
2.5 安裝過程中遇到的問題
1 安裝的時候 需要建立
mkdir -p /opt/servant/conf/extra
2 認證許可權問題
因為預設的/opt/servant/conf/servant.xml 的auth =true ,需要改為false。
不然使用curl 執行命令
curl
日誌裡面報錯
2017/05/05 21:52:30 INFO (3) [commands] + 127.0.0.1:41988 GET /commands/db1/foo
2017/05/05 21:52:31 WARN (3) [commands] - auth failed: bad auth header
三 總結
總體上而言 ,servant能夠滿足大部分的agent需求,歡迎大家使用,如果有任何問題 可以聯絡我反饋或者聯絡
如果您覺得對你的devops有幫助 ,可以贊助 一瓶飲料。
在構建資料庫自動化運維繫統的時候,資料庫伺服器上必須要有一個agent來執行web伺服器端發起的命令,我們研究了好幾種技術Celery,Redis Queue 或者基於socket實現,當然還有自己寫,因為之前有同事已經完成了一個agent---,在和同事溝通之後,我們決定複用servant,不用重複造輪子。servant是一款基於go語言編寫的,透過http協議呼叫,提供許可權認證和遠端呼叫,支援非同步執行命令的agent ,滿足我們目前資料庫備份任務,定時收集資料庫後設資料資訊,定時校驗備份的有效性的任務需求。本文是一篇how to 文件,相對比較詳細的介紹如何安裝和使用servant,希望對讀者朋友有所幫助。
二安裝
2.1 軟體準備
因為該agent是基於go語言編寫的,所以要安裝 go語言包
-
yum install -y go
-
cd /opt/
-
git clone https://github.com/xiezhenye/servant.git
-
cd /opt/servant
-
方式一 make rpm
- 方式二 make
編譯之後檢視主要的目錄結構
bin # 編譯的二進位制檔案
conf # 配置檔案目錄
example #
README.md
scripts #servantctl 執行檔案 用於啟停 檢視狀態等
src #原始碼檔案
維護servant的操作命令
/opt/servant/scripts/servantctl (start|stop|restart|status|help)
啟動的時候遇到報錯請到/data/logs/servant/servant.log 檢視log的資訊哪裡有錯
2.3 配置檔案詳解
預設在/opt/servant/conf裡面有配置檔案 servant.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<config>
-
<server>
-
<listen>:2465</listen> #監聽的埠
-
<auth enabled="true"> #呼叫的時候是否啟用 許可權 驗證,生產環境建議開啟
-
<maxTimeDelta>30</maxTimeDelta> # 啟動許可權驗證的時候 超時時間,超過30s 則認為該呼叫無效
-
</auth>
-
<log>/data/logs/servant/servant.log</log> # 日誌目錄log ,這是有贊標準的日誌目錄,其他朋友在自己環境需要適當調整
-
</server>
-
<!-- ...... -->
- </config
-
<?xml version="1.0" encoding="utf-8" ?>
-
<config>
-
<server> ##server和/opt/servant/conf/servant.xml 配置是一樣的。
-
<listen>:2465</listen>
-
<auth enabled="0">
-
<maxTimeDelta>300</maxTimeDelta>
-
</auth>
-
<log>servant.log</log>
-
</server>
-
#commands 定義了一個可執行的命令組,其中包含了多個command,其中
-
lang 可以是exec 或者bash
-
id 是每一組command的標示,runas標示以什麼樣的使用者執行。
-
background="true" 標示以後臺方式執行,並且servant 立即返回
-
<commands id="db1">
-
<command id="foo" runas="mysql" lang="bash">
-
<code>echo "hello world $(whoami)"</code>
-
</command>
-
<command id="grep" lang="exec">
-
<code>grep hello</code>
-
</command>
-
<command id="sleep" timeout="5" lang="exec">
-
<code> sleep ${t}</code>
-
</command>
-
</commands>
-
# daemon
-
<daemon id="daemon1" retries="10" lang="bash">
-
<code>sleep 10000</code>
-
</daemon>
-
# 定時器 ,定期執行某一個命令
-
tick 執行命令的間隔
-
deadline 命令執行的最長時間,如果為5s 則命令最長執行5s ,超過5s會被kill掉?
-
<timer id="xx" tick="5" deadline="5" lang="bash">
-
<code>
-
<![CDATA[
-
date >>/tmp/timer.log
-
]]>
-
</code>
-
</timer>
-
#檔案操作類,和commands類似,可以配置多個操作檔案的命令,主要包含 獲取檔案內容,建立檔案,刪除檔案,讀取指定位元組範圍
-
root 表示有許可權訪問指定的目錄,例子中是訪問 /tmp/ 目錄下的檔案。
-
<files id="db1">
-
<dir id="binlog1">
-
<root>/tmp/</root>
-
<allow>get</allow>
-
<allow>head</allow>
-
<allow>post</allow>
-
<allow>delete</allow>
-
<allow>put</allow>
-
<pattern>log-bin\.\d+</pattern> #正規表示式
-
</dir>
-
</files>
-
#這個比較少用 訪問資料庫
-
<database id="mysql" driver="mysql" dsn="root:@tcp(127.0.0.1:3306)/test">
-
<query id="select_1">select 1;</query>
-
</database>
-
#
-
<vars id="vars">
-
<var id="foo">
-
<value>bar</value>
-
</var>
-
<var id="hello" expand="true">
-
<value>${world}</value>
-
</var>
-
</vars>
-
# 配合auth=true的時候一起使用,訪問的時候 必須使用和配置檔案中指定的user ,否則不能呼叫servant
-
<user id="user1">
-
<key>someKey</key>
-
<host>192.168.1.0/24</host> #指定允許訪問servant 的ip源地址。通常建議使用本地呼叫,更加安全。
-
<files id="db1" />
-
<commands id="db1" />
-
</user>
- </config>
2.4 具體的測試用例 為了測試方便,先去掉許可權認證。
comand 支援get 和post 兩種方式呼叫
-
[root@rac4 22:38:05 /opt/servant/conf/extra]
-
# curl http://127.0.0.1:2465/commands/db1/foo
-
hello world mysql
-
[root@rac4 22:40:07 /opt/servant/conf/extra]
-
# echo "hello world" | curl -XPOST http://127.0.0.1:2465/commands/db1/grep -d @-
-
hello world
-
[root@rac4 22:40:08 /opt/servant/conf/extra]
- # echo "hxxello world" | curl -XPOST http://127.0.0.1:2465/commands/db1/grep -d @-
獲取檔案內容
-
[root@rac4 22:38:00 /opt/servant/conf/extra]
-
# curl http://127.0.0.1:2465/files/db1/test/yz.log
- youzan ,nihao ,yangyi dba
-
[root@rac4 22:41:56 /opt/servant/conf/extra]
-
# curl -XPOST http://127.0.0.1:2465/files/db1/test/54.txt -d "hello world "
-
驗證上面的寫入情況
-
[root@rac4 22:42:03 /opt/servant/conf/extra]
-
# curl http://127.0.0.1:2465/files/db1/test/54.txt
- hello world
-
[root@rac4 22:45:13 /opt/servant/conf/extra]
-
# curl -XPUT http://127.0.0.1:2465/files/db1/test/54.txt -d "yangyi dba"
-
[root@rac4 22:45:26 /opt/servant/conf/extra]
-
# curl http://127.0.0.1:2465/files/db1/test/54.txt
- yangyi dba
修改配置檔案 啟用auth 為true 和設定user 配置
-
[root@rac4 22:16:50 /opt/servant/conf]
-
# uri='/commands/db1/foo'
-
# ts=$(date +%s)
-
# key=someKey
-
# curl -H "Authorization: ${user} ${ts} $(echo -n "${user}${key}${ts}GET${uri}"|sha1sum|cut -f1 -d' ')" "{uri}"
- [root@rac4 22:30:30 /opt/servant/conf]
-
2017/05/05 22:30:29 INFO (6) [commands] + 127.0.0.1:42798 GET /commands/db1/foo
- 2017/05/05 22:30:30 WARN (6) [commands] - auth failed: timestamp delta too large
-
[root@rac4 22:30:58 /opt/servant/conf]
-
# ts=$(date +%s)
-
[root@rac4 22:31:02 /opt/servant/conf]
-
# curl -H "Authorization: ${user} ${ts} $(echo -n "${user}${key}${ts}GET${uri}"|sha1sum|cut -f1 -d' ')" "{uri}"
-
hello world mysql
-
日誌輸出
-
2017/05/05 22:31:05 INFO (7) [commands] + 127.0.0.1:42808 GET /commands/db1/foo
-
2017/05/05 22:31:05 INFO (7) [commands] command: [bash -c echo "hello world $(whoami)"]
-
2017/05/05 22:31:05 INFO (7) [commands] process started. pid: 27706
- 2017/05/05 22:31:05 INFO (7) [commands] - execution done
1 安裝的時候 需要建立
mkdir -p /opt/servant/conf/extra
2 認證許可權問題
因為預設的/opt/servant/conf/servant.xml 的auth =true ,需要改為false。
不然使用curl 執行命令
curl
日誌裡面報錯
2017/05/05 21:52:30 INFO (3) [commands] + 127.0.0.1:41988 GET /commands/db1/foo
2017/05/05 21:52:31 WARN (3) [commands] - auth failed: bad auth header
三 總結
總體上而言 ,servant能夠滿足大部分的agent需求,歡迎大家使用,如果有任何問題 可以聯絡我反饋或者聯絡
如果您覺得對你的devops有幫助 ,可以贊助 一瓶飲料。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-2138562/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Python】一款基於go語言的agentPythonGo
- Go 語言 Web tail -f 工具, 基於 WebSocketGoWebAI
- Go-sword (利刃 ?️) 是一款基於 Go 語言的視覺化 Web 管理後臺生成工具Go視覺化Web
- goweb,基於go語言的API框架GoWebAPI框架
- goweb,基於go語言API框架GoWebAPI框架
- Go語言基於go module方式管理包(package)GoPackage
- 基於Go語言來理解TensorflowGo
- 基於 Go 語言來理解 TensorflowGo
- 滴滴基於Go語言的DevOps重塑之路Godev
- 一款基於語法的HTTP漏洞挖掘工具HTTP
- 基於go語言學習工廠模式Go模式
- Go語言基礎Go
- 基於go語言gin框架的web專案骨架Go框架Web
- Go語言基礎-序言Go
- 【Go語言基礎】sliceGo
- 基於 Go + Vue3!一款開源的 Nginx 管理 Web 工具!GoVueNginxWeb
- Go 語言 udpproxy 除錯工具GoUDP除錯
- Go 語言 WebSocket 除錯工具GoWeb除錯
- [Go]Go 語言基礎拾遺(一)Go
- 基於 Web 的 Go 語言 IDE - Wide 1.5.2 釋出!WebGoIDE
- [06 Go語言基礎-包]Go
- Go 語言關於 Type Assertions 的 坑Go
- go語言基礎之——iota的用法Go
- Go語言基礎語法總結Go
- go語言開發有哪些工具Go
- Go語言交叉編譯工具goxGo編譯
- Go語言工具簡介 - HoneybadgerGo
- Go 語言 udp server 除錯工具GoUDPServer除錯
- Go 語言 httpdump server 除錯工具GohttpdServer除錯
- Go語言開發的PaaS工具有哪些?go學習Go
- 基於GO語言框架Gin開發的MVC輪子框架:GinLaravelGo框架MVCLaravel
- Go語言專案實戰:基於開源資料的成語查詢Go
- Go語言————1、初識GO語言Go
- 【搞定Go語言】第2天4:Go語言基礎之流程控制Go
- 基於Go語言的社群系統:mlog-club1.0.3 釋出Go
- 基於 Go 語言的社群系統:mlog-club1.0.3 釋出Go
- 五款最棒的Go語言開發工具?Go
- 基於物件的JavaScript語言(轉)物件JavaScript