一、saltstack简介
saltStack由Python编写,为server-client模式的系统(在salstack中叫Master-Minion),自己本身支持多master,而puppet则需要依赖于web服务器。saltstack除了可以通过在节点安装客户端进行管理还支持直接通过ssh进行管理。运行模式为master端下发指令,客户端接收指令执行。saltstack依赖于zeromq消息队列,采用yaml格式编写配置文件,比较简单。
支持api及自定义python模块,能轻松实现功能扩展。
saltstack是一个分部式远程执行系统,用来在远程节点上归执行命令和查询数据,它的核心功能如下:
- 使用命令发送到远程系统是并行的而不是串行的
- 使用安全的加密协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
saltstack采用C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口
二、salt-master和salt-minion的安装
node1: salt-master
node2,node3:salt-minion
1.yum源文件的下载
sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm #官网上给的yum源文件,也可以但是速度较慢
sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo #替换成阿里源,下载速度较快
2.安装
node1上:
[root@node1 yum.repos.d]# yum install -y salt-master
[root@node2 yum.repos.d]# yum install -y salt-minion
[root@node3 yum.repos.d]# yum install -y salt-minion
3.服务的开启
[root@node1 yum.repos.d]# systemctl start salt-master
[root@node1 yum.repos.d]# netstat -antlupe
4.mster-node1监听
[root@node1 salt]# yum install -y lsof
[root@node1 salt]# lsof -i :4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 5684 root 15u IPv4 62074 0t0 TCP *:4505 (LISTEN)
[root@node1 salt]# lsof -i :4506
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 5690 root 23u IPv4 62098 0t0 TCP *:4506 (LISTEN)
[root@node1 salt]# systemctl disable --now firewalld #关闭防火墙
[root@node2 salt]# systemctl disable --now firewalld #关闭防火墙
[root@node3 yum.repos.d]# systemctl disable --now firewalld #关闭防火墙
在node2和node3上/etc/salt/里
[root@node2 salt]# vim minion
node3同样添加。启动服务
[root@node2 salt]# systemctl start salt-minion
[root@node3 salt]# systemctl start salt-minion
此时,查看监听的端口:
注意:
node2中/etc/salt/里
5.查看彼此的公钥
node1和node2,3彼此交换公钥来进行通信
node1的公钥给node2和node3各一份:
[root@node1 master]# md5sum master.pub
9a71717b5e260bcee14d40c075e7b282 master.pub
[root@node1 master]# pwd
/etc/salt/pki/master
[root@node2 minion]# md5sum minion_master.pub
9a71717b5e260bcee14d40c075e7b282 minion_master.pub
[root@node3 minion]# md5sum minion_master.pub
9a71717b5e260bcee14d40c075e7b282 minion_master.pub
node2和node3也把给ndoe1一份
[root@node1 minions]# pwd
/etc/salt/pki/master/minions
[root@node1 minions]# md5sum node2
b290e7a082fba220fcd601ad261231e4 node2
[root@node1 minions]# md5sum node3
2fe9a30c04feaaa612ed42c9fa5bba7d node3
[root@node2 minion]# md5sum minion.pub
b290e7a082fba220fcd601ad261231e4 minion.pub
[root@node3 minion]# md5sum minion.pub
2fe9a30c04feaaa612ed42c9fa5bba7d minion.pub
三、saltstack远程执行
salt命令由三个主要部分构成:
1 . salt '<target>' <function> [argument]
target:指定哪些minon,默认的规则是使用glob匹配minion id #salt '*' test.ping
target也可以使用正则表达式 #salt -E 'node[1-3]' test.ping
target也可以指定列表 #salt -L 'node2,node3' test.ping
[root@node1 salt]# salt node2 test.ping #saltstack命令模板
node2:
True
[root@node1 salt]# ansible node2 -m ping #ansible命令模版
node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
salt ‘*’ cmd.run ‘uname -a’ | cmd.run 代表运行远程指令。在所有minion节点上运行’uanme -a’指令 |
ansibel node2 -a ‘df -h’ | ansible默认是-m ,所以直接-a 加命令 |
salt ‘node2’ sys.doc pkg | 查看模块文档 |
salt ‘node2’ pkg.install httpd | |
salt ‘node2’ pkg.remove httpd |
3.1自定义模块
默认目录在/src/salt,此目录没有,需自行创建
[root@node1 _modules]# mkdir /srv/salt/_modules/
[root@node1 _modules]# cd /srv/salt/_modules/
[root@node1 _modules]# vim mydisk.py
def df():
return __salt__['cmd.run']('df -h')
[root@node1 _modules]# salt node2 saltutil.sync_modules #将ndoe1写好的模块同步到node2上
node2:
- modules.mydisk
[root@node1 _modules]# salt node2 mydisk.df #运行自己写的模块
node2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.5G 16G 9% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 80K 496M 1% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
在node2上,模块同步前:
模块同步后:
运行后:
四、了解YAML语法
规则一:缩进
salt需要每个缩进级别由两个空格组成,不要使用tabs
规则二:冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串
- my_keys: my_value
规则三:短横杠
想要表示列表项,使用一个短横杠加一个空格
- list_value_one
- list_vaule_one
创建一个sls文件:
vim /src/salt/apache.sls
httpd: #ID声明
pkg: #状态声明
- installed #函数声明
指定主机执行:
salt ndoe2 state.sls apache
若多台主机安装。创建一个top.sls
[root@node1 salt]# cat top.sls
base:
“*”:
- apache
sls文件命名:
- sls文件以".sls"后缀结尾,但在调用是不用写此后缀
- inin.sls在一个子目录里面表示引导文件,也就表示子目录本身,所以apache/init.sls就是表示apache
- 如果同时存在apache.sls和apache/init.sls,则apache/init.sls被忽略,apache.sls将被用来表示apache
[root@node1 apache]# scp node2:/etc/httpd/conf/httpd.conf .
[root@node1 apache]# ls
httpd.conf init.sls
node2上原本httpd是80端口
[root@node1 apache]# vim httpd.conf
[root@node1 apache]# cat init.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
- httpd-tools
- php
service.running:
- name: httpd
- enable: True
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
再来node2查看端口,已更改为8080: