文章目录
- Salt介绍
- ZeroMQ
- Salt安装
- Salt命令
- Salt远程执行shell命令
- 其他Salt模块
- 自定义Salt模块
- Salt sls
- Salt yaml语法
- 例子
- 分别执行sls
Salt介绍
Salt 是:
一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)
一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据
开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更稳定
Salt的核心功能
- 使命令发送到远程系统是并行的而不是串行的
- 使用安全加密的协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
ZeroMQ
ZeroMQ是由一套组件组成,内封装的有网络通信,消息队列,线程调度等功能并向上层提供了简洁的API接口,应用程序通过加载库文件,调用API函数来实现高性能网络通信。
ZeroMQ将网络通信分成4种模型,分别是一对一结对模型(Exclusive-Pair)、请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)。这4种模型总结出了通用的网络通信模型,在实际中可以根据应用需要,组合其中的2种或多种模型来形成自己的解决方案。
saltstack-master与minion通信就采用了zeromq的请求回应模型(request-reply)和发布订阅模型(publish-subscribe)
Salt安装
使用阿里云镜像
yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo
在server端安装并启动 salt-master
在client端 安装启动salt-minion
修改配置文件/etc/salt/minion
minion在第一次启动时会在/etc/salt/下生成/pki/minion目录,并在下面创建minion.pem(私钥)和minion.pub(公钥),然后主动将minion.pub发送到master的/etc/salt/pki/master/minions.pre/下面,并且文件以minion的id文件内的数据命名,等待认证。在master上执行salt-key -L命令可以查看等待签证的minion。执行salt-key -A -y命令同意所有没有签证的minion。这时minion会在/etc/salt/pki/minion/下生成minion_master.pub文件,注这个是master的公钥文件。并且master会将/pki/master/minions.pre目录下的公钥转移到/pki/master/minions/目录下表示已经认证,这时master就可以管理minion了。
server1 :
[root@server1 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2
Rejected Keys:
表示有一个主机等待签名
接受所有主机
[root@server1 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
server2
Proceed? [n/Y] y
Key for minion server2 accepted.
此时master端的公钥已经上传到minion端
测试是否联通
Salt命令
Salt远程执行shell命令
- Salt命令由三个主要部分构成:
salt '<target>' <function> [arguments]
例子:
[root@server1 ~]# salt -L 'server2,server3' 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
其他Salt模块
自定义Salt模块
- 编辑master配置文件
- 在/srv/salt下新建模块
- 同步模块
salt server2 saltutil.sync_modules
- 运行模块
Salt sls
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:
sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
使用子目录来做组织是个很好的选择。
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache
.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
Salt yaml语法
- 规则一: 缩进
YAML使用一个固定的缩进风格表示数据层结构关系。Salt需要每个缩进级别由两个空格组成。不要使用tabs。 - 规则二: 冒号
Python的字典当然理所当然是简单的键值对。其他语言的用户应该知道这个数据类型叫哈希表或者关联数组。 - 规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表的一部分。
例子
以安装配置httpd为例:
apache-deploy:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: apache-deploy
分别执行sls
如果要在server2 和server3 上分别安装apache和nginx,原有的sls不能实现,我们要引入top.sls文件
base:
'server2':
- httpd.service
'server3':
- nginx.service
[root@server1 nginx]# salt '*' state.highstate
server2:
----------
ID: apache-deploy
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 20:09:30.076504
Duration: 768.937 ms
Changes:
----------
ID: apache-deploy
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf is in the correct state
Started: 20:09:30.849301
Duration: 37.272 ms
Changes:
----------
ID: apache-deploy
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 20:09:30.888004
Duration: 72.824 ms
Changes:
Summary for server2
------------
Succeeded: 3
Failed: 0
------------
Total states run: 3
Total run time: 879.033 ms
server3:
----------
ID: nginx-install
Function: file.managed
Name: /mnt/nginx-1.18.0.tar.gz
Result: True
Comment: File /mnt/nginx-1.18.0.tar.gz is in the correct state
Started: 20:09:27.265019
Duration: 76.949 ms
Changes:
----------
ID: nginx-install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 20:09:29.353211
Duration: 764.783 ms
Changes:
----------
ID: nginx-install
Function: cmd.run
Name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
Result: True
Comment: /usr/local/nginx exists
Started: 20:09:30.120760
Duration: 0.907 ms
Changes:
----------
ID: /usr/local/bin/nginx
Function: file.symlink
Result: True
Comment: Symlink /usr/local/bin/nginx is present and owned by root:root
Started: 20:09:30.121869
Duration: 2.348 ms
Changes:
----------
ID: nginx-service
Function: file.managed
Name: /usr/lib/systemd/system/nginx.service
Result: True
Comment: File /usr/lib/systemd/system/nginx.service is in the correct state
Started: 20:09:30.124467
Duration: 20.117 ms
Changes:
----------
ID: nginx-service
Function: service.running
Name: nginx
Result: True
Comment: Service nginx has been enabled, and is running
Started: 20:09:30.145809
Duration: 818.117 ms
Changes:
----------
nginx:
True
Summary for server3
------------
Succeeded: 6 (changed=1)
Failed: 0
------------
Total states run: 6
Total run time: 1.683 s