saltstack
saltstack是基于Python开发的一套C/S架构配置管理工具
底层使用ZeroMQ消息队列pub/sub方式通信


saltstack
两个主要功能:配置管理与远程执行

Saltstack基于C/S架构
服务端称  master
客户端称  minion


Saltstack工作机制
Master和Minion都以守护进程的方式运行
Master监听配置文件里定义的ret_port(接收minion请求),和publish_port(发布消息)的端口
当Minion运行时,他会自动连接到配置文件里定义的Master地址ret_port端口进行连接认证



本地yum
createrepo ./		//在提供yum源的文件目录执行

安装Master
一、服务端装包salt-master
yum -y install salt-master

二、配置文件不需要修改任何
/etc/salt/master 	


vim /etc/hosts   域名解析
192.168.4.10   ms
192.168.4.20   web1
192.168.4.22   web2
192.168.4.25   db1

三、启动服务:
systemctl start salt-master
systemctl enable salt-master
netstat -lantpu |grep ":4505|:4506"



一、客户端装包salt-minion
yum -y install salt-minion

二、修改配文件
vim /etc/salt/minion  
master: sm	指定master域名
id: web1	指定自己的域名

vim /etc/hosts
192.168.4.10  ms
192.168.4.20  web1
192.168.4.22   web2
192.168.4.25   db1

三、起服务
systemctl start salt-minion
systemctl enable salt-minion



Master与Minion互信
Minion上线后先与Master端联系,把自己的pubkey发过去
Master接收Minion的公钥后,互信建立完成


秘钥选项
salt-key -h
-L: 列出密钥
-a: 接受某个密钥
-A: 接受全部密钥
-D: 删除全部密钥
-d: 删除某个密钥

接受所有密钥,完成互信
salt-key -A -y



salt命令使用方法:

格式:salt [options] '<target>' <function> [arguments]
[options]		//选项(修饰目标)
'<target>'		//目标(所有minion主机集合)
<function> 		//函数 (模块.方法)
[arguments]		//传递给对方的参数(修饰函数)
function一般采用python的 模块.方法 样式
Minion上运行,可以采用通配符 '*’

模块
cp.get_file == scp
file.copy   == cp
cmd.run '命令'	//执行命令的模块
test.ping   ping命令

选项:
-L 列表
-E 正则
-N 匹配组
-S CIDR
-G 调用grains
-I 调用pillar

salt -L 'web1' cmd.run 'uptime'
salt -E "web[0-9]" test.ping		


分组
vim /etc/salt/master
nodegroups:
    abc: 'L@web1,web2'  可以写多台minion主机	
    other: 'E@db[0-9] and N@abc'	and是交集
   #other: 'E@db[0-9] or N@abc'	or是并集
!!!! 前面必须是四个空格

salt -N abc  test.ping

/srv/salt 是Master默认的根目录
mkdir -p /srv/salt/oh

向abc组传输文件
salt -N abc cp.get_file salt://oh/ /tmp/co



模块及功能
salt 'minion域名' sys.list_modules  列出所有可用的模块
salt  'web1'  sys.list_modules      
salt 'web2' sys.list_functions <模块名> 查看模块所有功能
salt 'db1' sys.doc <模块名>         查看模块的用法
 
例:
salt -N abc  file.cop /etc/selinux  /tmp/selinux 拷贝任意文件和目录
salt -N abc  user.add  zhangsna 2000  创建用户



Grains(收集客户端信息)
1、打标签的模块
2、命令用法

3、自带收集客户端信息
4、信息存在客户端
5、是在现有的配置文件修改



YAML规则(Master和Minion的配置文件采用YAML语法)
项目使用"-"来表示
键值对使用":"来表示
YAML使用一个固定的缩进风格表示数据层级结构关系
一般每个缩进级别由两个空格组成
注意不能用tab键
YAML的键值对采用冒号分隔
YAML的键值对对应python的字典

YAML表示形式
name: web
或
name:
  web

字典可以嵌套
hosts:
  name: web


列表项使用一个短横杠加一个空格
- web
- dba

列表可以作为一个键值对的value(值)
pkg-http: 
  - httpd
  - php



Grains是saltstack最重要的组件之一
可以获取minion端的基本信息,这些信息一般都是静态的,如CUP、内存、操作系统等
Grains存储在minion本地
管理员可以在minion端进行grains值的修改,如增加、删除等


salt 'target' grains.items	        查看grains提供的信息
salt 'web1' grains.itmes
salt 'target' grains.items [key]	查看grains指定的key信息
salt '*' saltutil.sync_grains		刷新所有配置
salt -G 'os:RedHat' cmd.run 'uptime'    匹配minion端os为RedHat的执行uptime命令

在minion上定义grains
vim  /etc/salt/minion
grains:
  role: nginx

重启:systemctl restart salt-minion


或在minion上单独定义grains
vim  /etc/salt/minion.d/grains.conf 创建grains配置文件
grains: 
  role: nginx

重启:systemctl restart salt-minion

在master上查看角色信息
salt 'web1' saltutil.sync_grains  刷新所有配置
salt 'web1' grains.item  role
salt 'web1' grains.item  |grep -i nginx



Pillar组件
pillar也是saltstack最重要的组件之一
作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用
存储在master端,存放需要提供给minion的信息
常用于敏感信息,每个minion只能访问master分配给自己的pillar信息
用于经常动态变化的信息


pillar需要一个pillar_roots来维护pillar的配置
默认pillar_roots为/srv/pillar
pillar_roots在Master配置文件中定义
例:vim /etc/salt/master
pillar_roots:
  base:
    - /srv/pillar

mkdir /srv/pillar


pillar执行时需要一个名为top.sls的入口文件
通过top.sls文件作为入口,组织其它的pillar文件
sls文件采用YAML格式
例:
cd /srv/pillar
vim top.sls
base:    #与pillar_roots定义一致
  'L@web1,web2':  #过滤目标
     - appweb     #用于包含appweb.sls
  'E@db\d':       #过滤目标
     - appdb      #用于包含appdb.sls
     - user       #用于包含user.sls
   
vim appdb.sls 
dbname: mysql                      

vim appweb.sls
appname: web
software:
  - apache
  - nginx

vim user.sls
users:
  zhangsan: 1000
  lisi: 1001


同步Pillar数据
salt '*' saltutil.refresh_pillar  刷新所有配置
salt '*' pillar.items             获取pillar全部数据
salt 'web' pillar.items	          获取pillar提供的信息
salt 'web' pillar.items appweb    获取pillar指定的key信息
salt -I 'appename:web' test.ping  使用grains信息分类匹配主机
salt -I 'appename:web' cmd.run 'uptime' 匹配minion端appename为web的执行uptime命令



 jinja模板
jinja是基于python的模板引擎
在saltstack中我们使用yaml_jinja渲染器来根据模板生产对应的配置文件
对于不同的操作系统或者不同的情况,通过Jinja可以让配置文件或者操作形成一种模板的编写方法


 jinja使用步骤
在state文件中使用"- template: jinja"声明
在模板文件中使用变量"{{name}}"声明,name为变量,自己定义
在state文件中使用"- defautls: name: value"声明


使用变量
变量的基本格式为:{{变量}}
一级字典变量格式为:{{pillar['appname']}}
二级字典变量格式为:{{pillar['flow']['maxconn']}}


判断语句
对grains的os值进行判断,根据不同的系统对apache的值进行不同的设定,这样apache就相当于是可以随机应变的值
例:{% if grains['os'] == 'CentOS' %}
    apache: httpd
    {% elif grains['os'] == 'Debian' %}
    apache: apache2
    {% endif %}

循环语句
在state中使用pillar数据,值通过jinja来访问pillar即可,多个值通过循环逐个获取
{% for user, uid in pillar,get('users',{}).items() %}
{{user}}:
  user.present:
    - uid:{{uid}}
{% endfor %}




    states基础
states是satlstack中的配置语言
安装软件包、管理配置文件都需要编写一些states sls文件
states sls使用YAML语法

salt 'web1' sys.list_state_modules           查看所有States的模块
salt 'web1' sys.list_state_functions sysctl  查看该模块功能
salt 'web1' sys.state_doc sysctl.present     查看该模块的用法



     file模块
file.managed:  文件同步模块
file.append:   文件追加模块
file.directory:  创建文件模块

例1:
vim /etc/salt/master
file_roots:
  base:
    - /srv/base
  dev:
   - /srv/dev
  prod:
   - /srv/prod

cd /srv/
mkdir base dev prod

重启服务:systemctl restart salt-master.service


cd base/
vim top.sls 
base: #名称和配置文件相对应
  '*':  #minion域名*代表所有
   - dns #和下面文件相对应
         
vim dns.sls
abc:    #名称
  file.managed:  文件同步模块
   - name: /etc/resolv.conf         同步被参考文件的内容的路径
   - source: salt://files/dns.conf  被参考文件路径
   - user: root
   - group: root
   - mode:  644
   - template: jinja
   - defaules:
     DNS: 192.168.4.100        

mkdir /srv/base/files
cd   /srv/base/files
touch dns.conf

cat  dns.conf
nameserver {{ DNS }}

检测:
salt '*' state.highstate saltenv=base  test=true
执行:
salt '*' state.highstate saltenv=base  test=false



例2:
cd  /srv/base/
vim top.sls
base:  #名称和配置文件相对应
  'L@web1,wen2': #minion域名列表
   - tex  #和下面文件相对应
       
vim tex.sls
abc:  #名称
  file.append:  #文件追加模块
   - name: /etc/resolv.conf   #追加到的文件路径
   - text:
     - DNS1:9.9.9.9 #(比上一级多两个空格),追加的内容 

检测:
salt '*' state.highstate saltenv=base  test=true
执行:
salt '*' state.highstate saltenv=base  test=false



例3:
cd /srv/base/
vim top.sls
base:   #名称和配置文件相对应
  '*':  #minion域名*代表所有
   - set  #和下面文件相对应
vim ste.sls
directory: #名称
  file.directory:  创建文件模块
   - name: /opt/rpm_pkgs 创建的文件名
   - user: root
   - group: root
   - dri_mode: 755  文件目录的权限
   - file_mode: 644 文件的权限

检测:
salt '*' state.highstate saltenv=base  test=true
执行:
salt '*' state.highstate saltenv=base  test=false



   cmd模块
cmd模块强制给minion执行命令
可以限制当某个条件满足时才执行命令
也可以限制当某个条件不满足时才执行命令
cmd.run:  命令模块
unless:  当unless条件不满足时,需要执行令
onlyif:  当onlyid条件满足时,需要执行令

例:
cd /srv/base/
vim top.sls  
base:   #名称和配置文件相对应
  '*':  #minion域名*代表所有
   - est #和下面文件相对应

vim est.sls
useradd zhangsan: #创建用户
  cmd.run:
    - unless: idd zhangsan #判断用户不存在

echo 123456 |passwd --stdin zhangsan: #给用户改密码
  cmd.run:
    - onlyif: id zhangsan  #判断用户存在
                           
检测:
salt '*' state.highstate saltenv=base  test=true
执行:
salt '*' state.highstate saltenv=base  test=false





    系统初始化
可以在base环境下创建一个init目录,将系统初始化配置的sls文件均存放在init目录下,称其为“初始化模块”

1.配置DNS
vim  /srv/salt/base/init/dns.sls
resolv_file:
  file.managed:
    - source: salt://init/files/resolv.conf
    - user: root
    - group: root
    - mode: 644

2.配置History记录时间
vim  /srv/salt/base/init/history.sls
profile_file:      #名称
  file.append:     #追加模块
    - name: /etc/profile #追加的文件路径
    - text:
      - export HISTTIMEFORMAT="%F %T" #追加的内容

3.配置内核参数优化
saltstack提供了sysctl状态模块用来进行内核参数的配置
vim /srv/salt/base/init/sysctl.sls
net.ipv4.ip_forward: #为值1开启路由
  sysctl.present:
    - value: 1    #值

4.创建用户
vim /srv/salt/base/init/user.sls
usreadd  bob:
  cmd.run:
    - unless: id bob
echo 123456 |passwd --stdin bob:
  cmd.run:
    - onlyif: id bob


   pkg模块
pkg模块可以实现软件包管理
管理的软件包包括红帽RPM包和Ubuntu的deb包等
主要方法有:
pkg.installed: 安装软件包
pkg.latest: 保持软件包最新版本
pkg.remove: 卸载软件包
pkg.purge: 下载软件包,删除配置文件
require条件:只有满足条件才执行令

   service模块  
软件部署完毕后,需要确保服务处于运行状态,并且能够实现开机自启。
service.running: 确保服务处于运行状态
service.enabled: 开机自启
service.disabled: 开机不自启
service.dead:  确保服务处于未运行状态
watch:服务如果能够正常启动,需要确保存在配置文件,设置如果配置文件存在,才启动服务。

例:在minion上域名为web1,web2的主机上安装httpd软件包,并修改侦听端口为8080.
cd /srv/salt/prod 
mkdir files

vim top.sls
prod:     #名称和配置文件相对应
  'L@web1,web2' #minion域名
   - install    #和下面文件相对应
   - etc        #和下面文件相对应
   - service    #和下面文件相对应
    
vim install.sls 
insta:            #名称
  pkg.installed:   #安装软件包模块
    - name: httpd  #软件包名

vim etc.sls
etchttp:         #名称
  file.managed:  #同步模块
    - name: /etc/httpd/conf/httpd.conf   #同步被参考文件的内容的路径
    - source: salt://files/httpd.conf   #被参考文件路径
    - template: jinja   #使用jinja模块
    - defaults: 
      PORT: 8080
    - require:         #require条件
      - pkg: insta     #pkg模块定义的函数名称

cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/

vim /srv/salt/prod/files/httpd.conf
............
Listen {{ PORT }}  #使用jinja变量
..........


vim service.sls
servi:              #名称
  service.running:  #运行模块
    - name: httpd   #运行的服务名
    - enable: true  
    - restart: true
    - watch:       #watch条件
      - file: etchttp #file模块定义的函数名称


检测:
salt '*' state.highstate saltenv=prod  test=true
执行:
salt '*' state.highstate saltenv=prod