saltstack

相对于ssh key方式管理 可并行,效率高
可用于

1.远程执行
2.配置管理
3.salt云管理

三种模式

1.local
2.master minion 主从 配置文件为 /etc/salt/master /etc/salt/minion
3.salt ssh

特别注意 salt 使用 YAML 格式 严格区分空格,空格不能错

服务端主要配置

#设置IP,确保master minion 在同一个子网
interface: 172.16.1.61
#开启并定义salt目录,目录需要自己创建
file_roots:
  base:
    - /srv/salt
 #开启并定义pillar目录,目录需要自己创建
pillar_roots:
  base:
    - /srv/pillar
#定义组,L@ 和G@ 分别表示minion和grain信息,是必加的,否则报错
nodegroups:
  web: 'L@web01,web02'
  lb: 'L@lb01,lb02'
  db: 'L@db01,db02'
  nfs: 'L@nfs01,nfs02'
#端口一般不需要改
#syndic_master_port: 4506
#publish_port: 4505

客户端主要配置

#master的主机名或IP地址,如果用主机名要有/etc/hosts解析或者DNS服务器解析
master: m01
#minion端id,这个要唯一,但没有特别的限制,只是一个代号
id: web01
#master端IP
#master_port: 4506

部署流程

master minion配置文件写好之后

systemctl enable salt-master
systemctl enable salt-minion
systemctl start salt-master
systemctl start salt-minion

#master端,添加所有minion
salt-key -A -y
#添加某个minion
salt-key -a -y minion-id
#删除所以minion
salt-key -D =y
#删除某个minion
salt-key -d -y minion-id
#测试连通性
salt '*' test.ping

常用命令

#查看cron的方法
salt '*' sys.doc 'cron'  
# 查看test的方法
salt '*' sys.doc 'test' 
#测试minion返回
salt '*' test.ping    
#执行命令,未带空格的命令可以不加引号,有空格的必须加,避免出错,都加
salt '*' cmd.run 'df -h'   
#写配置并执行 执行top.sls定义的所有文件
salt '*' state.highstate  
#运行指定的文件,支持未定义在top.sls,文件名后不能加.sls后缀,否则报错
salt '*' state.sls name
#显示所有项目名称
salt '*' grains.ls  
#列出所有grains项目名及值
salt '*' grains.items 
#按IP选
salt -G ipv4:172.16.1.41 cmd.run 'hostname' 
#按os选 ,os 字段区分大小写
salt -G os:CentOS cmd.run 'hostname' 
#copy  文件  这种方法目的地址要加文件名,不加会报错
salt-cp '*' /etc/hosts /etc/  也可用 salt '*' file.copy /etc/hosts /etc/hosts
#注意特殊字符转义的问题 用  \   
salt 'lb01' cmd.run "ifconfig | awk -F \" \" 'NR==2{print \$2}' "
salt '*' file.copy /etc/hosts /etc/hosts

###查看任务
salt '*' cron.raw_cron root     
### 增加任务,长命令需要用 " "  引起来 否则出错
salt 'backup' cron.set_job root '*/1' '*' '*' '*' '*' "ntpdate s2c.time.edu.cn >> /dev/null 2>&1"    
###删除任务
salt 'backup' cron.rm_job root "ntpdate s2c.time.edu.cn >> /dev/null 2>&1" 

简述state pillar grains三大组件

state

state是Saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等。

pillar

它用于给特定的minion定义任何你需要的数据,这些数据可以被Salt的其他组件使用。这里可以看出Pillar的一个特点,Pillar数据是与特定minion关联的,也就是说每一个minion都只能看到自己的数据,所以Pillar可以用来传递敏感数据(在Salt的设计中,Pillar使用独立的加密session,也是为了保证敏感数据的安全性)。 另外还可以在Pillar中处理平台差异性,比如针对不同的操作系统设置软件包的名字,然后在State中引用等。
pillar也是Saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板、state、API等。

grains

grains的作用是手机被控主机的基本信息,这些信息通常都是一些静态类的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这些信息对不同业务进行个性化定制。
定义grains数据的方法有两种,一种为在被控主机定制配置文件:另一种是通过主控端扩展模块API实现。区别是模块更灵活,可以通过Python编程动态定义,而
配置文件只适合相对固定的键与值。

state sls文件的定义

必要条件

无论是state还是pillar使用sls文件的定义,必须在master配置中开启 file_root 和 pillar_root的配置项,并且手动创建相关目录和调用文件(默认是没有的),还要创建top.sls文件,/srv/salt /srv/pillar都要创建.
其它在这个问题上,如果不用

salt '*' highstate

也可以不创建top.sls.因为

salt '*' state.sls name 

不需要top.sls也可以执行

创建文件及目录

mkdir -p /srv/salt
mkdir -p /srv/salt/conf
cp /etc/hosts /srv/salt/conf/

简单实例一

saltstack的任何配置严格遵循YAML语法,空格个数一定要注意
这个脚本实现拷备本地 /srv/salt/conf/hosts,替换指定主机的/etc/hosts

1.创建top.sls

vim /srv/salt/top.sls
vim top.sls  
base:
#这个'*':要加,否则highstate 命令无法用,是个通配的意思
 '*': 
 #添加的文件名,注意这个文件目录是在 /srv/salt/ ,而文件名是cp_hosts.sls
 #所以请特别注意,不加后缀,否则报错会特别长,无法分析,所以一定记住
  - cp_hosts

2.创建cp_hosts.sls文件

#注意实际的文件名是有.sls的,被坑过
vim /srv/salt/cp_hosts.sls

#目的文件
/etc/hosts:
#方法
  file.managed:
#目录是  /srv/salt/conf   其中salt目录是master文件定义的,conf 是为了方便 管理自创建的
    - source: salt://conf/hosts
    - user: root
    - group: root
    - mode: 644

3.执行

#执行指定
salt 'web01' state.sls cp_hosts
#或 执行所有
salt 'web01' highstate

实例2 待添加

实例3 待添加

关于state.sls highstate的转载解释

1、state.highstate会读取所有环境(包括base环境)的top.sls文件,并且执行top.sls文件内容里面定义的sls文件,不在top.sls文件里面记录的sls则不会被执行;
2、state.sls默认读取base环境,但是它并不会读取top.sls文件。你可以指定state.sls执行哪个sls文件,只要这个sls文件在base环境下存在; 这里的base环境即是在master中定义的目录

file_roots:
   base:
     - /srv/salt/

3、state.sls也可以指定读取哪个环境:state.sls salt_env='prod' xxxx.sls,这个xxxx.sls可以不在top.sls中记录。

常用脚本(配置)

#安装salt-master  
yum install -y salt-master
#这个手动改一下吧  shell取IP 差异太大
#sed -i 's#\#interface#interface '`ifconfig|sed...`'#g' /etc/salt/minion
systemctl start salt-master
systemctl enable salt-master

#安装salt-minion 以主机名一键配置,master 手动配置

yum install -y salt-minion
#手动改master 名
sed -i 's#\#master: salt#master: m1#g' /etc/salt/minion
sed -i 's#\#id:#id: '`hostname`'#g' /etc/salt/minion
systemctl start salt-minion
systemctl enable salt-minion
#配置出错时,卸载salt-minion
yum remove -y salt-minion
find /etc -name "salt" -exec \rm -rf {} \;

常见问题

minion no responed 错误解决方案

出现这个问题时,删除之前添加过的

1 在master

#删除这个minion
salt-key -d web1   
rm -rf /etc/salt/pki/master/minions/web1

2 在minion上操作:

#删除
rm /etc/salt/pki/minion/* -rf 
#重启服务
systemctl restart salt-minion  
#查看看有无文件(minion.pem  minion.pub)如果没有重启机器。
ls /etc/salt/pki/minion/     

3关闭两台机器SELinux和防火墙