簡介
pillar支援的資料存儲方式有很多,mysql, mogo,json等。本篇介紹關于http存儲方式。
首先簡要說明整個流程:salt-master會去一個指定http發送get請求擷取一個json串,然後将json存儲為pillar。擷取json時是根據salt-minon的minion_id 去擷取,也就說每個minion_id擷取到的json是不同的,這樣http頁面就應該是一個動态頁面。例如http:/test.com/pillar/minion_id;不同的minion_id擷取不同的json串。
實作過程
(1)HTTP
首先要建立HTTP服務,方法很多,這裡的關鍵是提供一個動态url,salt通過不同的minion_id擷取對應要存儲的pillar值。
# 動态url擷取内容,需要達到下面的效果, node1和node2是不同的minion_id
通路 http://192.168.1.12:8088/pillar/node1
擷取: ' {"serverid":"1001","mysql_port":"3306"}'
通路 http://192.168.1.12:8088/pillar/node2
擷取: ' {"serverid":"1002","mysql_port":"3306"}'
(2)salt 源碼修改
寫了個高大上的名字,其實就是添加一個Python腳本。。。腳本目錄是在salt安裝在python的site-packages目錄裡。找不到就find / -name salt ;
# cd /usr/local/lib/python3.6/site-packages/salt/pillar/ # 這個目錄下是pillar的各種ext_pillar方法
# vim ops.py # 建立一個python腳本,名字随意取,但一定要唯一,名字之後會用到
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author : wangyongcun
import logging
import requests
import json
log = logging.getLogger(__name__)
def ext_pillar(minion_id, pillar, api):
pillar_url = api + "/" + minion_id # 不同minion将通路不同的url
log.warning("Querying SOPS system Pillar of %s" % (minion_id, )) # 自己加的一條日志,可忽略
try:
ret = requests.get(url=pillar_url) # 向url發送get請求,這個方法需要requests子產品,若沒有需要安裝,在master安裝就可以
r = ret.text # get擷取到的結果
if r:
result = json.loads(r) # 将擷取的json字元串轉化為字典類型
else: # 如果擷取的json為空
result = {}
except Exception as e: # 這個異常處理,一般情況都是無法連接配接url擷取到内容,記錄個日志
log.exception(
"Query SOPS system failed! Error: [%s] :%s" % (minion_id,e, )
)
return {}
return result # 傳回字典格式的資料
(3)修改salt-master 配置檔案
# vim /etc/salt/master
# 注意格式空格
ext_pillar:
- sops: # 這個是上面添加的py檔案名稱
api: http://192.168.1.12:8088/pillar/
(4)重新開機master
# 重新開機
systemctl stop salt-master
systemctl start salt-master
# 重新整理pillar
salt '*' saltutil.refresh_pillar
# 檢視一下
[root@aliyuntest ~]# salt '*' pillar.items
node1:
----------
mysql_port:
3306
serverid:
1001
node2:
----------
mysql_port:
3306
serverid:
1002