一、salt的概念
salt是一個配置管理系統,能夠維護預定義狀態的遠程節點(比如,確保指定的報被安裝,指定的服務在運行)。一個分布式遠程執行系統,用來在遠程節點(可以是單個節點,也可以是任意規則挑選出來的節點)上執行命令和查詢數據。開發其的目的是為遠程執行提供最好的解決方案,並使遠程執行變得更好,更快,更簡單。
saltstack(中國用戶組www.saltstack.cn)基於Python開發,c/s架構支持多平台,比puppet輕量,在遠程執行命令時非常快捷,配置和使用比puppet容易,能實現puppet幾乎所有的功能。
saltstack的優勢:有master端和minion端,執行的信息比較穩定,不容易丟失信息,或者出現失聯主機的情況;有封裝好的http-api,可以直接啟動salt-api就可以通過http協議進行調用。不需要進行第二次的封裝。
二、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
三、saltstack的設置
1.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證書請求
2.saltstack遠程執行機器
(1)-E, --pcre,通過正則表達式進行匹配:
salt -E 'web(9|10)*' test.ping -t 1
(2)-L, --list, 主機id進行過濾:
salt -L "*app*" cmd.run "df -h"
(3) -G, --grain, 根據被控主機的grains信息進行過濾
salt -G 'role:nginx' cmd.run "ls /export"
(4) -I, --pillar, 根據被控主機的pillar信息進行過濾
salt -I 'myname:xiang' test.ping -t 5
(5) -S, --ipcidr, 根據minion的ip地址進行匹配
salt -S 192.168.1.1 test.ping
salt -S 192.168.1.0/24 test.ping
salt -S 192.168.0.0/16 test.ping
salt -S 192.0.0.0/8 test.ping
(6)檢查客戶端是否掛掉:
salt-run manage.status |head
salt-run manage.down
3.saltstack配置文件詳解
saltstack占用兩個端口4505和4506:
確保master端的4505和4506端口開通
Minion的key確實別master接受
通過test.ping 模塊,雙方都可以ping通
配置文件詳解:http://note.youdao.com/noteshare?id=ef288d8d0abb8f3e8bf6aa5b87bfabd3&sub=wcp1478526434731795
4.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
cmd模塊 salt ‘*’ cmd.run “df -h”
ping模塊 salt ‘*’ test.ping –t 5
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
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 (寫全沒效果)
dnsutil模塊
salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 xiang.com
salt '*' dnsutil.hosts_remove /etc/hosts xiang.com
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
network模塊:
salt '*' network.dig www.qq.com
salt '*' network.ping www.qq.com
salt '*' network.ip_addrs
pkg包管理模塊:
管理yum, apt-get等
salt '*' pkg.install php
salt '*' pkg.remove php
salt '*' pkg.upgrade (升級所有的軟件包)
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
5.saltstack的api
salt-api有兩種方式,一種是函數的形式,有定義好的函數,可以直接調用,直接寫Python代碼調用函數或者類就可以了。
第二種形式是salt-api有封裝好的http協議,需要啟動一個服務端
(1)加載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端執行ssh命令,測試連通性
(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']()
(8)saltstack的內置變量
在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__)
四、saltstack的httpapi
1.在官網更新yum源信息
2.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 4098 #openssl req –new –x 509 –key key.pem –out cert.pem –days 1826
3.配置用戶以及權限
a.首先需要在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的配置文件
#cd /etc/salt/master.d/ #ls api.conf eauth.conf # cat api.conf rest_cherrypy: port: 8000 ssl_crt: /etc/salt/keycrt/cert.pem # cat eauth.conf external_auth: pam: saltapi: - .* - '@wheel' - '@runner'
c.創建用戶
useradd -M -s /sbin/nologin/ saltapi
echo “saltapi” |passwd saltapi --stdin
注:這個用戶名和上面的saltapi要對應一致
d.啟動salt-api
systemctl restart salt-api
netstat –anp |grep 8000
4.對於Ubuntu系統,可能使用https也是沒法使用的,我們可以使用http協議,具體配置如下:
# 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不發生變化
a.獲取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" } ] }
獲取tocken:http協議的(centos7的)
]# 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" } ] }
b.通過postman來獲取tocken
Headers里面是用來存放headers的信息的
Body里面來存放數據的,常用的data數據就是x-www-form-urlencoded
form-data 是用來存放頁面form表單數據的
只要salt-api不重啟,tocken就不會過期,salt-api重啟以后,tocken就會過期
c.通過postman來獲取執行module
c.通過curl來獲取執行module
# 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 運行runner 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='runner' -d fun='manage.status' return: - down: [] up: - 192.168.48.129