saltstack
一、什么是Saltstack?
1.Saltstack简介
saltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递。对于不同的业务进行集中管理,分发文件,采集数据,软件包管理等; saltstack是使用python语言开发的,同时也支持restAPI方便二次开发以及和它平台集成,同时官方也发布了一个Web管理界面halite
2.Salt的核心功能
•使命令发送到远程系统是并行的而不是串行的
•使用安全加密的协议
•使用最小最快的网络载荷
•提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可
以通过主机名,还可以通过系统属性。
二、saltstack通信机制
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队
列通信,默认监听4505端口。
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听
4506端口
三、saltstack安装与配置
这里我们使用三台主机
server1作为master安装salt-master.noarch
server2、server3作为slave安装salt-minion.noarch
1.配置镜像源
• 官网: https://www.saltstack.com/
• 设置官方YUM仓库: yum install https://repo.saltstack.com/yum/redhat/salt-repo-
latest.el7.noarch.rpm
salt.repo官方仓库源码
\\\
[salt-latest-repo]
name=salt
baseurl=http://repo.saltproject.io/py3/redhat/7/x86_64/latest
skip_if_unavailable=True
failovermethod=priority
enabled=1
enabled_metadata=1
gpgcheck=0
gpgkey=https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub,https://repo.saltproject.io/py3/redhat/7/x86_64/latest/base/RPMGPG-KEY-CentOS-7
\\\
CentOS-Base.repo源码
配置AliyunCentOS镜像用于解决saltstack依赖性
\\\
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#enabled=0
#released updates
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#enabled=0
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#enabled=0
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
\\\
2.安装salt
在master端设置:
yum install -y salt-master.noarch #安装master端
systemctl enable salt-master #设置master自启动
systemctl start salt-master #启动master服务
在minion端配置:
配置salt文件设定控制服务器并重启
yum install salt-minion.noarch -y #安装minion端
vim /etc/salt/minion
\\\
master: 172.25.7.1 #设置master主机的ip为控制服务器
\\\
systemctl enable salt-minion #设置开机启动
systemctl start salt-minion.service #启动minion服务
添加key,master端执行命令允许minion连接:
salt-key -L #-L查看key
salt-key -A #-A添加key
salt-key -L
master端测试与minion端的连接:
salt '*' test.ping
四、saltstack远程执行
远程执行shell命令
Salt命令由三个主要部分构成:
salt ‘’ [arguments]
Target:
///
target: 指定哪些minion, 默认的规则是使用glob匹配minion id
#salt '*' test.ping
Targets也可以使用正则表达式:
#salt -E 'server[1-3]' test.ping
Targets也可以指定列表:
#salt -L 'server2,server3' test.ping
funcation:
///
funcation是module提供的功能,Salt内置了大量有效的functions.
#salt '*' cmd.run 'uname -a'
arguments:
///
arguments通过空格来界定参数:
#salt 'server2' sys.doc pkg #查看模块文档
#salt 'server2' pkg.install httpd
#salt 'server2' pkg.remove httpd
salt内置的执行模块列表可以在官方文档查看
• http://docs.saltstack.cn/ref/modules/all/index.html
编写远程执行模块
编辑master配置文件:
vim /etc/salt/master
///
file_roots:
base:
- /srv/salt
///
systemctl restart salt-master #重启master服务
编写模块文件:
mkdir /srv/salt/_modules #创建模块目录
vim /srv/salt/_modules/mydisk.py #编写模块文件
///
def df():
return __salt__['cmd.run']('df -h')
///
同步模块:
salt server2 saltutil.sync_modules
运行模块:
salt server2 mydisk.df
配置管理
Salt 状态系统的核心是SLS,或者叫SaLt State 文件
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
• sls文件命名:
sls文件以”.sls”后缀结尾
注意: 在调用时不用写.sls后缀
使用子目录来做组织是个很好的选择
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache
.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将
被用来表示 apache
五、grains详解
grains简介
• Grains是SaltStack的一个组件,存放在SaltStack的minion端。
• 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当
minion重启时才会进行数据的更新。
• 由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
• 信息查询,可用作CMDB。
• 在target中使用,匹配minion。
• 在state系统中使用,配置管理模块
信息查询
用于查询minion端的IP、FQDN等信息
默认可用的grains:
salt ‘’ grains.ls
查看每一项的值:
salt '’ grains.items
取单项的值:
salt server2 grains.item ipv4
自定义grains项
1.在/etc/salt/minion中自定义grains项:
vim /etc/salt/minion
///
grains:
roles:
- apache
///
更改完数据需要注意必须重启salt-minion,否则数据不会更新
systemctl restart salt-minion
2.在/etc/salt/grains中自定义grains项:
vim /etc/salt/grains:
///
deployment: datacenter1
///
salt server3 saltutil.sync_grains #同步数据
salt server3 grains.item deployment #查询自定义项
编写grains模块
在salt-master端创建_grains目录,编写模块,并同步到minion端
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py
///
def my_grain():
grains = {}
grains['roles'] = 'nginx'
grains['hello'] = 'world'
return grains
///
salt '*' saltutil.sync_grains #同步grains到minion端
这里编写时可以去官网查找模板例子
grains匹配运用
在target中匹配minion:
salt -G roles:apache cmd.run hostname
在top文件中匹配:
vim /srv/salt/top.sls
///
base:
'roles:apache':
- match: grain
- apache.install
///
六、pillar详解
pillar简介
pillar和grains一样也是一个数据系统,但是应用场景不同。
• pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
• pillar更加适合在配置管理中运用。
声明pillar
定义pillar基础目录,并重启salt-master服务
vim /etc/salt/master
///
pillar_roots:
base:
- /srv/pillar
///
mkdir /srv/pillar #建立目录
/etc/init.d/salt-master restart #重启salt-master服务
自定义pillar项
vim /srv/pillar/top.sls
///
base:
'*':
- packages
///
vim /srv/pillar/packages.sls
///
{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}
///
刷新pillar数据:
salt ‘*’ saltutil.refresh_pillar
查询pillar数据:
salt ‘’ pillar.items
salt '’ pillar.item roles
pillar数据匹配
1.命令行中匹配:
salt -I ‘roles:apache’ test.ping
2.state系统中使用:
vim /srv/salt/apache.sls
///
apache:
pkg.installed:
- name: {{ pillar['package'] }}
///
七、Jinja模板
Jinja模板简介
• Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
• 通过jinja模板可以为不同服务器定义各自的变量。
• 两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或 赋值的语句,后者把表达式的结果打印到模板上。
Jinja模板使用方式
1.Jinja最基本的用法是使用控制结构包装条件:
vim /srv/salt/test.sls
///
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server3' %}
package: nginx
{% elif grains['fqdn'] == 'server2' %}
package: apache
{% endif %}
///
2.Jinja在普通文件的使用:
vim /srv/salt/apache.sls
///
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd.conf
- template: jinja
- context:
bind: 172.25.0.2
///
3.import方式,可在state文件之间共享:
• 定义变量文件:
vim lib.sls
{% set port = 80 %}
• 导入模板文件:
vim httpd.conf
{% from 'lib.sls' import port %}
...
Listen {{ prot }}
4.引用变量
• 直接引用grains变量:
• Listen {{ grains[‘ipv4’][1] }}
• 直接引用pillar变量:
• Listen {{ pillar[‘ip’] }}
• 在state文件中引用:
- template: jinja
- context:
bind: {{ pillar['ip'] }}
八、Job管理
Job简介
• master在下发指令任务时,会附带上产生的jid。
• minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc
目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行
情况。
• 指令执行完毕将结果传送给master后,删除该临时文件。
Job cache
Job缓存默认保存24小时:
vim /etc/salt/master
///
master_job_cache: master
///
master端Job缓存目录:
• /var/cache/salt/master/jobs
把Job存储到数据库
修改master端配置:
vim /etc/salt/master
///
return: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
///
systemctl restart salt-master #重启salt-master服务
安装mysql数据库,初始化脚本,导入数据模板并授权
yum install -y mariadb-server MySQL-python
mysql_secure_installation #执行数据库初始化脚本
mysql -p < salt.sql #导入数据模板
grant all on salt.* to salt@localhost identified by 'salt'; #创建数据库授权
salt.sql模板源码:
/////
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
DROP TABLE IF EXISTS `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;
DROP TABLE IF EXISTS `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;
///////
Job管理
• 查看所有minion当前正在运行的jobs(在所有minions上运行saltutil.running)
salt-run jobs.active
• 列出当前master jobs cache中所有job
salt-run jobs.list_jobs
• 从master jobs cache中查询指定jid的运行结果
salt-run jobs.lookup_jid
九、salt-ssh与salt-syndic
salt-ssh简介
• salt-ssh可以独立运行的,不需要minion端。
• salt-ssh 用的是sshpass进行密码交互的。
• 以串行模式工作,性能下降。
salt-ssh安装与配置
yum install -y salt-ssh #安装salt-ssh
#配置roster文件,默认的本地路径是 /etc/salt/roster
server2:
host: 172.25.0.2
user: root
测试:
salt-ssh ‘*’ test.ping -i //询问密码加 -i
vim ~/.ssh/config
StrictHostKeyChecking no
salt-syndic简介
如果大家知道zabbix proxy的话那就很容易理解了,syndic其实就是个代理,隔离master与minion。
Syndic必须要运行在master上,再连接到另一个topmaster上。
Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
topmaster并不知道有多少个minion。
syndic与topmaster的file_roots和pillar_roots的目录要保持一致。
salt-syndic配置
topmaster端: 设置为server4
下级master端: 设置为server1
vim /etc/salt/master
syndic_master: 172.25.0.4 #指向topmaster
将server1上的仓库源传给server4,便于下载
yum install -y salt-syndic
vim /etc/salt/master
order_masters: True #作为顶级master
systemctl start salt-master
salt-key -L #查看下级master的连接授权
systemctl restart salt-master
systemctl start salt-syndic
顶级master只知道有一个下级master,但是可以直接同各国* 对所有slave操作
十、salt-api配置
salt-api简介
SaltStack 官方提供有REST API格式的 salt-api 项目,将使Salt与第三方系统集成变得尤为简单。
• 官方提供了三种api模块:
• rest_cherrypy
• rest_tornado
• rest_wsgi
官方链接:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules
salt-api配置
安装salt-api,生成证书
yum install -y salt-api python-cherrypy
cd /etc/pki/tls/private
openssl genrsa 2048 > localhost.key
cd /etc/pki/tls/certs
make testcert //根据提示填写相关信息即可
salt-api配置
创建用户认证文件:
useradd -s /sbin/nologin saltapi
echo westos | passwd --stdin saltapi
vim /etc/salt/master.d/eauth.conf
///
external_auth:
pam:
saltapi:
- .*
- '@wheel'
- '@runner'
///
激活rest_cherrypy模块,重启服务
vim /etc/salt/master.d/api.conf
///
rest_cherrypy:
host: 172.25.0.1
port: 8000
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/private/localhost.key
///
systemctl restart salt-master
systemctl start salt-api
salt-api使用
获取认证token:
curl -sSk https://172.25.0.1:8000/login \
-H 'Accept: application/x-yaml' \
-d username=saltapi \
-d password=westos \
-d eauth=pam
推送任务:
curl -sSk https://172.25.0.1:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 77e2b1de04b0dbc0a4bf11900712b83e4fa2c241'\
-d client=local \
-d tgt='*' \
-d fun=test.ping
##token值是上面命令获取的toekn值。