saltstack源碼詳解一
@(python之路)[saltstack源碼詳解一]
saltstack源碼詳解
目錄
初識源碼流程
環境準備:
# 安裝
yum install salt-ssh
pip3 install salt-ssh
# 命令
salt-ssh
# 配置
/etc/salt/roster
# 功能
salt-ssh "*" cmd.run "ls"
下面我們查看源碼
入口
yum install salt-ssh后,他就會把代碼放到python中的lib中。他會觸發這個腳本
from salt.scripts import salt_ssh
if __name__ == '__main__':
salt_ssh()
他會調用這里邊的東西并執行。
解析salt-ssh "*" cmd.run "ls" -i 命令
源碼流程:
- 啟動命令時python腳本
- 讀取默認配置文件
obj = salt.clissh.SaltSSH()
obj.run() - 執行命令
obj = SSH(配置文件)
obj.run() - 創建進程間供享的隊列;[]
- 讀取配置文件中的主機,給每個符合條件的主機創建一個進程;
host = next(target_iter)
routine = MultiprocessingProcess(target=self.handle_routine,args=args)
每個進程執行得到結果后,將結果放入隊列中
ret = self.handle_routing(……)
?觸發Single
??觸發Shell
??觸發terminal
?que.put(ret)
salt日常使用
from salt.client.ssh.shell import Shell
shell = Shell({_ssh_version:(4,9 )})
result = shell.exec_cmd("ls")
print(result)
預留python接口:
from salt.client.ssh.client import SSHClient
client = SSHClient()
ret = client.cmd('*','cmd.run',('ls',),30)
print(ret)
1.grains.items
salt-ssh '*' grains.items
grains一般用于獲取服務的靜態信息
自定義:
# /srv/salt/_grains/xx.py
預留python接口
from salt.client.ssh.client import SSHClient
client = SSHClient()
ret = client.cmd("*",'grains.items')
print(ret)
2.pillar.items
salt-ssh "*" pillar.items
pillar一般用于獲取服務器動態信息
方式一:
# /srv/pillar/top.sls
base:
"*": # "*" 表示所有的分組
- xxx # 文件名
# /srv/pillar/xxx.sls
x1:
{% if grains['os_family'] == 'Debian' %}
xxx1: 111111111111111
{% elif grains['os_family'] == 'RedHat' %}
xxx1: 222222222222222
{% elif grains['os'] == 'Arch' %}
xxx1: 333333333333333
{% endif %}
2/3: 是否可以用python腳本實現
# /etc/salt/master
ext_pillar:
- xiaohua:
api: 123
- tom:
# /var/cache/salt/master/extmods/pillar/tom.py # [**推薦使用**]
def ext_pillar(minion_id,pillar,*args,**kwargs):
import time
return {'alexcccccccccccccctime':str(time.time())}
# /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py
def ext_pillar(minion_id,pillar,*args,**kwargs):
import time
return {'alexcccccccccccccctime':str(time.time())}
總結pillar源碼分析:
salt/script.py
client = salt.cli.ssh.SaltSSH()
client.run()
salt/cli/ssh.py
# self.config是讀取的配置文件
ssh = salt.client.ssh.SSH(self.config)
ssh.run()
salt/client/ssh/__init__.py
class SSH(object):
def run(self, jid=None):
if self.opts.get('raw_shell', False):
fun = 'ssh._raw'
args = argv
else:
fun = argv[0] if argv else ''
args = argv[1:]
for ret in self.handle_ssh():
pass
def handle_ssh():
routine = MultiprocessingProcess(target=self.handle_routine,args=args)
routine.start()
def handle_routine(self, que, opts, host, target, mine=False):
single = Single(...)
single.run()
salt/client/ssh/__init__.py
class Single(object):
def run(self, deploy_attempted=False):
stdout, retcode = self.run_wfunc()
return stdout, stderr, retcode
def run_wfunc(self):
# 實例化Pillar對象
pillar = salt.pillar.Pillar(
opts_pkg,
opts_pkg['grains'],
opts_pkg['id'],
opts_pkg.get('environment', 'base')
)
pillar_dirs = {}
# pillar對象.pillar => 去三個地方獲取所有pillar
pillar_data = pillar.compile_pillar(pillar_dirs=pillar_dirs)
print(pillar_data)
salt/pillar/__init__.py
class Pillar(object):
def __init__(...):
# 去中找自定義pillar
# /var/cache/salt/master/extmods/pillar/alex.py # [**推薦使用**]
# /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py
# ['xiaohua','tom','cmd_json',.....]
self.ext_pillars = salt.loader.pillars(ext_pillar_opts, self.functions)
def compile_pillar(self, ext=True, pillar_dirs=None):
# 1. top.sls
# 去中找自定義pillar
# 2. /var/cache/salt/master/extmods/pillar/alex.py # [**推薦使用**]
# 3. /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py
pillar1 = self.render_pillar('top.cls')
pillar2 = self.ext_pillar(pillar1,...)
return pillar1 + pillar2
def self.ext_pillar(...):
return self._external_pillar_data(....)
def _external_pillar_data(self, pillar, val, pillar_dirs, key):
ext = self.ext_pillars[key](self.minion_id,pillar,*val)
return ext

浙公網安備 33010602011771號