1.saltstack的介绍

(1)saltstack的简介:

Salt 是 一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行) 一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据 开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单 Saltstack(中国用户组 www.saltstack.cn )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。
Saltstack的优势: 有master端和minion端,执行的信息比较稳定,不容易丢失信息,或者出现失联主机的情况 有封装好的http-api,我们可以直接启动salt-api就可以通过http协议进行调用。不需要自己进行第二次的封装。基于centos6和centos7的差异,在两个不同的操作系统中安装saltstack也是不一样的。

(2)Salt的核心功能:

  • 使命令发送到远程系统是并行的而不是串行的
  • 使用安全加密的协议
  • 使用最小最快的网络载荷
  • 提供简单的编程接口

Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。

(3)Saltstack的秘钥安装:

Master与Minion认证 minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。 salt-key -L 或者salt-key 显示所有的key salt-key -D :删除所有认证主机id证书 salt-key -d keys_values -y salt-key -A:接收所有id证书请求 salt-key -a id :接受单个id证书请求。

(4)saltstack通信机制

SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令


Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口

saltstack 需要ssh吗 saltstack有哪些优点_编写远程执行模块_02

2.saltstack安装与配置

(1)设置YUM仓库:

##可以设置官方仓库
 yum install https:///yum/redhat/salt-repo-latest.el7.noarch.rpm
 
 ##或者,将所需软件打包放到apache发布目录下,供自己主机使用
[root@server1 yum.repos.d]# cat salt.repo 
[salt]
name=saltstack
baseurl=http://172.25.33.250/2019
gpgcheck=0

(2)master端设置:

yum install -y salt-master #安装master端

systemctl enable salt-master #设置master自启动

systemctl start salt-master #启动master服务

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_03


(3)mioion端设置:

yum install -y salt-minion #安装minion端
vim /etc/salt/minionmaster: 172.25.33.1 #设置master主机的ip
systemctl enable salt-minion#设置minion自启动
systemctl start salt-minion#设置minion启动

saltstack 需要ssh吗 saltstack有哪些优点_saltstack简介_04


(4)master端执行命令允许minion连接:salt-key -L##显示所有的key

salt-key -A##接收所有id证书请求

saltstack 需要ssh吗 saltstack有哪些优点_yaml语法_05


(5)master端测试与minion端的连接:salt '*' test.ping

saltstack 需要ssh吗 saltstack有哪些优点_saltstack简介_06

3.远程执行shell命令

  • [1] Salt命令由三个主要部分构成:
    salt '<target>' <function> [arguments]target: 指定哪些minion, 默认的规则是使用glob匹配minion id.
    salt '*' test.pingTargets也可以使用正则表达式:
    salt -E 'server[1-3]' test.pingTargets也可以指定列表:
    salt -L 'server2,server3' test.ping
  • [2] Salt命令由三个主要部分构成:
    funcation是module提供的功能,Salt内置了大量有效的functions.
    salt '*' cmd.run 'uname -a'arguments通过空格来界定参数:
    salt 'server2' sys.doc pkg #查看模块文档
    salt 'server2' pkg.install httpd#pkg包管理模块的install方法
    salt 'server2' pkg.remove httpdsalt内置的执行模块列表:
    http://docs.saltstack.cn/ref/modules/all/index.html

4.编写远程执行模块

(1)编辑master配置文件:
vim /etc/salt/master

file_roots:
  base:
    - /srv/salt

重启master服务:

systemctl restart salt-master

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_07


(2)创建模块目录,编写模块文件:

mkdir /srv/salt/_modules编写模块文件:

vim /srv/salt/_modules/mydisk.py

def df():
    return __salt__['cmd.run']('df -h')

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_08


(3)同步模块:

salt server2 saltutil.sync_modules

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_09


(4)运行模块:

salt server2 mydisk.df

saltstack 需要ssh吗 saltstack有哪些优点_yaml语法_10

5.了解YAML语法

  1. 规则一: 缩进
    Salt需要每个缩进级别由两个空格组成,不要使用tabs。
  2. 规则二: 冒号
    字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
    my_key: my_value
  3. 规则三: 短横杠
    想要表示列表项,使用一个短横杠加一个空格。
    - list_value_one
    - list_value_two

6.配置管理

(1)在base目录下创建服务目录,并且创建一个sls文件:

[root@server1 salt]# mkdir apache
[root@server1 salt]# cd apache/
[root@server1 apache]# vim install.sls
install-apache:    # ID声明
  pkg.installed:    ## 函数声明
    - pkgs:           
      - httpd      ##httpd的下载

service-apache:
  service.running:
    - name: httpd     ##httpd服务的开启

saltstack 需要ssh吗 saltstack有哪些优点_saltstack 需要ssh吗_11


saltstack 需要ssh吗 saltstack有哪些优点_yaml语法_12


(2)进行推送,使server2端执行[root@server1 apache]# salt server2 state.sls apache.install

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_13


(3)继续完善install.sls文件,httpd的配置文件还没有做修改

[root@server1 apache]# vim install.sls 
[root@server1 apache]# cat install.sls 
install-apache:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed:         ##这里的文件写法不固定,也可以像备注里的写法一样
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf    ##使用base目录下apache/files/httpd.conf覆盖要执行的主机文件

  service.running:
    - name: httpd
    - reload: true
    - watch:
      - file: install-apache

备注:另外一种写法:
/etc/httpd/conf/httpd.conf:
file.managed:
#  - name: /etc/httpd/conf/httpd.conf
  - source: salt://apache/files/httpd.conf

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_14

saltstack 需要ssh吗 saltstack有哪些优点_saltstack简介_15


修改files下的配置文件:

saltstack 需要ssh吗 saltstack有哪些优点_yaml语法_16


(4)给server2上推送完善后的install.sls文件,server2端会比对md5sum /etc/httpd/conf/httpd.conf和md5sum files/httpd.conf的值,只有两个值不同的时候,该配置文件的修改才会生效

[root@server1 apache]# md5sum files/httpd.conf
04e9239e7bd5d5b9b85864226d60eee5  files/httpd.conf
[root@server2 ~]#  md5sum /etc/httpd/conf/httpd.conf
f5e7449c0f17bc856e86011cb5d152ba  /etc/httpd/conf/httpd.conf

saltstack 需要ssh吗 saltstack有哪些优点_yaml语法_17

saltstack 需要ssh吗 saltstack有哪些优点_saltstack 需要ssh吗_18

[root@server1 apache]# salt server2 state.sls apache.install
server2:
----------
          ID: install-apache
    Function: pkg.installed
      Result: True
     Comment: All specified packages are already installed
     Started: 08:25:50.792417
    Duration: 875.186 ms
     Changes:   
----------
          ID: install-apache
    Function: file.managed
        Name: /etc/httpd/conf/httpd.conf
      Result: True
     Comment: File /etc/httpd/conf/httpd.conf updated
     Started: 08:25:51.672291
    Duration: 128.277 ms
     Changes:   
              ----------
              diff:
                  --- 
                  +++ 
                  @@ -39,7 +39,7 @@
                   # prevent Apache from glomming onto all bound IP addresses.
                   #
                   #Listen 12.34.56.78:80
                  -Listen 80
                  +Listen 8080
                   
                   #
                   # Dynamic Shared Object (DSO) Support
----------
          ID: install-apache
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service reloaded
     Started: 08:25:51.902843
    Duration: 149.251 ms
     Changes:   
              ----------
              httpd:
                  True

Summary for server2
------------
Succeeded: 3 (changed=2)
Failed:    0
------------
Total states run:     3
Total run time:   1.153 s

saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_19


saltstack 需要ssh吗 saltstack有哪些优点_远程执行shell命令_20

此时,观察server2上的端口是否改变:因为端口的改变不能依靠重新加载,所以在server2上重启服务

[root@server2 ~]# systemctl restart httpd
[root@server2 ~]# netstat -tnlp    ##端口已经更改
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      800/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1052/master         
tcp6       0      0 :::8080                 :::*                    LISTEN      1817/httpd          
tcp6       0      0 :::22                   :::*                    LISTEN      800/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1052/master

saltstack 需要ssh吗 saltstack有哪些优点_saltstack简介_21


再看md5sum /etc/httpd/conf/httpd.conf和md5sum files/httpd.conf的值,发现两个值一致了

saltstack 需要ssh吗 saltstack有哪些优点_saltstack简介_22


查看server2上的进程[root@server2 ~]# ps ax

saltstack 需要ssh吗 saltstack有哪些优点_编写远程执行模块_23


就这样,推送简单服务(以http服务为例)就实现了!!!