您好,登錄后才能下訂單哦!
這篇文章給大家介紹基于go語言的agent怎么用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一 介紹
在構建數據庫自動化運維系統的時候,數據庫服務器上必須要有一個agent來執行web服務器端發起的命令,我們研究了好幾種技術Celery,Redis Queue 或者基于socket實現,當然還有自己寫,因為之前有同事已經完成了一個agent---servant,在和同事溝通之后,我們決定復用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
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
<?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
example 的配置文件,使用的時候需要根據實際情況進行調整
<?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>
以上針對常用的配置做了解釋,更加詳細的解釋可以參考 servant的readme.md
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' ')" "http://127.0.0.1:2465${uri}"
[root@rac4 22:30:30 /opt/servant/conf]
log報錯 執行失敗,因為ts 的實際時間是22:16:50,執行的實際時間是22:30:30 超時時間是30s,故調用失敗
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
重新設置時間 ts 再次執行 成功。
[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' ')" "http://127.0.0.1:2465${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
2.5 安裝過程中遇到的問題
1 安裝的時候 需要創建
mkdir -p /opt/servant/conf/extra
2 認證權限問題
因為默認的/opt/servant/conf/servant.xml 的auth =true ,需要改為false。
不然使用curl 執行命令
curl http://127.0.0.1:2465/commands/db1/foo
日志里面報錯
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
關于基于go語言的agent怎么用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。