一. SaltStack安裝
1. 安裝saltstack服務端和客戶端:
http://repo.saltstack.com #進入網站安裝官方源
yum install salt-master salt-minion #服務端
yum install salt-minion #客戶端
2. 配置客戶端的master:
vim /etc/salt/minion
master: 172.16.1.211
3. 在服務端建立客戶端的認證(服務端執行):
salt-key -A #認證所有 -a 認證單個
二. SaltStack基本操作
1.在所有客戶端執行測試命令:
salt "*" test.ping
2.在所有minion(客戶端)上執行‘uptime’命令:
salt '*' cmd.run 'uptime'
3.拷貝文件到所有客戶端的tmp目錄下面:
salt-cp '*' install.log /tmp/install.log
4.saltstack的配置管理:
vim /etc/salt/master
file_roots:
base:
- /srv/salt/
mkdir /srv/salt
cd /srv/salt
vim apache.sls #安裝apache並啓動
apache-install:
pkg.installed:
- names:
- httpd
- httpd-devel
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
salt ‘*’ state.sls apache #執行狀態管理腳本
5.編輯salt的入口文件:
PS: top-file文件要放在base環境下。
vim top.sls
base:
'SH_T_ansiblecli_02.gigold-idc.com':
- apache
'SH_T_ansiblecli_03.gigold-idc.com':
- apache
salt ‘*’ state.highstate #通過入口文件執行安裝apache的腳本
salt ‘*’ state.highstate test=True #生產環境上面命令很危險,要先測試下
三. SaltStack-數據系統Grains
1.查看客戶機的所有grains信息:
salt 'SH_T_test_03.gigold-idc.com' grains.items
2.查看客戶機的IP地址:
salt 'SH_T_test_03.gigold-idc.com' grains.get ip_interfaces:eth0
3.通過grains判斷在哪些客戶端上執行‘W’命令:
salt -G 'os:Centos' cmd.run 'w'
4.客戶端自定義grains並通過top篩選:
vim /etc/salt/grains #在客戶端定義,寫完要重啓minion
roles:
- webserver
- memcache
/etc/init.d/salt-minion restart
vim top.sls #服務端
base:
'roles:webserver': #匹配roles變量爲webserver的主機
- match: grain #要定義通過grain方法獲取參數
- apache
salt ‘*’ state.highstate #通過top篩選匹配的grain
5.通過master刷新minion的grains參數:
salt '*' saltutil.sync_grains
6.通過Python腳本自定義獲取grains參數:
vim /srv/salt/_grains/my_grains.py #文件創建在master服務器上
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def my_grains():
#初始化一個grains字典
grains = {}
grains['iaas'] = 'openstack'
grains['edu'] = 'wmjedu'
return grains
salt ‘*’ saltutil.sync_grains #編輯完後要記得推送到minion上
7. Grains的優先級:
從高到低:系統自帶--grains文件---minion配置文件--master自定義的
四. SaltStack-數據系統Pillar
定義: Pillar是動態的,給特定的minion指定特定的數據 ,只有指定的minion可以看到(所有相對安全,可以用來設置密碼)。
1.在服務端創建Pillar的base環境:
vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir -p /srv/pillar
/etc/init.d/salt-master restart
2.自己創建pillar:
vim /srv/pillar/apache.sls
my-pillar:
{%if grains['os'] == 'CentOS'%}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
vim /srv/pillar/top.sls
#配置在哪臺主機上面使用pillar
base:
'SH_T_ansiblecli_02.gigold-idc.com':
- apache
salt ‘*’ saltutil.refresh_pillar #配置完成後要記得刷新pillar
salt ‘*’ pillar.items #查看配置的pillar
3.刷新pillar:
salt '*' saltutil.refresh_pillar
4.通過pillar來篩選哪些minion執行操作:
salt -I "apache:httpd" cmd.run 'w'
5.grains和pillar的區別:
五. SaltStack-遠程執行-進階
1.多種判斷需要執行Minion的方法:
salt -L 'SH_T_test_03, SH_T_ansiblecli_02' cmd.run 'w' #通過列表
salt -S '172.16.1.213' test.ping #通過ip判斷
salt -S '172.16.1.0/24' test.ping #通過網段判斷
vim /etc/salt/master #配置nodegroups來分組
nodegroups:
web: 'L@SH_T_test_03.gigold-idc.com,SH_T_ansiblecli_02.gigold-idc.com'
salt -N web test.ping #通過-N來指定
2.將執行返回值寫入到數據庫中:
執行數據庫腳本:
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
--
-- Table structure for table `jids`
--
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX jid ON jids(jid) USING BTREE;
--
-- Table structure for table `salt_returns`
--
DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Table structure for table `salt_events`
--
DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
vim /etc/salt/master
#文件底部添加
master_job_cache: mysql
mysql.host: '172.16.1.214'
mysql.user: 'root'
mysql.pass: 'Root123'
mysql.db: 'salt'
mysql.port: 3306
/etc/init.d/salt-master restart
salt ‘*’ cmd.run ‘free -m’ #執行完成後可以在數據庫裏面查看
六. SaltStack-配置管理
1.”top.sls”文件必須放在base環境下。
file_roots:
base:
- /srv/salt/base
test:
- /srv/salt/test
prod:
- /srv/salt/prod
2.拷貝文件到Minion上:
vim dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
DNS_SERVER: 223.6.6.6
salt ‘*’ state.sls dns #直接執行
下面用top來執行
vim top.sls
base:
'*':
- dns
salt ‘*’ state.highstate #使用高級狀態執行
3.狀態間的依賴關係:
1.我依賴誰:只要依賴的狀態爲正常,我就執行。
- require:
- pkg: lamp-pkg (狀態模塊:狀態名)
- file: apache-config
2.我被誰依賴:(一般用不到)
- require_in: (寫在被依賴方)
- service: mysql-service
3.我監控誰:監控某個狀態,只有發生變化我才執行,
- watch:
4.我被誰監控:(一般用不到)
- watch_in:
5.我引用誰:
include:
6.我擴展誰:
3.jinja模板的使用方法:
1.模板裏面賦值:
- template: jinja
- defaults:
PORT: 8080
{{ PORT }}
2.使用grains參數獲取本地IP: {{ grains['fqdn_ip4'][0] }}
3.使用salt遠程執行模塊獲取網卡MAC: {{ salt['network.hw_addr']('eth0') }}
4.使用pillar參數: {{ pillar['apache'] }}
3.include用法:
vim env_init.sls
include:
- init.dns
- init.history
- init.sysctl
4.以測試模式執行:
salt '*' state.highstate test=True
七. SaltStack-實踐案例
https://github.com/unixhot/saltbook-code #SaltStack實踐案例源碼
1.安裝haproxy案例
include:
- pkp.pkg-init
haproxy-install:
file.managed:
- name: /usr/local/src/haproxy-1.6.11.tar.gz
- source: salt://haproxy/files/haproxy-1.6.11.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/src && tar zxf haproxy-1.6.11.tar.gz && cd haproxy-1.6.11 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
- unless: test -d /usr/local/haproxy #後面條件爲“假”時執行
- require: #下面兩個條件要執行成功才能執行
- pkg: pkg-init #代表pkg-init裏面的Pkg
- file: haproxy-install
haproxy-init:
file.managed:
- name: /etc/init.d/haproxy
- source: salt://haproxy/files/haproxy.init
- user: root
- group: root
- mode: 755
- require:
- cmd: haproxy-install
cmd.run:
- name: chkconfig --add haproxy
- unless: chkconfig --list | grep haproxy
- require:
- file: haproxy-init
net.ipv4.ip_nonlocal_bind:
sysctl.present:
- value: 1
haproxy-config-dir:
file.directory:
- name: /etc/haproxy
- user: root
- group: root
- mode: 755
2. salt的兩種狀態間關係圖表:
八. 用SaltStack-進階
1.salt支持的三中工作模式:
一。本地模式(salt-call)
二。多master模式
三。代理模式(Syndic):
Syndic必須運行在一個master上,然後連到另外一個更高級的master(這臺機器就可以管理syndic-master所管理的機器)。
2.salt自定義grains:
mkdir /srv/salt/base/_grains #自定義的必須放這裏
vim my_grains.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def my_grains():
#初始化一個grains字典
grains = {}
grains['iaas'] = 'openstack'
grains['edu'] = 'wmjedu'
return grains
salt ‘*’ saltutil.sync_grains #同步自定義的grains到minion
salt ‘*’ grains.item ‘hehe1’ #查看自定義的grains
PS: Grains是靜態的,收集一次就不會變了,需要自己用“saltutil.sync_grains”刷新!
3.salt自定義模塊:
mkdir /srv/salt/base/_modules #文件夾名稱不能變
vim my_disk.py
def list():
cmd = 'df -h'
ret = __salt__['cmd.run'](cmd) #調用salt自帶cmd.run模塊執行
return ret
salt ‘*’ saltutil.sync_modules #下發自定義模塊到minion
salt ‘*’ my_disk.list #執行自定義模塊
PS: “/usr/lib/python2.6/site-packages/salt/modules/ ” 這個是salt官方模塊放的位置,可以參考來寫.
4.Salt的無master下運行:
首先要安裝salt-minion,然後修改配置文件:
# vim /etc/salt/minion
file_client: local
還要配置:
file_roots
salt-call –local state.highstate #通過這條命令在本地執行
5. Salt-ssh的使用:
# yum install salt-ssh
# vim /etc/salt/roster #配置客戶端列表
SH_T_test_04:
host: 172.16.1.214
user: root
port: 22
# salt-ssh ‘*’ test.ping -i #第一次連接會自動安裝公鑰到客戶端上
# salt-ssh ‘*’ -r ifconfig # -r後面可以直接寫命令
# salt-ssh ‘*’ state.highstate
# salt-ssh ‘*’ state.sls web.apache #執行狀態文件