先来看看Saltstack的配置文件
1
2
3
4
| Master
[iyunv@saltstack-node1 ~]# vim /etc/salt/master
Minion
[iyunv@saltstack-node1 ~]# vim /etc/salt/minion
|
两者里面的配置项大同小异,其中master是我们需要重点配置的对象 大部分配置都可以保持默认无需改动,在部署大规模Saltstack环境需要自定义一些参数的时候才需要根据实际需求修改;其中一些比较重要的配置项: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| publish_port: 4505 # Saltsatck使用ZeroMQ的消息发布端口
ret_port: 4506 # Saltsatck使用ZeroMQ的消息接收端口
user: root # Saltsatck使用root权限运行
pidfile: /var/run/salt-master.pid # pid进程文件
keep_jobs: 24 # Saltstack保留工作记录时间为24小时
timeout: 5 # Master和Minion通信受网络限制,连接超时时间
max_open_files: 100000 # 根据Master下的Minion数量进行适当地调整
worker_threads: 5 # 进程数
auto_accept: False # Master自动接受来自新Minion的注册
autosign_file: /etc/salt/autosign.conf # 自动注册配置文件
master_tops: {} # Master_tops和所有以exernal开头的参数在Saltstack与外部系统进行整合的时候会用到
state_top: top.sls # 高级状态配置文件
# file_roots: # Saltstack配置管理使用的根目录
# base:
# - /srv/salt/
# dev:
# - /srv/salt/dev/services
# - /srv/salt/dev/states
# prod:
# - /srv/salt/prod/services
# - /srv/salt/prod/states
# pillar_roots: # Pillar根目录配置
# base:
# - /srv/pillar/base
# prod:
# - /srv/pillar/prod
syndic_master: 172.16.2.186 # Saltsatck代理master
log_file: /var/log/salt/master # 日志路径
log_level: warning # 日志级别
nodegroups: # 对Minion分组
web: 'L@saltstack-node1.lichengbing.com,saltstack-node2.lichengbing.com'
# group2: 'G@os:Debian and foo.domain.com'
# group3: 'G@os:Debian and N@group1'
# group4:
# - 'G@foo:bar'
# - 'or'
# - 'G@foo:baz'
|
这里我们需要注意的是,Saltstack所有的配置文件以及我们马上要接触到的配置管理文件(SLS文件)都是使用的一种特殊文件格式--YAML编辑而成的,YAML语法对格式要求比较简单但是严格,一个多余的空格或者其他符号都是不被允许的。
YAML语法规则 1)规则一:冒号 YAML参考Python,将key和key值通过冒号的形式关联起来形成一种数据类型叫哈希表或者关联数组
1
| my_key: my_value #表示键值关系时键叫冒号后面跟一个空格再写值
|
2)规则二:缩进 YAML使用一个固定的缩进风格来表示数据层级结构关系,Saltstack需要每个缩进级别由两个空格组成,比如顶层没有空格,二层2个空格,三层4个空格...以此类推。特别需要注意的是不允许使用tab键缩进。
1
2
3
| first_floor:
second_floor:
third_floor:
|
3)规则三:短横线 YAML中短横线表示列表项,多个项使用同样的缩进级别作为同一列表的一部分 1
2
3
4
| my_key:
- 100
- 101
- 103
|
我们要学习的YAML所有语法就这么多,是不是很简单~~虽然简单,但是在学习甚至是真实生产环境案例中,经常发生saltstack配置文件因为语法问题(多一个空格,少一个空格)导致的服务异常,所以大家要十分小心...
Grains Grains是Saltstack组件中非常重要的组件之一,在做配置管理时经常会使用到它,我们可以简单地理解Grains为在minion端服务启动时,收集的一些关于该主机的静态数据信息,然后汇报给master,这些数据包括主机cpu、内存、磁盘、网络等信息。我们可以利用这些信息做一些相关监控,或者有时候我们需要自定义一些Grains信息来方便我们做配置管理 查看关于grains支持的功能 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| [iyunv@saltstack-node1 ~]# salt '*' sys.list_functions grains
saltstack-node2.lichengbing.com:
- grains.append
- grains.delval
- grains.fetch
- grains.filter_by
- grains.get
- grains.get_or_set_hash
- grains.has_value
- grains.item
- grains.items
- grains.ls
- grains.remove
- grains.set
- grains.setval
- grains.setvals
|
主机所有的grains信息 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
| [iyunv@saltstack-node1 ~]# salt '*' grains.items # grains信息比较多
saltstack-node2.lichengbing.com:
----------
SSDs:
biosreleasedate: # 主板日期
07/02/2015
biosversion: # BIOS版本
6.00
cpu_flags:
- fpu
- vme
- de
- pse
cpu_model: # CPU型号
Intel(R) Core(TM)2 Duo CPU P9700 @ 2.80GHz
cpuarch:
x86_64
disks:
- sda
- sr0
dns:
----------
domain:
ip4_nameservers: # DNS
- 10.0.0.2
- 8.8.8.8
ip6_nameservers:
nameservers:
- 10.0.0.2
- 8.8.8.8
search:
domain:
lichengbing.com
fqdn:
saltstack-node2.lichengbing.com
fqdn_ip4: # 域名解析地址
- 172.16.2.186
fqdn_ip6:
groupname:
root
host:
saltstack-node2
hwaddr_interfaces: # MAC地址
----------
eth0:
00:0c:29:1a:87:b4
eth1:
00:0c:29:1a:87:be
lo:
00:00:00:00:00:00
id:
saltstack-node2.lichengbing.com # minion端ID
os: #一些系统相关信息
CentOS
os_family:
RedHat
osarch:
x86_64
oscodename:
CentOS Linux 7 (Core)
osfinger:
CentOS Linux-7
osfullname:
CentOS Linux
osmajorrelease:
7
osrelease:
7.2.1511
selinux: # 一些selinux信息
----------
enabled:
False
enforced:
Disabled
|
查看各功能的详细介绍和用法 1
2
3
4
5
6
7
8
| [iyunv@saltstack-node1 ~]# salt '*' sys.doc grains.item
grains.item:
Return one or more grains
CLI Example:
salt '*' grains.item os
salt '*' grains.item os osrelease oscodename
Sanitized CLI Example:
salt '*' grains.item host sanitize=True
|
我们来批量查看所有minion的IP地址试试 1
2
3
4
5
6
7
8
9
| [iyunv@saltstack-node1 ~]# salt '*' grains.item fqdn_ip4
saltstack-node2.lichengbing.com:
----------
fqdn_ip4: # 注意,这里的fqdn_ip4是主机域名解析结果,在/etc/resolve.conf中
- 172.16.2.186
saltstack-node1.lichengbing.com:
----------
fqdn_ip4:
- 172.16.2.185
|
怎么样,有了grains我们在做集群所有机器监控的或者统计的时候是不是很方便~
Grains在实际生产中的作用 1)资产管理、信息查询 1
2
3
4
5
6
7
8
9
| [iyunv@saltstack-node1 ~]# salt '*' grains.item os # 同我们上面查询IP地址,我们可以对所有minion做资产相关信息统计
saltstack-node2.lichengbing.com:
----------
os:
CentOS
saltstack-node1.lichengbing.com:
----------
os:
CentOS
|
2)用于选择目标主机 1
2
3
4
5
| [iyunv@saltstack-node1 ~]# salt -G 'os:CentOS' cmd.run 'cat /etc/redhat-release' # 比如我们需要在所有系统版本为centos的主机上做相关操作
saltstack-node2.lichengbing.com:
CentOS Linux release 7.2.1511 (Core)
saltstack-node1.lichengbing.com:
CentOS Linux release 7.2.1511 (Core)
|
3)自定义规则 有三种常用的自定义规则方法:minion配置文件自定义、Grains模块文件自定义、Python脚本自定义 a.minion配置文件自定义 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [iyunv@saltstack-node2 ~]# vim /etc/salt/minion # 在minion端修改配置文件
grains: # 添加 grains 规则,注意格式
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
[iyunv@saltstack-node2 ~]# systemctl restart salt-minion # 重启minion端
[iyunv@saltstack-node1 ~]# salt '*' grains.item roles # 查看grains是否生效
saltstack-node2.lichengbing.com:
----------
roles:
- webserver
- memcache
saltstack-node1.lichengbing.com:
----------
roles:
[iyunv@saltstack-node1 ~]# salt -G 'roles:webserver' cmd.run 'cat /etc/redhat-release' # 我们可以利用自定义的grains信息来做主机选择了
saltstack-node2.lichengbing.com:
CentOS Linux release 7.2.1511 (Core)
|
b.Grains模块文件自定义 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [iyunv@saltstack-node2 salt]# vim /etc/salt/grains # 在minion端编辑grains文件
cloud: openstack
[iyunv@saltstack-node1 ~]# salt '*' saltutil.sync_grains # 在master端同步grains文件
saltstack-node1.lichengbing.com:
saltstack-node2.lichengbing.com:
[iyunv@saltstack-node1 ~]# salt '*' grains.item cloud # 查看grains是否生效
saltstack-node2.lichengbing.com:
----------
cloud:
openstack
saltstack-node1.lichengbing.com:
----------
cloud:
openstack
|
c.Python脚本自定义 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| [iyunv@saltstack-node1 ~]# cd /srv/salt/base/
[iyunv@saltstack-node1 base]# mkdir _grains
[iyunv@saltstack-node1 base]# cd _grains/
[iyunv@saltstack-node1 _grains]# vim my_grain.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def my_grains():
#初始化一个grains字典
grains = {}
#设置字典中的key-vlaue
grains['iaas'] = 'openstack'
#返回这个字典
return grains
[iyunv@saltstack-node1 _grains]# salt '*' saltutil.sync_grains
saltstack-node1.lichengbing.com:
- grains.my_grain
saltstack-node2.lichengbing.com:
- grains.my_grain
[iyunv@saltstack-node1 _grains]# salt '*' grains.item iaas
saltstack-node2.lichengbing.com:
----------
iaas:
openstack
saltstack-node1.lichengbing.com:
----------
iaas:
openstack
|
自定义的Grains优先级
系统自带→grains模板→minion配置文件→Python定义
Pillar Pillar也是Saltstack组件中非常重要的组件之一,是数据管理中心,我们经常配合states在大规模的配置管理工作中使用它,Pillar在Saltstack中主要的作用是动态地存储和定义配置管理中需要的一些敏感数据,比如版本号、用户密码等,这些敏感信息定义后只有minion自己能够看到。
接下来我们演示一下根据pillar自定义安装zabbix指定zabbix_server服务器地址 1)给minion指定pillar值 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| [iyunv@saltstack-node1 ~]# vim /etc/salt/master #修改配置文件指定pillar路径
pillar_roots:
base:
- /srv/pillar/base
[iyunv@saltstack-node1 ~]# systemctl restart salt-master #重启master
[iyunv@saltstack-node1 ~]# cd /srv/pillar/base/
[iyunv@saltstack-node1 base]# vim top.sls #编写top文件
base:
'saltstack-node2.lichengbing.cn':
- web.apache
[iyunv@saltstack-node1 base]# salt '*' saltutil.refresh_pillar #刷新pillar
saltstack-node2.lichengbing.cn:
True
saltstack-node1.lichengbing.cn:
True
[iyunv@saltstack-node1 base]# salt '*' pillar.items apache #查看pillar是否生效
saltstack-node2.lichengbing.cn:
----------
apache:
httpd
saltstack-node1.lichengbing.cn:
----------
apache:
[iyunv@saltstack-node1 base]# salt -I 'apache:httpd' test.ping #用pillar指定目标主机
saltstack-node2.lichengbing.cn:
True
|
2)接下来我们演示一下根据pillar自定义安装zabbix指定zabbix_server服务器地址 1
2
3
4
5
6
7
8
9
| [iyunv@saltstack-node1 base]# vim top.sls
base:
'*':
- zabbix.agent
[iyunv@saltstack-node1 base]# mkdir zabbix
[iyunv@saltstack-node1 base]# cd zabbix/
[iyunv@saltstack-node1 zabbix]# vim agent.sls
Zabbix_Server: 172.16.2.150
[iyunv@saltstack-node1 ~]# systemctl restart salt-master
|
定义好后,以后在配置管理中就可以直接使用这样的格式取得pillar值 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| [iyunv@saltstack-node1 zabbix]# vim /srv/salt/base/init/zabbix-agent.sls
zabbix-agent:
pkg.installed:
- name: zabbix-agent
file.managed:
- name: /etc/zabbix/zabbix_agentd.conf
- source: salt://init/files/zabbix_agentd.conf
- template: jinja
- backup: minion
- defaults:
Zabbix_Server: {{ pillar['Zabbix_Server'] }} # pillar值
Hostname: {{ grains['fqdn'] }} # grains值
- require:
- pkg: zabbix-agent
service.running:
- enable: True
- watch:
- pkg: zabbix-agent
- file: zabbix-agent
|
Grains和Pillar的区别 | 类型 | 数据采集方式 | 引用场景 | 定义位置 | Grains | 静态 | minion启动时收集 | 目标选择、配置管理、数据查询 | minion | pillar | 动态 | master定义 | 目标选择、配置管理、敏感数据 | master |
|