前言
saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
Salt的核心功能
使命令发送到远程系统是并行的而不是串行的
使用安全加密的协议
使用最小最快的网络载荷 提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
一.Saltstack安装部署
准备三台虚拟机,server5负责saltstack-master端,server67负责saltstack-minion端。
1.设置YUM仓库
首先在server5上操作如下:
vim /etc/yum.repos.d/salt.repo
[salt]
name=salt 3000
baseurl=http://172.25.254.76/3000
gpgcheck=0
yum repolist
或者官方下载
从官方网站下载yum源 仓库地址
yum install https://repo.saltstack.com/yum/redhat/salt-repo-3004.el7.noarch.rpm
server67配置软件仓库
将server5写好的传给67
或者还是通过刚才的官方网站wget去下载
scp /etc/yum.repos.d/salt.repo server5:/etc/yum.repos.d/
scp /etc/yum.repos.d/salt.repo server6:/etc/yum.repos.d/
server5端安装salt-master,并开启服务,查看端口4505和4506是否开启
yum install -y salt-master.noarch
systemctl enable --now salt-master.service
netstat -antlp
在server67操作如下:
安装salt-minion
yum repolist
yum install -y salt-minion
编辑配置文件,使得minion指向master
vim /etc/salt/minion
master: 172.25.76.5
修改之后,重启服务
systemctl enable --now salt-minion.service
2.master端执行命令允许minion连接
salt-key -L #查询
salt-key -A #给两个minion key
3.master端测试与minion端的连接
server5:
salt '*' test.ping
salt '*' cmd.run hostname
可以下载lsof查看端口
yum install -y lsof
lsof -i :4505
lsof -i :4506
默认4505端口开启并指向minion端,连接方式为established。
注意:
monion端修改主机名后,需要删除/etc/salt/minion_id 否则master端会一直显示之前的主机名
当master能够ping通monion之后,我们可以查看配置文件生成的key值,两边是对应一致的
在server5
cd /etc/salt/pki/master/
md5sum master.pub
可以看到master的key值
这时候,在server67上也查看一下:
cd /etc/salt/pki/minion
md5sum minion_master.pub
会发现和master上的key一致,因为master会发送过来自己的key
当然我们还可以再master上收到minion的key
cd /etc/salt/pki/master/minions
md5sum server6
md5sum server7
会看到server67的key
我们这时候,在server67
cd /etc/salt/pki/minion/
md5sum minion.pub
会发现key值server5上查看的server67的一致
4.python进程显示
ps ax 显示python进程简要作用
yum list python-*
yum install -y python-setproctitle.x86_64
systemctl restart salt-master
ps ax
二.sls文件远程执行
salt server? test.ping
使用cmd.run模块查看远程主机系统名和系统信息
salt server6 cmd.run uname
salt server6 cmd.run 'uname -a'
pkg查看版本
salt server6 pkg.version salt-minion
使用pkg模块安装httpd服务
salt server6 pkg.install 'httpd'
启动httpd服务:start
停止httpd服务:stop
salt server6 service.start httpd
salt server6 service.stop httpd
创建salt自定义模板目录
mkdir -p /srv/salt/_modules
cd /srv/salt/_modules
创建自动逸模板
vim my_disk.py
def df():
return __salt__['cmd.run']('df -h')
同步自定义模板到server2
salt server6 saltutil.sync_modules
进入server6中查看生成的结构,这里需要下载tree来查看!
yum install -y tree
cd /var/cache/salt
tree minion/
执行刚才写的模块,注意执行的的时候,后缀为df
salt server2 my_disk.df
1.saltstack安装httpd并启动
在server5中安装httpd
编写.sls文件,默认读取init.sls文件
mkdir apache
cd apache/
cp /etc/httpd/conf/httpd.conf .
vim init.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: apache
执行文件,在server2上安装apache,php
salt server6 state.sls apache
vim httpd.conf # 修改端口后触发watch
再次执行
salt server6 state.sls apache
在server2上查看端口:
查看server2的httpd配置文件端口也变为8080
三.saltstack源码编译安装nginx
我们在来创建一个目录专门存放创建nginx的文件
cd /srv/salt
mkdir nginx
cd nginx/
vim init.sls
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- name: /mnt/nginx-1.20.1.tar.gz # 指定server6解压nginx包的地址
- source: salt://nginx/nginx-1.20.1.tar.gz #需要nginx目录下有安装包
cmd.run:
- name: cd /mnt && tar zxf nginx-1.20.1.tar.gz && cd nginx-1.20.1 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx #一定要写不然一致重复执行!
执行结果如下:
1.启动服务nginx
我们先需要个nginx.service来修改配置
vim service.sls内容如下:
include:
- nginx
nginx-user:
user.present:
- name: nginx
- shell: /sbin/nologin
- home: /usr/local/nginx
- createhome: false
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
此时需要把server6上的nginx配置文件也放在 salt://nginx/nginx.conf
server6:
cd /usr/local/nginx/conf
scp nginx.conf server5:/srv/salt/nginx/
传过来的nginx配置文件修改一下:
vim nginx.conf
salt server6 state.sls nginx.service
2.测试一下
curl server6
四.grains
1.简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
查看模块
salt server6 grains.ls
salt server6 grains.items
查看指定的item ipv4
salt server6 grains.item ipv4
2.自定义grains项
三种添加角色的方式。两种来自minion端,一种在master端
2.1第一种方法
minion端,修改主配:
vim /etc/salt/minion
修改完后记得重启minion服务
systemctl restart salt-minion
查看角色
salt server6 grains.item roles
2.2第二种法
在server7上:添加文件
vim /etc/salt/grains
roles: nginx
测试如下:重启服务后查看server7模板
salt server7 grains.item roles
刷新并查看所有角色
salt '*' saltutil.sync_grains
salt server? grains.item roles
2.3第三种方法
编写grains模块
在salt-master端创建_grains目录:
mkdir _grains
cd _grains/
vim grains.py
#!/usr/bin/env python
def grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
salt '*' saltutil.sync_grains #同步修改到minion
[root@server5 _grains]# salt server6 grains.item hello
server6:
----------
hello:
world
[root@server5 _grains]# salt server7 grains.item hello
server7:
----------
hello:
world
当然我们可以再server67上查看到同步过来的文件,目录
不同节点执行不同角色策略
vim top.sls
base:
'server6':
- apache
'server7':
- nginx.service
highstate执行top
salt '*' saltutil.sync_grains
salt '*' state.highstate
当我们不想输入server67而是直接定位角色名,可以修改如下
vim top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx.service
可以直接用大写G定位角色:
salt -G ‘roles:apache’ cmd.run hostname
五.pillar结合jinja模板使用
vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server6' %}
- text: server6
{% elif grains['fqdn'] == 'server7' %}
- text: server7
{% endif %}
vim /srv/salt/apache/init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
salt '*' state.sls test
执行后查看minion端/mnt/testfile
cd /mnt
cat testfile
为httpd服务添加并修改端口
cd /srv/
mkdir pillar
vim /srv/pillar/pkgs.sls
{% if grains['fqdn'] == 'server6' %}
package: httpd
port: 80
{% elif grains['fqdn'] == 'server7' %}
package: httpd
port: 8080
{% endif %}
vim /srv/pillar/top.sls
base:
'*':
- pkgs
查看pillar是否配置成功
salt '*' pillar.items
1.方法一
vim /srv/salt/apache/init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
- template: jinja
- context:
http_port: {{ pillar['port']}}
http_host: {{ grains['ipv4'][-1]}}
调用已经定义的变量
vim /srv/salt/apache/httpd.conf
Listen {{ grains['ipv4'][-1] }}:{{ pillar['port'] }}
执行:
salt '*' state.sls apache
2.方法二
vim /srv/salt/apache/init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
- template: jinja
- context:
http_port: {{ pillar['port']}}
vim /srv/salt/apache/httpd.conf
Listen {{ grains['ipv4'][-1] }}:{{ pillar['port'] }}
salt ‘*’ state.sls apache
执行成功无报错,查看httpd端口修改成功
ex
2.1注意
vim /srv/salt/apache/init.sls
方法一:
- context:
http_port: {{ pillar['port']}}
http_host: {{ grains['ipv4'][-1]}}
方法二:
- context:
http_port: {{ pillar['port']}}
context部分都可以注释掉,不影响执行,只是为了方便记录和好看,专门写在这里
但是 vim /srv/salt/apache/httpd.conf
是不可以写的,因为它调用了pillar模块