回顧上一節:python
grains 和 pillar 都是定義他們的屬性的shell
grains 定義在minion端(定義完必須重啓minion,才能生效)vim
pillar 定義在master端(無需重啓便可生效)api
saltstack的apibash
Salt-api有兩種方式:服務器
第一種:是函數的形式,有人家定義好的函數,咱們能夠直接調用,直接寫python代碼調用函數或者類就能夠了。異步
第二種:形式是salt-api有封裝好的http協議的,咱們須要啓動一個服務端。async
登陸官網查看文檔:ide
文檔內容,以下:函數
安裝salt-api:
yum install –y salt-api
1.加載master的配置文件
import salt.config master_opts = salt.config.client_config('/etc/salt/master') print('master_opts')
master端,若是想查看配置文件的參數屬性:
2. 加載minion的配置文件
import salt.config minion_opts = salt.config.minion_config('/etc/salt/minion') print ('minion_opts')
minion端,想看配置文件內的參數屬性:
3. 在master上執行各類模塊:
>>> import salt.client >>> local = salt.client.LocalClient('/etc/salt/minion') >>> local.cmd('*', "test.ping")
返回:
{'192.168.48.129': True}
執行命令:
>> local.cmd('*', "cmd.run", "w")
【返回的是一個字典形式,很容易後期處理數據用】
{'192.168.48.129': ' 12:17:38 up 5:58, 1 user, load average: 0.00, 0.01, 0.05\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\nroot pts/0 192.168.48.1 11:14 2:50 0.89s 0.89s python'}
若是一次要執行多個模塊:
一種方式:
>>> local.cmd('*', ['test.ping', 'cmd.run'], [[], ['whoami']])
結果:
{'192.168.48.129': {'test.ping': True, 'cmd.run': 'root'}}
【test.ping 對應 [](空列表),cmd.run 對應 whoami 命令】
另外一種方式:(不推薦這樣用,還不如調兩次,這樣邏輯性很差)
>>> local.cmd('*', ['test.ping', 'cmd.run'], [[], ['w; df -h']])
自定義的模塊:
模塊目錄必須建立:
mkdir -p /srv/salt/_modules cd /srv/salt/_modules
建立 jd.py 文件:
vim jd.py
#!/usr/bin/python #coding:utf-8 def hello(name): return {"name": name}
寫完全部module要記得同步一下:
salt '*' saltutil.sync_all #同步全部
或者
salt '*' saltutil.sync_modules #只同步modules
執行命令獲取結果:
# salt '*' jd.hello ajing
結果輸出,如圖:
python交互界面中這樣獲取:
Master端執行salt-run
若是對於執行時間過長,無法直接返回的狀況,咱們就能夠經過異步執行的形式進行返回 cmd_async 和 get_cache_returns()
先使用salt-run命令:
(1)命令行使用salt-run查看服務器狀態
# salt-run manage.status
返回結果:
down: up: - 192.168.48.129
(2)使用 runner 模塊查看客戶端服務器狀態:
import salt.config import salt.runner __opts__ = salt.config.client_config('/etc/salt/master') runermaster = salt.runner.RunnerClient(__opts__) runnerMaster.cmd('jobs.list_jobs', []) runnerMaster.cmd('manage.status')
返回結果:
down: up: - 192.168.48.129 {'down': [], 'up': ['192.168.48.129']}
【如下例子代碼只能只能在master上執行,並且是隻能在master上纔可使用】
vim test.py
import salt.config import salt.client def get_result(sleep_interval=1): __opts__ = salt.config.client_config('/etc/salt/master') localclient = salt.client.LocalClient(__opts__) jid = localclient.cmd_async("*", cmd.run, 'df -h') #returns = localclient.get_cache_returns(jid) wait_time = 0 while sleep_interval < __opts__['timeout']: results = localclient.get_cache_returns(jid) if returns: return results wait_time += sleep_interval
這個 test.py 文件的位置是在 /srv/salt/_runner 裏面,圖中爲定義 _runner 的目錄位置 (文件:/etc/salt/master)
先建立 _runner 目錄,修改文件 /etc/salt/master 的 runner路徑參數:
先建立 _runner 目錄,修改文件 /etc/salt/master 的 runner路徑參數:
記得重啓master服務
經過python命令測試並確認目錄位置:
【補充】
客戶端的獲取結果的方式爲:
import salt.config import salt.client caller = salt.client.Caller('/etc/salt/minion') caller.cmd("test.ping")
獲得結果:
True
因此,對比一下master端和minion端獲取值的方式不一樣:
local = salt.client.LocalClient('/etc/salt/minion')#master端 對比: caller = salt.client.Caller(‘/etc/salt/minion’)#minion端,沒法使用LocalClient
相似shell命令的salt-call,能夠在minion端執行salt的命令,測試連通性等操做。
Salt的內置環境變量:
在python的交互環境中,這些變量是不生效的,只有在自定義的模塊,活着salt執行時才生效
(1)__opts__ #配置文件,類型等 最經常使用
(2)__salt__ #執行、調用 modules 最經常使用
舉例:
__salt__['cmd.run']('fdisk -l') ##__salt__[模塊](參數) __salt__['network.ip_addrs']() ##同上
【__salt__是個字典,它裏面裝了minion上全部的modules,__salt__的key是一個個的模塊名稱,value則是模塊裏面的一個個函數】
看個例子看看內建模塊是怎麼調用的:
vim /srv/salt/_modules/foo.py
def foo(name): return "I am %s" % name
cheng.py 也是定義的一個模塊,目的是經過調用__salt__調用上面定義的那個foo模塊中的foo函數
vim /srv/salt/_modules/cheng.py
def cheng(name): return __salt__['foo.foo'](name)
ok,同步一下模塊:
salt '*' saltutil.sync_modules
同步完成
salt-minion: - modules.cheng - modules.foo
看一下結果:
salt '*' cheng.cheng Lilith
結果:
salt-minion: I am Lilith
經過這個例子,能夠知道怎麼調用__salt__裏面的函數了。
(3)__pillar__ 以前說過,pillar不多用到
(4)__grains__ grains 比pillar還要少用到
舉例1:
import salt.config import salt.loader __opts__ = salt.config.minion_config("/etc/salt/minion") __grains__ = salt.loader.grains(__opts__) __grains__['id']
得到結果:
192.168.48.129
舉例2:
import salt.config import salt.loader __opts__ = salt.config.minion_config('/etc/salt/minion') __grains__ = salt.loader.grains(__opts__) __opts__['grains'] = __grains__ __utils__ = salt.loader.utils(__opts__) __salt__ = salt.loader.minion_mods(__opts__, utils=__utils__) __salt__['test.ping']()
(5)__context__
if not 'cp.fileclient' in __context__: __context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)