文章目录

  • 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

saltstack beacon 定期执行 saltstack命令_apache


在server端安装并启动 salt-master

saltstack beacon 定期执行 saltstack命令_linux_02


在client端 安装启动salt-minion

修改配置文件/etc/salt/minion

saltstack beacon 定期执行 saltstack命令_linux_03


saltstack beacon 定期执行 saltstack命令_Saltstack_04

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.

saltstack beacon 定期执行 saltstack命令_缩进_05


此时master端的公钥已经上传到minion端

saltstack beacon 定期执行 saltstack命令_缩进_06


测试是否联通

saltstack beacon 定期执行 saltstack命令_nginx_07

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

saltstack beacon 定期执行 saltstack命令_linux_08

  • 运行模块

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

saltstack beacon 定期执行 saltstack命令_nginx_09

分别执行sls

如果要在server2 和server3 上分别安装apache和nginx,原有的sls不能实现,我们要引入top.sls文件

saltstack beacon 定期执行 saltstack命令_linux_10

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