pillar支持的數據存儲方式有不少,mysql, mogo,json等。本篇介紹關於http存儲方式。node
首先簡要說明整個流程: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串。python
(1)HTTPmysql
首先要創建HTTP服務,方法不少,這裏的關鍵是提供一個動態url,salt經過不一樣的minion_id獲取對應要存儲的pillar值。sql
# 動態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 源碼修改json
寫了個高大上的名字,其實就是添加一個Python腳本。。。腳本目錄是在salt安裝在python的site-packages目錄裏。找不到就find / -name salt ;vim
# 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 配置文件api
# vim /etc/salt/master # 注意格式空格 ext_pillar: - sops: # 這個是上面添加的py文件名稱 api: http://192.168.1.12:8088/pillar/
(4)重啓masterurl
# 重啓 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