实验环境:
准备三台机器,这三台机器都关闭 selinux,清空防火墙规则。
systemctl stop firewalld
setenforce 0
hostnamectl set-hostname master.saltstack.com
hostnamectl set-hostname web01.saltstack.com
hostnamectl set-hostname web02.saltstack.com
vi /etc/hosts
192.168.80.100 master.saltstack.com
192.168.80.101 web01.saltstack.com
192.168.80.102 web02.saltstack.com
分别为三台机器添加epel源,本地有官方源。
yum install -y epel-release 安装epel源
服务器安装:(主控端)
yum -y install salt-master salt-minion
客户端安装
yum -y install salt-minion
客户端安装
yum -y install salt-minion
服务端和客户端都要配置
vi /etc/salt/minion +16
master: 192.168.80.100
分别修改三台机器minion文件中的的id为自己的主机名
vi /etc/salt/minion +78
id: master.saltstack.com
vi /etc/salt/minion
id: web01.saltstack.com
vi /etc/salt/minion
id: web02.saltstack.com
一定先开启主的
systemctl start salt-master
systemctl enable salt-master
systemctl start salt-minion
systemctl enable salt-minion
salt-key -L 查看待认证的服务器
Accepted Keys:认证通过
Denied Keys:旧的的认证
Unaccepted Keys:等待认证
Rejected Keys:拒绝认证
手动添加认证:
认证的方式是salt-key -a 客户端id
salt-key -a web01.saltstack.com
这个可能没有空格原因
salt-key -a web02.saltstack.com
salt-key -a master.saltstack.com
说明:-a :accept ,-A:accept-all,-d:delete,-D:delete-all。可以使用 salt-key 命令查看到已经签名的客户端。此时我们在客户端的 /etc/salt/pki/minion 目录下面会多出一个minion_master.pub 文件。
注意,如果你想修改id的话,需要先删除服务端的id,使用salt-key -d id名称就行,修改客户端文件,重启客户端服务后,需要重新认证。这里需要注意一下,老的版本需要删除客户端的/etc/salt/minion_id的内容,修改配置文件的id,重启服务才生效。因为第一次启动的时候它会生成这个文件,以后再不会读minion这个配置文件了,直接读minion_id这个文件。
在主控端
测试与被控端的通信状态!
salt ‘*’ test.ping
salt ‘*’ cmd.run ‘df -hT’ //远程执行命令
安装完成修改主配置文件:
vi /etc/salt/master
修改如下:
416行3行去掉#
file_roots:
base:
- /srv/salt #saltstack文件根目录位置,目录需要创建
710行组分类:
nodegroups:
group1: ‘web01.saltstack.com’
group2: ‘web02.saltstack.com’
552行 pillar_opts: True //开启pillar功能
529行
pillar_roots:
base:
- /srv/pillar //pillar的主目录,需要创建
grep -v ^# /etc/salt/master | grep -v ^$ //查看对主配置文件做的更改
启动服务器:
systemctl start salt-master 一定先启动主的
netstat -anpt | egrep ‘:4505|:4506’
创建salt与pillar文件根目录:
mkdir /srv/salt
mkdir /srv/pillar
注:
Saltstack几个重要的组件:
grains
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等静态信息。
grains的信息并不是动态的,并不会时时变更,它只是在 minion 启动时收集到的
pillar
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
State
他是saltstack的最核心功能,通过预先指定好的sls文件对被控主机进行管理:包/文件/网络配置/系统服务/系统用户等。
查看被控主机上grains所有值:(每次minion在启动是都会获取客户端信息)
salt ‘’ grains.ls 列出所有的 grains 项目名字
salt '’ grains.items (静态数据)
salt ‘*’ pillar.items (动态数据)
自定义 grains的方法有两种(客户端自定义配置和服务端写脚本定义):
1.客户端配置(缺点:每台都得去配置,机器多了配置起来不方便)
vi /etc/salt/grains // 添加如下,注意冒号后有空格
role: nginx
env: test
myname: primum est
或者
vi /etc/salt/minion +12
去掉这行内容的注释
default_include: minion.d/*.conf
cd /etc/salt/minion.d/
vi custom_grains.conf // 添加下面内容
grains:
role:
nginx
env:
test
myname:
primum est
重启minion服务
systemctl restart salt-minion
服务端获取 grains
salt ‘web*’ grains.item role env myname // 列出多个
salt ‘web*’ grains.get myname // 列出单个
salt ‘web*’ grains.item myname
grains 在远程执行命令时很方便。我们可以按照 grains 的一些指标来操作。比如把所有的 web 服务器的 grains 的 role 设置为 nginx,那这样我们就可以批量对 nginx 的服务器进行操作了:
salt -G role:nginx cmd.run ‘hostname’
salt -G os:CentOs cmd.run ‘hostname’
2.服务端写Python脚本
服务端写Python脚本:
salt-key
mkdir -p /srv/salt/grains
cd /srv/salt/grains/
vi mytest.py
插入测试脚本:
#!/usr/bin/env python
#* coding:utf-8 *
import os
def my_test():
grains = {}
grains[‘say’] = ‘hello world’
return grains
def my_test1():
grains = {}
with os.popen(‘free -m’) as f:
grains[‘mem_usage’] = f.read()
return grains
salt ‘*’ saltutil.sync_all //同步文件到客户端
在被控端查看同步效果:
[root@web01 ~]# ll /var/cache/salt/minion/extmods/grains/
总用量 8
-rw------- 1 root root 265 4月 20 10:30 mytest.py
-rw------- 1 root root 613 4月 20 10:30 mytest.pyc
接着:
服务端刷新模块
salt ‘’ sys.reload_modules //刷新模板
检测效果:
salt '’ grains.item say
salt ‘*’ grains.item mem_usage
pillar管理模板
服务端自定义配置 pillar
vi /srv/pillar/test.sls // 自定义配置文件,内容如下
conf: /etc/mum.conf
myname: primum est
vi /srv/pillar/top.sls // 总入口文件,内容如下
base:
‘*’:
- test
重启master
systemctl restart salt-master
注意:当更改完 pillar 配置文件后,我们可以通过刷新 pillar 配置来获取新的 pillar 状态:
salt ‘*’ saltutil.refresh_pillar
验证:
salt ‘web01.saltstack.com’ pillar.items
salt ‘web01.saltstack.com’ pillar.item conf
配置管理安装Apache
下面进行的演示是远程通过 yum 方式安装 Apache。步骤如下:
注意:环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。
vi /srv/salt/top.sls
base:
‘web01.saltstack.com’:
- apache
注意:若换成 ‘*’,则表示在所有的客户端执行 apache 模块。
vi /srv/salt/apache.sls
apache-service:
pkg.installed:
- names: // 如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
注意:apache-service 是自定义的 id 名。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running 也是一个函数,来保证指定的服务启动,enable 表示开机启动。
重启服务
systemctl restart salt-master
systemctl restart salt-minion
执行命令
salt ‘web01.saltstack.com’ state.highstate
并且被控端已经运行了httpd服务
网址测试:访问被控端ip地址
http://192.168.80.101/
以上saltstack自动化运维安装httpd服务安装完成