SaltStack学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SaltStack学习笔记相关的知识,希望对你有一定的参考价值。

一、三种运行方式

  • local
  • C/S架构(master/minion) -- 并行:使用ZeroMQ消息队列,所有并发执行
  • masterless(salt ssh) -- 串行:一个一个执行

二、安装
安装master

yum -y install salt-master

安装minion

yum -y install salt-minion

在minion节点修改minion配置文件,指定master,修改自己的ID

vim /etc/salt/minion
master: 192.168.0.185
id: minion.saltstack.com

在master上给minion授权证书

salt-key                           #查看未被授权的minion节点
salt-key -a minion.saltstack.ocom  #授权
salt-key                           #查看被授权的minion节点

三、salt远程执行
远程执行三大功能

  • 目标(targeting)    -->某一个主机、某一组主机、所有主机
  • 模块(Module)       -->哪个模块的哪个方法
  • 返回(Returnners) -->返回值

四、saltstack对象

概念:

  在Master上可以通过不同的Target去管理不同的Minion

匹配方式

1.正则匹配

在操作与管理Minion时可以通过正则表达式来匹配Minion ID的方式去管理它们.

[[email protected] ~]# salt -E ‘sal*‘  test.ping
salt:
    True

2.列表匹配

[[email protected] ~]# salt -L ‘minion,minion1‘  test.ping
minion:
    True
minion1:
    True

3.Grians匹配

[[email protected] ~]# salt -G ‘os:CentOS‘ test.ping
salt:
    True
#其中os:CentOS是一组键值对

4.Pillar匹配

[[email protected] ~]# salt -I ‘key:value‘ test.ping
minion:
    True
minion1:
    True
#其中key:value是一组键值对,跟Grians的键值类似

5.组匹配

[[email protected] ~]# salt -N groups test.ping
minion:
    True
minion1:
    True
#在saltstack系统中也可以提前给minion定义组角色,但需要提前知道minion ID信息才能把它定义到某个组中.groups是我们在master配置文件中定义的组名称

6.复合匹配

[[email protected] ~]# salt -c ‘[email protected]:MacOS or [email protected]’ test.ping
minion:
    True
minion1:
    True
#os:MacOS or  [email protected]是复合组合,支持使用and和or 关联多个条件

7.CIDR匹配

[[email protected] ~]# salt -c ‘192.168.1.0/24’ test.ping
minion:
    True
minion1:
    True
#192.168.1.0/24是一个指定的CIDR网段,这里CIDR匹配的IP地址是Minion连接Master 4505端口的来源地址

五、Master和Minion认证流程
Master的/etc/salt/pki/master目录下和Minion的/etc/salt/pki/minion目录下都有minion.pem(私钥)和minion.pub(公钥)
认证流程就是互相交换公钥:
Master把Minion的公钥放在/etc/salt/pki/master/minions的目录下

[[email protected] minions]# ls
minion.saltstack.com     #minion的公钥名称,以minion的ID命名

Minion把Master的公钥放在/etc/salt/pki/minion目录下

└── minion
├── minion_master.pub #master的公钥名称
├── minion.pem
└── minion.pub

六、salt数据系统
Grains
概念:

  • Grains是SaltStack记录Minion的一些静态信息的组件.
  • Grains里面记录着每台Minion的一些常用属性,比如:CPU、内存、磁盘、网络信息等.
  • 我们可以通过grains.items查看某台Minion的所有Grains信息.
  • Minion的Grains信息是Minion启动的时候采集汇报给Master的

测试grains

[[email protected] ~]# salt ‘*‘ grains.items #显示所有minion的信息
minion.saltstack.com:
----------
SSDs:
biosreleasedate:
07/02/2015
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
- apic
- sep
- mtrr
- pge
- mca
- cmov
- pat
- pse36
- clflush
- dts
- mmx
- fxsr
- sse
- sse2
- ss
- syscall
- nx
- rdtscp
- lm
- constant_tsc
- arch_perfmon
- pebs
- bts
- nopl
- xtopology
- tsc_reliable
- nonstop_tsc
- aperfmperf
- pni
- pclmulqdq
- ssse3
- cx16
- pcid
- sse4_1
- sse4_2
- x2apic
- popcnt
- tsc_deadline_timer
- aes
- xsave
- avx
- f16c
- rdrand
- hypervisor
- lahf_lm
- ida
- arat
- epb
- pln
- pts
- dtherm
- fsgsbase
- tsc_adjust
- smep
cpu_model:
Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
cpuarch:
x86_64
domain:
fqdn:
minion
fqdn_ip4:
- 221.192.153.46
fqdn_ip6:
- fe80::20c:29ff:fe14:16f9
gpus:
|_
----------
model:
SVGA II Adapter
vendor:
unknown
host:
minion
hwaddr_interfaces:
----------
eno16777736:
00:0c:29:14:16:f9
lo:
00:00:00:00:00:00
id:
minion.saltstack.com
init:
systemd
ip4_interfaces:
----------
eno16777736:
- 192.168.0.9
lo:
- 127.0.0.1
ip6_interfaces:
----------
eno16777736:
- fe80::20c:29ff:fe14:16f9
lo:
- ::1
ip_interfaces:
----------
eno16777736:
- 192.168.0.9
- fe80::20c:29ff:fe14:16f9
lo:
- 127.0.0.1
- ::1
ipv4:
- 127.0.0.1
- 192.168.0.9
ipv6:
- ::1
- fe80::20c:29ff:fe14:16f9
kernel:
Linux
kernelrelease:
3.10.0-229.el7.x86_64
locale_info:
----------
defaultencoding:
UTF-8
defaultlanguage:
en_US
detectedencoding:
UTF-8
localhost:
minion
lsb_distrib_id:
CentOS Linux
machine_id:
af38bc2fa53342ab90e8fd3b887abb2d
manufacturer:
VMware, Inc.
master:
192.168.0.116
mdadm:
mem_total:
475
nodename:
minion
num_cpus:
1
num_gpus:
1
os:
CentOS
os_family:
RedHat
osarch:
x86_64
oscodename:
Core
osfinger:
CentOS Linux-7
osfullname:
CentOS Linux
osmajorrelease:
7
osrelease:
7.1.1503
osrelease_info:
- 7
- 1
- 1503
path:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
productname:
VMware Virtual Platform
ps:
ps -efH
pythonexecutable:
/usr/bin/python
pythonpath:
- /usr/bin
- /usr/lib64/python27.zip
- /usr/lib64/python2.7
- /usr/lib64/python2.7/plat-linux2
- /usr/lib64/python2.7/lib-tk
- /usr/lib64/python2.7/lib-old
- /usr/lib64/python2.7/lib-dynload
- /usr/lib64/python2.7/site-packages
- /usr/lib64/python2.7/site-packages/gtk-2.0
- /usr/lib/python2.7/site-packages
pythonversion:
- 2
- 7
- 5
- final
- 0
saltpath:
/usr/lib/python2.7/site-packages/salt
saltversion:
2015.5.10
saltversioninfo:
- 2015
- 5
- 10
- 0
selinux:
----------
enabled:
True
enforced:
Permissive
serialnumber:
VMware-56 4d c5 82 37 d8 1e 0a-87 fd 88 f6 6c 14 16 f9
server_id:
748666745
shell:
/bin/sh
systemd:
----------
features:
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
version:
219
virtual:
VMware
zmqversion:
3.2.5

[[email protected] ~]# salt -G ‘os:CentOS‘ test.ping #在所有minion的信息中过滤出系统为centos的执行ping操作
minion.saltstack.com:
True
注意: 所有的minion grains信息都可以作为过滤条件

自定义Grains的方法:

  • 通过Minion配置文件定义
  • 通过Grains相关模块定义
  • 通过Python定义

通过Minion配置文件定义
Minion端

vim /etc/salt/grains #自定义的grains都写在这个配置文件里
cloud: openstack #自定义一个grains,相当于key:value的形式

Master端

由于minion做了修改所以得在master端更新一下信息,才能获取到
[[email protected] ~]# salt ‘*‘ saltutil.sync_grains #更新

测试

[[email protected] ~]# salt -G ‘cloud:openstack‘ test.ping 
minion.saltstack.com:
True

Pillar
概念:
主要作用就是存储和定义配置管理中需要的一些数据,比如软件版本号、用户名密码等信息,只有指定的Minion可以看到.它的定义存储格式跟grains类似

七、执行结果处理

1.概念:

  通过Return我们可以对SaltStack的每次操作进行记录,mysql目前已经支持30种数据存储与接口
2.Return流程
Return是在Master端触发任务,然后Minion端接受处理任务后直接与Return岑楚服务器建立连接,然后把数据Return存到存储服务器.
注意:因为这个过程都是Minion端操作存储服务器,所以要确保Minion端的配置跟依赖包是正确的
3.使用Mysql作为Return存储方式

安装mysql(这里把master作为mysql数据库)

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-server
systemctl start mysql 

配置mysql

#创建salt数据库
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
#使用salt数据库
USE `salt`;
#删除原来的jids表
DROP TABLE IF EXISTS `jids`;
#创建jids表
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
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;
#删除salt_events表
DROP TABLE IF EXISTS `salt_events`;
#创建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;
#授权
grant all on salt.* to [email protected]% identified by salt;

测试MySQL

mysql -u salt -p -h 192.168.0.116 
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| salt               | #salt需要的数据库
+--------------------+
mysql> use salt;
mysql> show tables;   #salt数据库下面的表结构
+----------------+
| Tables_in_salt |
+----------------+
| jids | #JobID
| salt_events    |    #salt事件
| salt_returns   |    #salt执行命令的返回结果
+----------------+

配置Master

vim /etc/salt/master
#在最后一行添加:
mysql.host: 192.168.0.116
mysql.user: salt
mysql.pass: salt
mysql.db: salt
mysql.port: 3306    
systemctl restart salt-master    

配置Minion(暂时需要在minion端也得配置)

vim /etc/salt/minion
#在最后一行添加    
mysql.host: 192.168.0.116
mysql.user: salt
mysql.pass: salt
mysql.db: salt
mysql.port: 3306    
systemctl restart salt-minion

测试执行命令的结果是否存到数据库里

Master:
[[email protected] ~]#mysql
mysql> use salt;
mysql> select * from salt_returns
Empty set (0.01 sec) #可以看到现在是空的

执行命令:

[[email protected] ~]# salt ‘*‘ cmd.run ‘df -h‘ --return 
mysql> select * from salt_returns
| cmd.run | 20161004173011028071 | "Filesystem Size Used Avail Use% Mounted on\n/dev/sda5 17G 17G 996M 95% /\ndevtmpfs 230M 0 230M 0% /dev\ntmpfs 238M 92K 238M 1% /dev/shm\ntmpfs 238M 8.9M 229M 4% /run\ntmpfs 238M 0 238M 0% /sys/fs/cgroup\n/dev/sda2 97M 97M 20K 100% /boot\ntmpfs 48M 12K 48M 1% /run/user/42\ntmpfs 48M 0 48M 0% /run/user/0" | minion.saltstack.com | 1 | {"fun_args": ["df -h"], "jid": "20161004173011028071", "return": "Filesystem Size Used Avail Use% Mounted on\n/dev/sda5 17G 17G 996M 95% /\ndevtmpfs 230M 0 230M 0% /dev\ntmpfs 238M 92K 238M 1% /dev/shm\ntmpfs 238M 8.9M 229M 4% /run\ntmpfs 238M 0 238M 0% /sys/fs/cgroup\n/dev/sda2 97M 97M 20K 100% /boot\ntmpfs 48M 12K 48M 1% /run/user/42\ntmpfs 48M 0 48M 0% /run/user/0", "retcode": 0, "success": true, "fun": "cmd.run", "id": "minion.saltstack.com"} | 2016-10-04 17:30:13 |
1 row in set (0.00 sec) #可以看到 已经有一条数据了

八、Job管理
概念:
在saltstack里面执行任何一个操作都会在master上产生一个jid号.
原理:

  • minion端会在cache目录下的proc目录创建一个以jid为名称的文件,这个文件里面的内容就是此次操作的记录,当操作处理完成后该文件会自动删除.
  • master端会记录每次操作的详细信息,这个记录都是存在master端cache目录下jobs下.

通过salt-run来管理job
1.查看salt-run对job管理的一些用法

[[email protected] ~]# salt-run -d |grep jobs
jobs.active:     #查看正在运行的jobs
Return a report on all actively running jobs from a job id centric
salt-run jobs.active
jobs.list_job:   #指定Jid查看jobs详细信息
salt-run jobs.list_job 20130916125524463507
jobs.list_jobs:  #查看所有jobs信息
List all detectable jobs and associated functions
salt-run jobs.list_jobs
jobs.lookup_jid: #指定Jid查看jobs结果
salt-run jobs.lookup_jid 20130916125524463507
salt-run jobs.lookup_jid 20130916125524463507 outputter=highstate
jobs.print_job:  #指定Jid查询jobs详细信息
salt-run jobs.print_job 20130916125524463507
Note:可以通过salt-run -d jobs查看关于每个参数的解释

2.salt-run操作job实例

执行一条命令
[[email protected] ~]# salt ‘salt‘ cmd.run ‘sleep 100;whoami‘
^CExiting on Ctrl-C #由于时间太长所以Ctrl-C了
This jobs jid is:
20161008144119107339 #这是jobID
The minions may not have all finished running and any remaining minions will return upon completion. To look up the return data for this job later run:
salt-run jobs.lookup_jid 20161008144119107339

3.查看这个job的详细记录

[[email protected] ~]# salt-run jobs.list_job 20161008144119107339 
Arguments:
- sleep 100;whoami
Function:
cmd.run
Minions:
- salt
Result:
----------
salt:
----------
return:
root
StartTime:
2016, Oct 08 14:41:19.107339
Target:
salt
Target-type:
glob
User:
root
jid:
20161008144119107339

通过SaltStack Module来管理job
概念:
由于salt-run对job管理有些局限,不支持kill掉某个job,所以介绍用saltstack 自带的module来管理job
查看相关module用法

[[email protected] ~]# salt \* sys.doc saltutil |grep job
saltutil.find_cached_job: #查询job cache信息
Return the data for a specific cached job id
salt * saltutil.find_cached_job <job id>
saltutil.find_job:       #查看job信息
Return the data for a specific job id
salt * saltutil.find_job <job id>
saltutil.kill_job:      #kill掉Job(发送SIGTERM 9信号方式)
Sends a kill signal (SIGKILL 9) to the named salt jobs process
salt * saltutil.kill_job <job id>
salt * saltutil.runner jobs.list_jobs
saltutil.signal_job: #发送指定信号
Sends a signal to the named salt jobs process
salt * saltutil.signal_job <job id> 15
saltutil.term_job:     #删除job(发送SIGTERM 15信号方式)
Sends a termination signal (SIGTERM 15) to the named salt jobs process
salt * saltutil.term_job <job id>

九、Event和Reactor系统
Event系统
概念:
Event是SaltStack里面对每个时间的一个记录,它相比job更加底层,Event能记录更加详细的saltstack事件
比如:Minion服务启动后请求Master签发证书或者证书校验的过程,都能通过Event事件来查看整个过程
查看Event事件

1.打开两个Master终端
第一个终端执行查看事件命令并等待:
[[email protected] ~]# salt-run state.event pretty=True
第二个终端执行一个salt任务:
[[email protected] ~]# salt ‘salt‘ cmd.run ‘ls‘
salt:
anaconda-ks.cfg
这时再切到第一个终端查看:
salt/event/new_client    {
"_stamp": "2016-10-08T07:02:27.488312"
}
20161008150227502370    {
"_stamp": "2016-10-08T07:02:27.502657", 
"minions": [
"salt"
]
}
salt/job/20161008150227502370/new    {
"_stamp": "2016-10-08T07:02:27.502827", 
"arg": [
"ls"
], 
"fun": "cmd.run", 
"jid": "20161008150227502370", 
"minions": [
"salt"
], 
"tgt": "salt", 
"tgt_type": "glob", 
"user": "root"
}
salt/job/20161008150227502370/ret/salt    {
"_stamp": "2016-10-08T07:02:27.630653", 
"cmd": "_return", 
"fun": "cmd.run", 
"fun_args": [
"ls"
], 
"id": "salt", 
"jid": "20161008150227502370", 
"retcode": 0, 
"return": "anaconda-ks.cfg", 
"success": true
}

Note:出现了刚才任务的详细信息

Reactor系统
概念:
Reactor是基于Event的每个事件来做相应的操作(states).
我们可以理解为Reactor一直监听着Event然后触发一些states操作.
实例:
在我们日常 大规模新机器上线或者初始化机器的时候,都希望Minion第一次服务起来的时候就能完成所有配置,这个时候需要自动完成Minion的证书签发和根据不同的业务完成不同的states配置.

后续再补··········

 

以上是关于SaltStack学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Saltstack学习笔记

学习笔记:python3,代码片段(2017)

Salt-api学习笔记一

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

Saltstack笔记

saltstack自动化运维工具搭建个人笔记