溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于go語言的agent怎么用

發(fā)布時(shí)間:2022-01-17 18:03:41 來源:億速云 閱讀:350 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家介紹基于go語言的agent怎么用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一 介紹
     在構(gòu)建數(shù)據(jù)庫自動(dòng)化運(yùn)維系統(tǒng)的時(shí)候,數(shù)據(jù)庫服務(wù)器上必須要有一個(gè)agent來執(zhí)行web服務(wù)器端發(fā)起的命令,我們研究了好幾種技術(shù)Celery,Redis Queue 或者基于socket實(shí)現(xiàn),當(dāng)然還有自己寫,因?yàn)橹坝型乱呀?jīng)完成了一個(gè)agent---servant,在和同事溝通之后,我們決定復(fù)用servant,不用重復(fù)造輪子。servant是一款基于go語言編寫的,通過http協(xié)議調(diào)用,提供權(quán)限認(rèn)證和遠(yuǎn)程調(diào)用,支持異步執(zhí)行命令的agent ,滿足我們目前數(shù)據(jù)庫備份任務(wù),定時(shí)收集數(shù)據(jù)庫元數(shù)據(jù)信息,定時(shí)校驗(yàn)備份的有效性的任務(wù)需求。本文是一篇how to 文檔,相對比較詳細(xì)的介紹如何安裝和使用servant,希望對讀者朋友有所幫助。

二安裝
2.1 軟件準(zhǔn)備
因?yàn)樵揳gent是基于go語言編寫的,所以要安裝 go語言包

  1. yum install -y go

  2. cd /opt/

  3. git clone https://github.com/xiezhenye/servant.git

  4. cd /opt/servant

  5. 方式一 make rpm

  6. 方式二 make

2.2 目錄結(jié)構(gòu)
編譯之后查看主要的目錄結(jié)構(gòu)
bin           # 編譯的二進(jìn)制文件 
conf         # 配置文件目錄
example   #
README.md  
scripts     #servantctl 執(zhí)行文件 用于啟停 查看狀態(tài)等
src          #源代碼文件
維護(hù)servant的操作命令 
/opt/servant/scripts/servantctl (start|stop|restart|status|help)
啟動(dòng)的時(shí)候遇到報(bào)錯(cuò)請到/data/logs/servant/servant.log 查看log的信息哪里有錯(cuò)

2.3 配置文件詳解
默認(rèn)在/opt/servant/conf里面有配置文件 servant.xml

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <config>

  3.     <server>

  4.         <listen>:2465</listen>  #監(jiān)聽的端口

  5.         <auth enabled="true">   #調(diào)用的時(shí)候是否啟用 權(quán)限 驗(yàn)證,生產(chǎn)環(huán)境建議開啟

  6.             <maxTimeDelta>30</maxTimeDelta> # 啟動(dòng)權(quán)限驗(yàn)證的時(shí)候 超時(shí)時(shí)間,超過30s 則認(rèn)為該調(diào)用無效

  7.         </auth>

  8.         <log>/data/logs/servant/servant.log</log> # 日志目錄log ,這是有贊標(biāo)準(zhǔn)的日志目錄,其他朋友在自己環(huán)境需要適當(dāng)調(diào)整

  9.     </server>

  10.     <!-- ...... -->

  11. </config

example 的配置文件,使用的時(shí)候需要根據(jù)實(shí)際情況進(jìn)行調(diào)整

  1. <?xml version="1.0" encoding="utf-8" ?>

  2. <config>

  3.     <server> ##server和/opt/servant/conf/servant.xml 配置是一樣的。

  4.         <listen>:2465</listen>

  5.         <auth enabled="0">

  6.             <maxTimeDelta>300</maxTimeDelta>

  7.         </auth>

  8.         <log>servant.log</log>

  9.     </server>

  10. #commands 定義了一個(gè)可執(zhí)行的命令組,其中包含了多個(gè)command,其中

  11. lang 可以是exec 或者bash

  12. id   是每一組command的標(biāo)示,runas標(biāo)示以什么樣的用戶執(zhí)行。

  13. background="true" 標(biāo)示以后臺(tái)方式執(zhí)行,并且servant 立即返回

  14.     <commands id="db1">

  15.         <command id="foo" runas="mysql" lang="bash">

  16.             <code>echo "hello world $(whoami)"</code>

  17.         </command>

  18.         <command id="grep" lang="exec">

  19.             <code>grep hello</code>

  20.         </command>

  21.         <command id="sleep" timeout="5" lang="exec">

  22.             <code> sleep ${t}</code>

  23.         </command>

  24.     </commands>

  25. # daemon

  26.     <daemon id="daemon1" retries="10" lang="bash">

  27.         <code>sleep 10000</code>

  28.     </daemon>

  29. # 定時(shí)器 ,定期執(zhí)行某一個(gè)命令

  30. tick 執(zhí)行命令的間隔

  31. deadline 命令執(zhí)行的最長時(shí)間,如果為5s 則命令最長執(zhí)行5s ,超過5s會(huì)被kill掉?

  32.     <timer id="xx" tick="5" deadline="5" lang="bash">

  33.         <code>

  34.         <![CDATA[

  35.              date >>/tmp/timer.log

  36.         ]]>

  37.         </code>

  38.     </timer>

  39. #文件操作類,和commands類似,可以配置多個(gè)操作文件的命令,主要包含 獲取文件內(nèi)容,創(chuàng)建文件,刪除文件,讀取指定字節(jié)范圍

  40. root 表示有權(quán)限訪問指定的目錄,例子中是訪問 /tmp/ 目錄下的文件。

  41.     <files id="db1">

  42.         <dir id="binlog1">

  43.             <root>/tmp/</root>

  44.             <allow>get</allow>

  45.             <allow>head</allow>

  46.             <allow>post</allow>

  47.             <allow>delete</allow>

  48.             <allow>put</allow>

  49.             <pattern>log-bin\.\d+</pattern> #正則表達(dá)式

  50.         </dir>

  51.     </files>

  52. #這個(gè)比較少用 訪問數(shù)據(jù)庫

  53.     <database id="mysql" driver="mysql" dsn="root:@tcp(127.0.0.1:3306)/test">

  54.         <query id="select_1">select 1;</query>

  55.     </database>

  56. #

  57.     <vars id="vars">

  58.         <var id="foo">

  59.             <value>bar</value>

  60.         </var>

  61.         <var id="hello" expand="true">

  62.             <value>${world}</value>

  63.         </var>

  64.     </vars>

  65. # 配合auth=true的時(shí)候一起使用,訪問的時(shí)候 必須使用和配置文件中指定的user ,否則不能調(diào)用servant

  66.     <user id="user1">

  67.         <key>someKey</key>

  68.         <host>192.168.1.0/24</host> #指定允許訪問servant 的ip源地址。通常建議使用本地調(diào)用,更加安全。

  69.         <files id="db1" />

  70.         <commands id="db1" />

  71.     </user>

  72. </config>

以上針對常用的配置做了解釋,更加詳細(xì)的解釋可以參考 servant的readme.md
2.4 具體的測試用例   為了測試方便,先去掉權(quán)限認(rèn)證。
comand 支持get 和post 兩種方式調(diào)用

  1. [root@rac4 22:38:05 /opt/servant/conf/extra]

  2. # curl http://127.0.0.1:2465/commands/db1/foo

  3. hello world mysql

  4. [root@rac4 22:40:07 /opt/servant/conf/extra]

  5. # echo "hello world" | curl -XPOST http://127.0.0.1:2465/commands/db1/grep -d @-

  6. hello world

  7. [root@rac4 22:40:08 /opt/servant/conf/extra]

  8. # echo "hxxello world" | curl -XPOST http://127.0.0.1:2465/commands/db1/grep -d @-

文件類型操作
獲取文件內(nèi)容

  1. [root@rac4 22:38:00 /opt/servant/conf/extra]

  2. # curl http://127.0.0.1:2465/files/db1/test/yz.log

  3. youzan ,nihao ,yangyi dba

創(chuàng)建文件

  1. [root@rac4 22:41:56 /opt/servant/conf/extra]

  2. # curl -XPOST http://127.0.0.1:2465/files/db1/test/54.txt -d "hello world "

  3. 驗(yàn)證上面的寫入情況

  4. [root@rac4 22:42:03 /opt/servant/conf/extra]

  5. # curl  http://127.0.0.1:2465/files/db1/test/54.txt

  6. hello world

更新文件內(nèi)容

  1. [root@rac4 22:45:13 /opt/servant/conf/extra]

  2. # curl -XPUT http://127.0.0.1:2465/files/db1/test/54.txt -d "yangyi dba"

  3. [root@rac4 22:45:26 /opt/servant/conf/extra]

  4. # curl  http://127.0.0.1:2465/files/db1/test/54.txt

  5. yangyi dba

開啟權(quán)限驗(yàn)證生產(chǎn)環(huán)境下從安全的角度考慮建議開啟權(quán)限驗(yàn)證
修改配置文件 啟用auth 為true 和設(shè)置user 配置

  1. [root@rac4 22:16:50 /opt/servant/conf]

  2. # uri='/commands/db1/foo'

  3. # ts=$(date +%s)

  4. # key=someKey

  5. # curl -H "Authorization: ${user} ${ts} $(echo -n "${user}${key}${ts}GET${uri}"|sha1sum|cut -f1 -d' ')" "http://127.0.0.1:2465${uri}"

  6. [root@rac4 22:30:30 /opt/servant/conf]

log報(bào)錯(cuò) 執(zhí)行失敗,因?yàn)閠s 的實(shí)際時(shí)間是22:16:50,執(zhí)行的實(shí)際時(shí)間是22:30:30 超時(shí)時(shí)間是30s,故調(diào)用失敗

  1. 2017/05/05 22:30:29 INFO (6) [commands] + 127.0.0.1:42798 GET /commands/db1/foo

  2. 2017/05/05 22:30:30 WARN (6) [commands] - auth failed: timestamp delta too large

重新設(shè)置時(shí)間 ts  再次執(zhí)行 成功。

  1. [root@rac4 22:30:58 /opt/servant/conf]

  2. # ts=$(date +%s)

  3. [root@rac4 22:31:02 /opt/servant/conf]

  4. # curl -H "Authorization: ${user} ${ts} $(echo -n "${user}${key}${ts}GET${uri}"|sha1sum|cut -f1 -d' ')" "http://127.0.0.1:2465${uri}"

  5. hello world mysql

  6. 日志輸出

  7. 2017/05/05 22:31:05 INFO (7) [commands] + 127.0.0.1:42808 GET /commands/db1/foo

  8. 2017/05/05 22:31:05 INFO (7) [commands] command: [bash -c echo "hello world $(whoami)"]

  9. 2017/05/05 22:31:05 INFO (7) [commands] process started. pid: 27706

  10. 2017/05/05 22:31:05 INFO (7) [commands] - execution done

2.5 安裝過程中遇到的問題
1 安裝的時(shí)候 需要?jiǎng)?chuàng)建 
mkdir -p /opt/servant/conf/extra
2 認(rèn)證權(quán)限問題
因?yàn)槟J(rèn)的/opt/servant/conf/servant.xml 的auth =true ,需要改為false。
不然使用curl 執(zhí)行命令
curl http://127.0.0.1:2465/commands/db1/foo 
日志里面報(bào)錯(cuò)
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

關(guān)于基于go語言的agent怎么用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI