筆記:Saltstack二次開發php
1、saltstack簡介
html
Salt 是:
一個配置管理系統,可以維護預約義狀態的遠程節點(好比,確保指定的報被安裝,指定的服務在運行)
一個分佈式遠程執行系統,用來在遠程節點(能夠是單個節點,也能夠是任意規則挑選出來的節點)上執行命令和查詢數據
開發其的目的是爲遠程執行提供最好的解決方案,並使遠程執行變得更好,更快,更簡單
Saltstack(中國用戶組 www.saltstack.cn )基於python開發,c/s架構,支持多平臺,比puppet輕量,在遠程執行命令時很是快捷,配置和使用比puppet容易,能實現puppet幾乎全部的功能。
Saltstack的優點:
有master端和minion端,執行的信息比較穩定,不容易丟失信息,或者出現失聯主機的狀況
有封裝好的http-api,咱們能夠直接啓動salt-api就能夠經過http協議進行調用。不須要本身進行第二次的封裝
2、saltstack安裝
基於centos6和centos7的差別,在兩個不一樣的操做系統中安裝saltstack也是不同的。
參考網址:
https://docs.saltstack.com/en/latest/topics/installation/rhel.html
Centos6須要先安裝擴展源,而後在進行安裝:
Master端
yum install –y salt-master yum install –y salt-api
Minion端:
yum install -y salt-minion
源碼安裝:http://note.youdao.com/noteshare?id=881bbdbb6fd7bca9f74360aa052b79a4&sub=EEDE33154E13432FA9198021015C5C25
3、saltstack的密鑰安裝
Master與Minion認證
minion在第一次啓動時,會在/etc/salt/pki/minion/(該路徑在/etc/salt/minion裏面設置)下自動生成minion.pem(private key)和 minion.pub(public key),而後將 minion.pub發送給master。master在接收到minion的public key後,經過salt-key命令accept minion public key,這樣在master的/etc/salt/pki/master/minions下的將會存放以minion id命名的 public key,而後master就能對minion發送指令了。
salt-key -L 或者salt-key 顯示全部的key
salt-key -D :刪除全部認證主機id證書
salt-key -d keys_values -y
salt-key -A:接收全部id證書請求
salt-key -a id :接受單個id證書請求
4、saltstack的配置文件詳解
Saltstack佔用兩個端口4505和4506
1. 確保master端的4505和4506端口開通
2. Minion的key確實別master接受
3. 經過test.ping 模塊,雙方均可以ping通
配置文件詳解:
http://note.youdao.com/noteshare?id=ef288d8d0abb8f3e8bf6aa5b87bfabd3&sub=wcp1478526434731795
5、saltstack的幾種模塊介紹
Runner 模塊 在master端執行的 salt-run
Module 模塊 經過master同步到minion端, 在minion執行
salt-call saltutil.sync_modules
salt-call saltutil.sync_all:包括:beacons:
clouds: engines: grains: log_handlers: modules:
output: proxymodules: renderers: returners: sdb:
states: utils:
Grins 模塊 記錄minion的屬性key:value
Pillar模塊 記錄全部minion通用的屬性,而後同步到minion端
salt-call saltutil.refresh_pillar
salt ‘*’ saltutil.refresh_pillar
1. cmd模塊
salt ‘*’ cmd.run 「df -h」
2. ping模塊
salt ‘*’ test.ping –t 5
3. cp 模塊
file_roots: base: - /export/salt/root salt根目錄:在master中file_roots定義的路徑,salt://test.txt至關於/export/salt/root/test.txt salt 'wms5test1.app.172.17.23.176' cp.get_file salt://nscd.conf /tmp/xiang.txt
4. cron模塊:
salt '*' cron.raw_cron root (查看定時任務) salt '*' cron.set_job root '*' '*' '*' '*' 1 /export/scripts/rm_log.sh salt '*' cron.rm_job root /export/scripts/rm_log.sh (寫全沒效果)
5.dnsutil模塊
salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 xiang.com salt '*' dnsutil.hosts_remove /etc/hosts xiang.com
6. file模塊:
salt '*' file.chown /etc/passwd root root salt '*' file.copy /path/to/src /path/to/dst salt '*' file.file_exists /etc/hosts salt '*' file.directory_exists /etc/ salt '*' file.get_mod /etc/passwd salt '*' file.set_mod /etc/passwd 0644 salt '*' file.mkdir /tmp/test salt '*' file.sed /export/servers/nginx/conf/nginx.conf 'debug' 'warn' salt '*' file.append /tmp/test.txt "welcome xiang" salt '*' file.remove /tmp/1.txt
7.network模塊:
salt '*' network.dig www.qq.com salt '*' network.ping www.qq.com salt '*' network.ip_addrs
8.pkg包管理模塊:
管理yum, apt-get等 salt '*' pkg.install php salt '*' pkg.remove php salt '*' pkg.upgrade (升級全部的軟件包)
9.service模塊
salt '*' service.enable nginx salt '*' service.disable nginx salt '*' service.restart nginx
Grains
自定義grians(在minion上定義的)
grains是在minion啓動時蒐集一些信息,如操做系統類型,網卡,內核版本,cpu架構等
salt "*" grains.ls 列出全部grains項目名字
salt "*app.*" grains.items 列出全部grains項目以及值
grains的信息並非動態的,並不會實時變化,它只是在minion啓動時收集到的
咱們能夠根據grains收集到的一些信息,作一些配置管理工做
在minion上:vim /etc/salt/grains
role: nginx
env: test
重啓service salt-minion restart
獲取grians:
salt "*" grains.item role env
或者:
salt -G "*" role:nginx cmd.run "hostname「
salt ‘*’grains.items
Pillar
pillar(在master上定義)(yaml語法)
在配置文件中找pillar的文件路勁:
找到之後,mkdir /export/salt/pillar
vim top.sls
base:
"*":
- test
vim test.sls
conf: xiang
而後刷新pillar: salt '*' saltutil.refresh_pillar
驗證:salt '*' pillar.items conf
或者: salt -I 'conf:xiang' test.ping
6、saltstack的api
Salt-api有兩種方式,一種是函數的形式,有人家定義好的函數,咱們能夠直接調用,直接寫python代碼調用函數或者類就能夠了。
第二種形式是salt-api有封裝好的http協議的,咱們須要啓動一個服務端。
安裝:
yum install –y salt-api
加載master的配置文件
import salt.config
master_opts = salt.config.client_config(‘/etc/salt/master’)
print(‘master_opts’)
2. 加載minion的配置文件
import salt.config
Minion_opts = salt.config.minion_config(‘/etc/salt/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'}}
自定義的模塊:
>>> local.cmd('*', "jd.meminfo", "")
{'192.168.48.129': {'meminfo': '0.31'}}
4. 若是對於執行時間過長,無法直接返回的,咱們就能夠經過異步執行的形式進行返回
cmd_async和get_cache_returns(jid)
一下代碼只能只能在master上執行,並且是隻能在master上纔可使用
__opts__ = salt.config.minion_config('/etc/salt/minion')
conf_file = __opts__['conf_file']
client = salt.client.LocalClient(conf_file)
jid = client.cmd_async(minion, function, params)
wait_time = 0
sleep_interval = 1
while wait_time < timeout:
print('wait {0} seconds'.format(sleep_interval))
time.sleep(sleep_interval)
returns = client.get_cache_returns(jid)
if returns:
return returns
wait_time += sleep_interval
5. 客戶端執行salt命令:
>>> import salt.config
>>> import salt.client
>>> caller = salt.client.Caller(‘/etc/salt/minion’)
>>> caller.cmd("test.ping")
True
相似shell命令的salt-call,能夠在minion端執行salt的命令,測試連通性什麼的
6. Master端執行salt-run
>>> 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']}
7. Grains
>>> 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‘
其餘的一些變量
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']()
7. Salt的內置環境變量:
在python的交互環境中,這些變量是不生效的,只有在自定義的模塊,活着salt執行時才生效
__opts__ 配置文件,類型
__salt__ 執行modules
__salt__['cmd.run']('fdisk -l')
__salt__['network.ip_addrs']()
__pillar__ pillar
__grains__ grains
__context__
if not 'cp.fileclient' in __context__:
__context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)
6、saltstack的httpapi
在官網跟新yum源信息:
yum安裝
yum install -y gcc make python-devel libffi-devel salt-api openssl
pip install cherrypy
生成證書:
#cd /etc/salt
#mkdir keycrt
#cd keycrt
#openssl genrsa –out key.pem 4096
#openssl req –new –x 509 –key key.pem –out cert.pem –days 1826
3. 配置用戶以及權限:
首先須要在master上檢查配置文件:
default_include: master.d/*.conf
interface: 192.168.48.128
conf_file: /etc/salt/master
pki_dir: /etc/salt/pki/master
auto_accept: True
file_roots:
base:
- /srv/salt/
log_file: /var/log/salt/master
log_level_logfile: debug
b. 配置salt-api的配置文件:
[root@localhost master.d]# cd /etc/salt/master.d/
[root@localhost master.d]# ls
api.conf eauth.conf
[root@localhost master.d]#
[root@localhost master.d]# cat api.conf
rest_cherrypy:
port: 8000
ssl_crt: /etc/salt/keycrt/cert.pem
ssl_key: /etc/salt/keycrt/key.pem
[root@localhost master.d]# cat eauth.conf
external_auth:
pam:
saltapi:
- .*
- '@wheel'
- '@runner'
建立用戶:
c. 建立用戶
useradd -M -s /sbin/nologin/ saltapi
echo 「saltapi」 |passwd saltapi --stdin
注意這個應用名和上面的saltapi要對應一致。
啓動salt-api
systemctl restart salt-api
netstat –anp |grep 8000
對於ubuntu系統,咱們可能使用https也是無法使用,咱們可使用http協議,具體的配置以下:
root@ling-virtual-machine:/etc/salt/master.d# cat api.conf
rest_cherrypy:
port: 8000
disable_ssl: True
#ssl_crt: /etc/salt/keycrt/cert.pem
#ssl_key: /etc/salt/keycrt/key.pem
注意以上的: disable_ssl: True
而後把ssl祕鑰和公鑰註釋掉,eauth.conf不發生變化
獲取tocken: http協議的
curl -X POST -k http://192.168.48.134:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 240 100 197 100 43 45 9 0:00:04 0:00:04 --:--:-- 45
{
"return": [
{
"eauth": "pam",
"expire": 1517235285.554001,
"perms": [
".*",
"@wheel",
"@runner"
],
"start": 1517192085.554001,
"token": "105ee1f28109d67855ce7898e75e173a678f5174",
"user": "saltapi"
}
]
}
獲取tokon: https協議的(centos7)
[root@localhost master.d]# curl -X POST -k https://192.168.48.131:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 240 100 197 100 43 908 198 --:--:-- --:--:-- --:--:-- 912
{
"return": [
{
"eauth": "pam",
"expire": 1517235312.537542,
"perms": [
".*",
"@wheel",
"@runner"
],
"start": 1517192112.537541,
"token": "bd5922438e9ae10db039816728c2b86f9462a0bb",
"user": "saltapi"
}
]
}
經過postman來獲取token
Headers裏面是用來存放headers的信息的
Body裏面來存放數據的,經常使用的data數據就是x-www-form-urlencoded
form-data 是用來存放頁面form表單數據的
只要salt-api不重啓,tocken就不會過時,salt-api重啓之後,tocken就會過時
經過curl來獲取執行module:root@ling-virtual-machine:/etc/salt/master.d# curl -k http://192.168.48.134:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ec623ed62de7dd62cfdadb94ad0044b7f46c9549" -d client='local' -d tgt='*' -d fun='test.ping'return:192.168.48.129: true運行runnerroot@ling-virtual-machine:/etc/salt/master.d# curl -k http://192.168.48.134:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ec623ed62de7dd62cfdadb94ad0044b7f46c9549" -d client='runner' -d fun='manage.status' return:- down: [] up: - 192.168.48.129