57. Python saltstack 二次開發(2)

回顧上一節:python

grains 和 pillar 都是定義他們的屬性的shell

grains 定義在minion端(定義完必須重啓minion,才能生效)vim

pillar  定義在master端(無需重啓便可生效)api

saltstack的apibash

Salt-api有兩種方式:服務器

第一種:是函數的形式,有人家定義好的函數,咱們能夠直接調用,直接寫python代碼調用函數或者類就能夠了。異步

第二種:形式是salt-api有封裝好的http協議的,咱們須要啓動一個服務端。async



登陸官網查看文檔:ide

image.png


文檔內容,以下:函數

image.png


安裝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端,若是想查看配置文件的參數屬性:

image.png


2. 加載minion的配置文件

import salt.config
minion_opts = salt.config.minion_config('/etc/salt/minion')
print ('minion_opts')


minion端,想看配置文件內的參數屬性:

image.png


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


image.png


執行命令獲取結果:

# salt '*' jd.hello  ajing

結果輸出,如圖:

image.png


python交互界面中這樣獲取:

image.png


Master端執行salt-run

若是對於執行時間過長,無法直接返回的狀況,咱們就能夠經過異步執行的形式進行返回 cmd_asyncget_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路徑參數:

image.png

先建立 _runner 目錄,修改文件 /etc/salt/master 的 runner路徑參數:

image.png

記得重啓master服務

經過python命令測試並確認目錄位置:

image.png


【補充】

客戶端的獲取結果的方式爲:

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__)
相關文章
相關標籤/搜索