saltstack和ansible不同,他采用分布式远程执行系统,用来在远程节点执行命令和查询数据。
saltstack核心功能是使用命令发送远程系统的是采用并行的而不是串行的。并且使用安全加密,提供简单的编程接口和最小的网络载荷。
安装saltstack
提前停止防火墙。
安装时根据阿里云或者官方说明都可以
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
首先安装一个rpm包。安装完成生成一个yum源。
[root@server10 yum.repos.d]# cat salt-latest.repo
[salt-latest]
name=SaltStack Latest Release Channel for RHEL/Centos $releasever
baseurl=https://repo.saltstack.com/yum/redhat/7/$basearch/latest
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
这个源是官方的,比较慢,可以换成阿里云的。直接执行命令
sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo
需要在每个设备都进行安装yum源,然后在控制节点安装master在普通节点安装minion。
[root@server10 ~]# yum install salt-master.noarch -y
[root@server11 ~]# yum install -y salt-minion.noarch
安装完成直接启动服务,在master端不用改配置文件。
[root@server10 ~]# systemctl start salt-master.service
[root@server10 ~]# yum install -y python-setproctitle.x86_64
[root@server10 ~]# systemctl restart salt-master.service
[root@server10 ~]# ps ax
3217 ? Ss 0:00 /usr/bin/python /usr/bin/salt-master ProcessManager
3224 ? S 0:00 /usr/bin/python /usr/bin/salt-master MultiprocessingLoggingQueue
3231 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master ZeroMQPubServerChannel
3232 ? S 0:00 /usr/bin/python /usr/bin/salt-master EventPublisher
3235 ? S 0:00 /usr/bin/python /usr/bin/salt-master Maintenance
3236 ? S 0:00 /usr/bin/python /usr/bin/salt-master ReqServer_ProcessManager
3237 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master MWorkerQueue
3238 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-0
3246 ? S 0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
3247 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-2
3248 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-3
3249 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master FileserverUpdate
3251 ? S 0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
4096 pts/0 R+ 0:00 ps ax
4097 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
4098 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
这时就能看见有很多服务打开,有分配的,有发布订阅的不同进程
服务开启后系统会打开两个端口4505和4506
在minion端
首先修改配置文件,/etc/salt/minion文件将下面的master打开,写的时候一定要顶格。后面ip指定master端
master: 192.168.122.10
配置完成打开服务
[root@server11 salt]# systemctl start salt-minion.service
全部完成之后下一步进行安全认证。
[root@server10 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server11
server12
Rejected Keys:
服务开启后两个节点会等待授权。
[root@server10 ~]# salt-key -A ##A是添加所有 a是一个个添加
The following keys are going to be accepted:
Unaccepted Keys:
server11
server12
Proceed? [n/Y] y
Key for minion server11 accepted.
Key for minion server12 accepted.
[root@server10 ~]# salt-key -L ##授权完毕之后我们就可以看到效果
Accepted Keys:
server11
server12
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@server10 ~]# salt '*' test.ping ##两个都已经连接上了
server12:
True
server11:
True
[root@server10 ~]# lsof -i :4505 ##从这里可以看到4505端口持续保持连接
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 3231 root 16u IPv4 31623 0t0 TCP *:4505 (LISTEN)
/usr/bin/ 3231 root 18u IPv4 35908 0t0 TCP server10:4505->server12:55318 (ESTABLISHED)
/usr/bin/ 3231 root 19u IPv4 35913 0t0 TCP server10:4505->server11:53290 (ESTABLISHED)
创建完成继续查看,在/etc/salt/pki
目录中保存我们所有的证书。
远程执行命令
命令组成为
salt 用户名(这个用户名可以在/etc/salt/minion_id文件中查看,当我们更改用户名后要记得把这个文件删掉,不然会有问题) 模块+.+方法
比如说:
[root@server10 ~]# salt server11 test.ping ##测试连接 test是模块ping是方法
server11:
True
也可以使用正则表达,例如:
[root@server10 ~]# salt -E server'[10-13]' test.ping
server11:
True
server12:
True
也可以指定列表,例如:
[root@server10 ~]# salt -L 'server11,server12' test.ping
server11:
True
server12:
True
当然salt中还有很多模块,比如执行命令的模块cmd.run,这个后面接命令,连接过去运行时的身份就是root用户。
[root@server10 ~]# salt server11 cmd.run hostname
server11:
server11
salt的内置模块是很多的,有需要可以去官网查看文档。
但是有时候模块用的不舒服或者没有匹配的模块,这时我们可以自己编写模块进行使用。
如何编写,首先找到他的默认提取的文件地址。
[root@server10 ~]# vim /etc/salt/master
#file_roots:
# base:
# - /srv/salt ##这里为他的默认地址
/srv/salt文件默认是不存在的,需要你进行手动创建。进入这个目录后再创建一个目录来编写自己的模块。
[root@server10 ~]# mkdir /srv/salt
[root@server10 ~]# cd /srv/salt
[root@server10 salt]# mkdir _modules ##这个文件名是固定的
[root@server10 salt]# cd _modules
创建一个python文件进行编写
[root@server10 _modules]# vim mydisk.py
def df():
return __salt__['cmd.run']('df -h')
编写完成后如何使用?
在普通节点上的/var/cache/salt
目录下有一个minion目录,所有东西都会由master推送到远端。而这个目录中保存的就是这些数据文件。
如何推送到远端。
[root@server10 _modules]# salt server11 saltutil.sync_modules ##需要刷新一下,将模块进行同步
server11:
- modules.mydisk
[root@server11 salt]# tree . ##从这里看到,模块已经推送过来
.
└── minion
├── extmods
│ └── modules
│ └── mydisk.py
├── files
│ └── base
│ └── _modules
│ └── mydisk.py
├── module_refresh
└── proc
推送完成可以进行测试
[root@server10 _modules]# salt server11 mydisk.df ##mydisk为模块名 df为刚才里面设置的函数
server11:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 60K 496M 1% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/mapper/centos-root 13G 1.7G 11G 14% /
/dev/sda1 1014M 136M 879M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
编写sls文件
sls文件和ansible中的playbook差不多。
比如安装一个apache软件包
[root@server10 salt]# vim apache.sls
httpd:
pkg.installed
文件编写好了如果使用呢?
[root@server10 salt]# salt server11 state.sls apache##指明用户 调用模块 最后为文件名,写文件名的时候可以不加后缀
server11:
----------
ID: httpd
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 21:17:38.630154
Duration: 765.219 ms
Changes:
Summary for server11
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 765.219 ms
如果需要多个节点都安装,那么再编写一个文件
[root@server10 salt]# vim top.sls
base:
'*':
- apache
然后再次推送
[root@server10 salt]# salt '*' state.highstate
这样就会给所有识别的节点进行推送
如果想一次性安装多个软件,按照刚才的方法走会写成这样
httpd:
pkg.installed
httpd-tools:
pkg.installed
就会很麻烦,那么就要使用别的方法来进行书写。
install-apache: ##定义一个固定的名字,唯一性声明
pkg.installed: ##调用模块
- pkgs:
- httpd ##安装的内容
- httpd-tools
- php
[root@server10 salt]# salt server11 state.sls apache ##推送远端,就可以进行安装了