文章目录
- saltstack 安装
- 安装saltstack
- 简单配置saltstack
- 端口监听
- YAML
- 缩进
- 冒号
- 破折号
- 使用
- 认证
- 模块
- state.sls
- top.sls
- 数据系统
- Grains
- Pillar
- Grains和Pillar
saltstack的四大功能:
远程执行,配置管理,云管理,事件驱动
saltstack组件:
- salt-master
- salt-minion
- 执行模块
- 状态
- Grains
- Pillar
- 等等等等
saltstack 安装
安装saltstack
安装repo源,在https://repo.saltstack.com/yum/选择合适的repo源,进行安装。
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
# 固定版本
# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2018.3-1.el7.noarch.rpm
注:在安装repo源时需要注意,尽量使用固定版本的repo源,防止以后在执行yum update
时升级后的不可用问题。
安装对应组件
yum install salt-master
yum install salt-minion
yum install salt-ssh
yum install salt-syndic
yum install salt-cloud
yum install salt-api
简单配置saltstack
- salt-master
salt-master无需配置可以直接启动使用。
- salt-minion
salt-minion需要配置master
字段来让minion去连接salt-master,该字段可以配置为IP和域名。
可以配置id
字段来设置minion的标示ID,否则默认使用socket.getfqdn()
获取的值来设定,并保存到/etc/salt/minion_id
命名的文件中。
启动服务后,master和minion都会在/etc/salt/pki
目录中对应服务的文件夹下生成一对秘钥文件,
端口监听
salt-master监听4506和4506端口,使用Zeromq和salt-minion进行通信,master通过4505端口异步发送任务到minion端。
salt-minion不监听端口,minion和master在4505上建立长连接,接受master下发的任务。任务执行完成后,结果发送到salt-master的4506端口。
YAML
缩进
YAML使用固定缩进方案来表示数据层之间的关系。Salt要求每个级别的缩进恰好包含两个空格。不要使用tab。
冒号
Python字典只是键值对。字典键在YAML中表示为由尾部冒号终止的字符串。值由冒号后面的字符串表示,用空格分隔
my_key:my_value
# 在python中格式如下
# {'my_key': 'my_value'}
# 或者,可以通过缩进将值与键相关联。
my_key:
my_value
字典可以嵌套:
first_level_dict_key:
second_level_dict_key: value_in_second_level_dict
# 在python中格式如下
# {
# 'first_level_dict_key': {
# 'second_level_dict_key': 'value_in_second_level_dict'
# }
# }
破折号
为了表示项目列表,使用单个短划线后跟空格。多个项目是同一列表的一部分,因为它们具有相同级别的缩进。
- list_value_one
- list_value_two
- list_value_three
# 列表可以是键值对的值。这在盐中很常见:
my_dictionary:
- list_value_one
- list_value_two
- list_value_three
# 在python中格式如下
# {'my_dictionary': ['list_value_one', 'list_value_two', 'list_value_three']}
使用
认证
首次使用需要在master上对minion进行认证后才能对minion进行操作。使用salt-key
命令对minion端进行认证操作。
salt-key
-A: 认证全部
-a: 支持通配符认证
-D: 拒绝所有认证
-d: 支持通配符拒绝认证
minion会把自己的公钥发送给master,保存到master的/etc/salt/pki/master/minions_pre
目录下,每个minion端的公钥文件以minion端的id命名,master认证后会移动到/etc/salt/pki/master/minions
目录下,并且会把master的公钥传到minion 端的/etc/salt/pki/minion/minion_master.pub
文件中。
模块
# 这里的*表示匹配minionID名,由于shell的问题,这里用了反斜杠进行转义,也可以使用单引号和双引号。
salt \* test.ping
salt '*' cmd.run 'free -m'
salt执行命令格式为:1.salt关键字。2.通配符。3.模块以及模块下的方法 4.方法需要的参数
state.sls
可以编写state.sls文件对服务器进行配置管理。
首先,需要编辑master配置文件来制定salt的文件目录,如下:
# 这里不同的环境对应不同的目录
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
prod:
- /srv/salt/prod
test:
- /srv/salt/test
然后,在base目录下创建按照apache服务的state.sls脚本,如下:
mkdir -p /srv/salt/{base,dev,prod,test}
mkdir /srv/salt/base/web
cat /srv/salt/base/web/apache.sls
apache-install:
pkg.installed:
- name: httpd
apapche-service:
service.running:
- name: httpd
- enable: True
最后,执行进行安装:
# 默认环境为bash
salt 'minion' state.sls web.apache saltenv=base
# 测试命令
salt 'minion' state.sls web.apache test=True
top.sls
top.sls本不是固定的,可以在master的配置文件中进行state_top: top.sls
配置,建议不要修改。
top.sls来指定不同minion执行不同的脚本:
# 这里表示所有服务安装apache服务
[root@controller base]# cat /srv/salt/base/top.sls
base:
'*':
- web.apache
/srv/salt/base/web/apache.sls
文件内容如下:
[root@controller base]# cat web/apache.sls
apache-install:
pkg.installed:
- name: httpd
apapche-service:
service.running:
- name: httpd
- enable: True
执行,
# 这里的* 和top.sls里的*是两个概念
salt '*' state.highstate
数据系统
Grains
grains用于收集操作系统,域名,IP地址,内核,操作系统类型,内存和许多其他系统属性。它是保存到minion端的静态数据,master端获取数据时采用明文传输。
- 存放着salt-minion启动时收集的信息。
salt \* grains.items
salt \* grains.item virtual
salt \* grains.ls
salt \* grains.get saltversion
salt \* grains.get ip_interfaces:eth0
- salt可以根据Grains来匹配minion:
[root@controller base]# salt -G 'os:CentOS' test.ping
salt-master:
True
salt-minion:
True
[root@controller base]# salt \* grains.get os
salt-master:
CentOS
salt-minion:
CentOS
- top.sls中可以使用根据grains进行匹配
[root@controller base]# cat /srv/salt/base/top.sls
base:
'os:CentOS':
- match: grain
- web.apache
- 在模版语言中使用grains
- 自定义grains
- 在minion的配置中修改
grains
选项来定义。(不推荐,需要单独修改minion的配置文件) - 在minion端的
/etc/salt/grains
文件中单独配置,配置后需要重启或者使用salt \* saltutil.sync_grains
命令刷新grains才能生效 - 在master端
file_root
指定的子目录中创建_grains
的自定义grains模块目录,将在state.highstate
运行时或altutil.sync_grains
或saltutil.sync_all
功能分发给minion端。该文件的文件名以及函数名无关紧要,根本不会影响谷物数据; 只有返回的键/值成为grains的一部分。
mkdir /srv/salt/base/_grains
cat /srv/salt/base/_grains/zabbit.py
def yourfunction():
grains = {}
grains['yourcustomgrain'] = True
grains['anothergrain'] = 'somevalue'
import time
grains['time'] = time.time()
return grains
# python脚本中可以定义静态配置以及python获取到的配置,但是需要注意的是动态获取的时间只有minion重启或者刷新grains才会生效。
,
- grains的缺点:
- 静态的数据。
- 明文传输,敏感数据不安全。
Pillar
保存在master端数据,一般放一些敏感的数据,采用加密方式传输。
salt-master服务器维护一个pillar_roots
与file_roots
文件结构类似的设置,该pillar_roots
选项将环境映射到目录。然后根据顶部文件中的匹配器将支柱数据映射到minions,该顶部文件以与状态顶部文件相同的方式布局。pillar可以使用与标准顶级文件
相同的匹配器类型。
配合master配置文件/etc/salt/master
中pillar_roots
选项
pillar_roots:
base:
- /srv/pillar/base
prod:
- /srv/pillar/prod
mkdir -p /srv/pillar/{base,prod}
systemctl restart salt-master
新建pillar的top.sls文件
声明在base
环境中,匹配所有minions的glob将在柱子中找到支柱数据packages
。假设 从上面取的pillar_roots
值/srv/pillar
,packages
柱子将位于/srv/pillar/base/apache.sls
。
cd /srv/pillar/base
[root@controller base]# cat top.sls
base:
'*':
- apache
结合grains可以只对CentOS
系统进行pillar参数进行设置
base:
'os:CentOS':
- match: grain
- apache
/srv/pillar/base/apache.sls
文件内容如下:
[root@controller base]# cat apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
修改/srv/salt/base/web/apache.sls
文件内容如下:
[root@controller base]# cat web/apache.sls
apache-install:
pkg.installed:
- name: {{ pillar['apache'] }}
apapche-service:
service.running:
- name: {{ pillar['apache'] }}
- enable: True
继续执行
salt '*' state.highstate
Grains和Pillar
数据系统 | 存储位置 | 类型 | 采集方式 | 场景 | 传输方式 |
Grains | minion | 静态 | minion启动时,可以刷新 | 1.获取信息 2.匹配 | 明文 |
Pillar | master | 动态 | 指定,实时生效 | 1.匹配 2.敏感数据配置 | 密文 |