文章目录
官网教程:
http://docs.saltstack.cn/topics/tutorials/walkthrough.html
server1 :192.168.1.11 master端
server2 : 192.168.1.12 minion端
server3 : 192.168.1.13 minion端
saltstack简介
- saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
- saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
- saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
Salt的核心功能
-
使命令发送到远程系统是并行的而不是串行的
-
使用安全加密的协议
-
使用最小最快的网络载荷
-
提供简单的编程接口
-
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
-
区别:
Salt 和ansible 最大的区别在于salt是具有客户端的,而 ansible 没有,salt 直接获取root权限进行访问
saltstack通信机制
- SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ(轻量级)消息队列通信,默认监听4505端口。saltstack的优势就在于这个ZMQ,它运行起来的速度比ansible快很多
- Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口,就是接受客户端的回执的。
安装与配置
-
进入官网下载,或者使用国内的开源镜像网站(如清华大学镜像和中科大镜像网站或者阿里云)进行下载:
yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
-
设置官方yum仓库
因为这条命令会产生一个新的yum源,然而这个yum源的镜像地址并不是非常快,我们把它换成aliyun的地址,会快一些[root@rhel7 yum.repos.d]# ls redhat.repo salt-latest.repo [root@rhel7 yum.repos.d]# cat salt-latest.repo [salt-latest] name=SaltStack Latest Release Channel for RHEL/Centos $releasever baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/latest ##阿里云的镜像地址 failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
更改后查看yum源是否配置好:
[root@rhel7 yum.repos.d]# yum repolist Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. repo id repo name status salt-latest/x86_64 SaltStack Latest Release Channel for RHEL/Centos 7Serv 83 repolist: 83
在server2上做同样的配置。
master节点配置:server1
[root@rhel7 yum.repos.d]# yum install -y salt-master Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. Resolving Dependencies --> Running transaction check ---> Package salt-master.noarch 0:3000.3-1.el7 will be installed ......省略 --> Finished Dependency Resolution Error: Package: salt-3000.3-1.el7.noarch (salt-latest) ##注意这里的依赖性并没有得到解决 Requires: python-markupsafe Error: Package: salt-3000.3-1.el7.noarch (salt-latest) Requires: python-jinja2 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest
解决依赖性,成功安装
设置自启动 [root@server1 Downloads]# systemctl enable salt-master Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service. 启动 [root@server1 Downloads]# systemctl start salt-master 安装用来查看已经打开的端口的包 [root@server1 Downloads]# yum install -y lsof Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. Nothing to do 接受请求 [root@server1 Downloads]# lsof -i :4506 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 11417 root 23u IPv4 82603 0t0 TCP *:4506 (LISTEN) 消息队列 [root@server1 Downloads]# lsof -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 11411 root 15u IPv4 82565 0t0 TCP *:4505 (LISTEN)
minion节点配置:server2,server3
yum install -y salt-minion #安装minion端 vim /etc/salt/minion #对minion端的配置文件进行配置 master: 192.168.1.11 #指定master端 systemctl enable salt-minion #设置自启动minion systemctl start salt-minion #开启自启动
配置完minion端之后,查看master端
[root@server1 Downloads]# lsof -i :4506 #请求消息端口 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14705 root 23u IPv4 104656 0t0 TCP *:4506 (LISTEN) # server2向server1发送的请求 salt-mast 14705 root 30u IPv4 115223 0t0 TCP server1:4506->192.168.1.12:51154 (ESTABLISHED) # server3向server1发送的请求 salt-mast 14705 root 31u IPv4 115229 0t0 TCP server1:4506->192.168.1.13:45888 (ESTABLISHED) [root@server1 Downloads]# lsof -i :4505 #消息队列 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14699 root 15u IPv4 104627 0t0 TCP *:4505 (LISTEN)
这时master端需要通过key去允许minion端的连接
[root@server1 Downloads]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: server2 server3 Rejected Keys:
同意key:-A允许所有
[root@server1 Downloads]# salt-key -A The following keys are going to be accepted: Unaccepted Keys: server2 server3 Proceed? [n/Y] y Key for minion server2 accepted. Key for minion server3 accepted.
再次查看
[root@server1 Downloads]# salt-key -L Accepted Keys: server2 server3 Denied Keys: Unaccepted Keys: Rejected Keys: #请求队列 [root@server1 Downloads]# lsof -i :4506 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14705 root 23u IPv4 104656 0t0 TCP *:4506 (LISTEN) #消息队列(已经建立长链接,master发的时候,minion端就可以收到) [root@server1 Downloads]# lsof -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14699 root 15u IPv4 104627 0t0 TCP *:4505 (LISTEN) salt-mast 14699 root 17u IPv4 118817 0t0 TCP server1:4505->192.168.1.12:53022 (ESTABLISHED) salt-mast 14699 root 18u IPv4 118822 0t0 TCP server1:4505->192.168.1.13:41772 (ESTABLISHED)
注意: 当我们更改了主机名时,要及时的去这个文件中更改,或者删除文件,重启minion端。因为salt会去读文件中的名字
[root@server2 salt]# cat minion_id server2 [root@server2 salt]# pwd /etc/salt
查看更详细的进程信息:
安装
[root@server1]# yum install -y python-setproctitle.x86_64
重启salt
[root@server1]# systemctl restart salt-master.service
[root@server1]# ps ax
...
19546 ? S 0:00 /usr/bin/python /usr/share/PackageKit/helpers/yum/yu
19554 ? Ss 0:00 /usr/bin/python /usr/bin/salt-master ProcessManager
19565 ? S 0:00 /usr/bin/python /usr/bin/salt-master Multiprocessing
消息队列
19578 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master ZeroMQPubServer
19579 ? S 0:00 /usr/bin/python /usr/bin/salt-master EventPublisher
19582 ? S 0:00 /usr/bin/python /usr/bin/salt-master Maintenance
请求队列
19583 ? S 0:00 /usr/bin/python /usr/bin/salt-master ReqServer_Proce
维护队列
19584 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master MWorkerQueue
19585 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-0
19586 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
19593 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master FileserverUpdat
19594 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-2
19595 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-3
19598 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
19897 pts/1 R+ 0:00 ps ax
在master端测试ping在minion端的执行情况:
[root@server1 ~]# salt '*' test.ping #*表示在key中能识别的所有主机
server3:
True
server2:
True
指定key进行测试:
[root@server1 ~]# salt server2 test.ping
server2:
True
我们当前是以超户身份进行远程命令:
[root@server1 ~]# salt server2 cmd.run pwd
server2:
/root
[root@server1 ~]# salt server2 cmd.run 'touch /tmp/file'
server2:
[root@server2 yum.repos.d]# ls /tmp/file
/tmp/file
slatstack远程执行
- 测试连接
- 远程执行命令
salt命令
salt命令由三个主要部分组成:
salt '<target>' <function> [arguments]
-
target:指定哪些minion,默认的规则是使用glob匹配minion_id
salt '*' test.ping
targets也可以使用正则表达式:
salt -E 'server[1-3]' test.ping
targets也可以指定列表:
salt -L 'server2,server3' test.ping
-
function是module提供的功能,salt内置了大量有效的functions
http://docs.saltstack.cn/ 查看中文手册 [root@server1 ~]# salt '*' cmd.run 'uname -a' server3: Linux server3 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux server2: Linux server2 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
-
arguments通过空格来界定参数
salt 'server2' sys.doc pkg #查看模块文档 salt 'server2' pkg.install httpd salt 'server2' pkg.remove httpd #这样就很简单的完成了远程安装 [root@server1 ~]# salt 'server2' pkg.remove httpd server2: ---------- httpd: ---------- new: old: 2.4.6-88.el7 [root@server1 ~]# salt 'server2' pkg.install httpd server2: ---------- httpd: ---------- new: 2.4.6-88.el7 old:
命令由4505端口推送,结果由4506接收
salt内置的执行模块(写文件时的用法)
http://docs.saltstack.cn/ref/modules/all/index.html
salt的数据都会保存在/var/cache/salt目录中
[root@server2 yum.repos.d]# cd /var/cache/salt
[root@server2 salt]# tree .
.
└── minion
├── extmods
└── proc
3 directories, 0 files
编写远程执行模块
除了由salt内置的执行模块,作为用户自己也可以再编写自己的模块。
[root@server1 ~]# vim /etc/salt/master
......
file_roots:
base:
- /srv/salt ##salt的base目录
记得重新启动服务:
[root@server1 ~]#
systemctl restart salt-master
创建目录:
[root@server1 ~]# cd /srv/salt ##salt的base目录,所有数据会被定义到这里
[root@server1 ~]# mkdir /srv/salt/_moudles ##模块固定存放位置
编写远程文件并执行:
[root@server1 _modules]# vim mydisk.py
def py():
return __salt__['cmd.run']('df -h') ##注意双下划线
[root@server1 _modules]# salt server2 saltutil.sync_modules ##同步到server2
server2:
- modules.mydisk
查看server2:
[root@server2 salt]# tree .
.
└── minion
├── extmods
│ └── modules
│ └── mydisk.py
├── files
│ └── base ##base目录时/srv/salt
│ └── _modules
│ └── mydisk.py
├── module_refresh
└── proc
7 directories, 3 files
[root@server2 salt]# pwd
/var/cache/salt
可见文件server2存到了/var/cache/salt/下,现在我们远程调用试试,调用mydisk文件的df方法:
[root@server1 _modules]# salt server2 mydisk.df
server2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 3.7G 14G 22% /
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 140K 910M 1% /dev/shm
tmpfs 910M 11
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/nvme0n1p1 1014M 179M 836M 18% /boot
tmpfs 182M 12K 182M 1% /run/user/42
tmpfs 182M 0 182M 0% /run/user/0
配置管理
- salt状态系统的核心是SLS,或者叫SaLt State文件。
- SLS表示系统将会是什么样的一个状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件的两种写法:
[root@server1 _modules]# cd /srv/salt ## 文件路径
[root@server1 salt]# vim apache.sls
[root@server1 salt]# cat apache.sls
httpd: ##软件包声明
pkg: ##状态模块声明
- installed ##函数声明
或写在一起:
[root@server1 salt]# cat apache.sls
httpd:
pkg.installed
推送过去,注意此时的推送命名方式,不要写错了:
[root@server1 salt]# salt server2 state.sls apache
server2:
----------
ID: httpd
Function: pkg.installed
Result: True
Comment: The following