自动化运维saltstack

自动化运维saltstack

evobot 764 2018-09-18
  1. 自动化运维介绍
  2. saltstack安装
  3. 启动saltstack服务
  4. saltstack配置认证

自动化运维介绍

  • 由于传统运维效率低、大多数工作由人工完成,并且工作繁琐、重复,容易出错,没有标准化流程,导致运维的脚本繁多,不能方便管理,而自动化运维就是用来解决上面的这些问题;
  • 常见的自动化运维工具有以下几种:
    1. Puppet:基于ruby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、软件包、系统服务等,分为免费的社区版和收费的企业版,企业版支持图形化配置。
    2. Saltstack:基于python开发,c/s架构,支持多平台,比Puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能;
    3. Ansible:更加简洁的自动化运维工具,不需要在客户端上安装agent,基于python开发,可以实现批量操作系统配置、批量程序部署、批量运行命令。

saltstack安装

  • saltstack可以使用salt-ssh远程执行,类似ansible;也支持c/s架构,这里主要介绍c/s架构的使用;

  • 首先准备两台机器,一台为服务端,IP为192.168.49.128,hostname为vm1,一台为客户端,IP为192.168.49.129,hostname为vm2,使用hostnamectl set-hostname [hostname]设置机器的hostname;

  • 两台机器都要安装saltstack的yum源,使用下面的命令安装yum源:

    yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm 
    
  • 然后在服务端上安装salt-mastersalt-minion软件包,而客户端只需要安装salt-minion软件包,

  • 两台机器还需要设置hosts,内容如下:

    192.168.49.128 vm1
    192.168.49.129 vm2
    

saltstack服务及配置

启动saltstack相关服务

  • 在服务端上编辑配置文件/etc/salt/minion,找到master: salt配置,去掉注释,改为master: vm1

  • 在客户端上同样编辑配置文件,将master: salt改为master: vm1

  • 然后使用下面的命令启动服务端上的saltstack服务:

    //先启动salt-minion服务
    systemctl start salt-minion
    //再启动salt-master服务
    systemctl start salt-master
    
  • 如果启动报错提示信息如下,则需要更新python的psutil包,使用pip install psutil --upgrade进行更新:

    [root@vm1 ~]# systemctl status salt-master
    ● salt-master.service - The Salt Master Server
       Loaded: loaded (/usr/lib/systemd/system/salt-master.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since 二 2018-09-18 22:45:55 CST; 3min 39s ago
         Docs: man:salt-master(1)
               file:///usr/share/doc/salt/html/contents.html
               https://docs.saltstack.com/en/latest/contents.html
      Process: 2399 ExecStart=/usr/bin/salt-master (code=exited, status=1/FAILURE)
     Main PID: 2399 (code=exited, status=1/FAILURE)
    
    9月 18 22:45:55 vm1 salt-master[2399]: import salt.config as config
    9月 18 22:45:55 vm1 salt-master[2399]: File "/usr/lib/python2.7/site-packages/s...e>
    9月 18 22:45:55 vm1 salt-master[2399]: import psutil
    9月 18 22:45:55 vm1 salt-master[2399]: File "/usr/lib64/python2.7/site-packages...e>
    9月 18 22:45:55 vm1 salt-master[2399]: import psutil._pslinux as _psplatform
    9月 18 22:45:55 vm1 salt-master[2399]: AttributeError: 'module' object has no a...x'
    9月 18 22:45:55 vm1 systemd[1]: salt-master.service: main process exited, code...URE
    9月 18 22:45:55 vm1 systemd[1]: Failed to start The Salt Master Server.
    9月 18 22:45:55 vm1 systemd[1]: Unit salt-master.service entered failed state.
    9月 18 22:45:55 vm1 systemd[1]: salt-master.service failed.
    Hint: Some lines were ellipsized, use -l to show in full.
    
    
  • 在服务端上,可以查看saltstack运行的服务和端口:

    [root@vm1 ~]# ps aux |grep aslt
    root       3935  0.0  0.2 112724   972 pts/0    S+   22:59   0:00 grep --color=auto aslt
    [root@vm1 ~]# ps aux |grep salt
    root       2468  0.0  1.4 314060  6988 ?        Ss   22:52   0:00 /usr/bin/python /usr/bin/salt-minion
    root       2471  0.2  7.5 572724 36372 ?        Sl   22:52   0:01 /usr/bin/python /usr/bin/salt-minion
    root       2479  0.0  3.2 409020 15556 ?        S    22:52   0:00 /usr/bin/python /usr/bin/salt-minion
    root       2548  0.1  7.3 394052 35688 ?        Ss   22:52   0:00 /usr/bin/python /usr/bin/salt-master
    root       2553  0.0  4.2 311060 20700 ?        S    22:52   0:00 /usr/bin/python /usr/bin/salt-master
    root       2558  0.0  7.1 474936 34408 ?        Sl   22:52   0:00 /usr/bin/python /usr/bin/salt-master
    root       2559  0.0  7.1 393396 34632 ?        S    22:52   0:00 /usr/bin/python /usr/bin/salt-master
    root       2562  0.9 10.5 419492 51248 ?        S    22:52   0:03 /usr/bin/python /usr/bin/salt-master
    root       2563  0.0  7.2 394052 35312 ?        S    22:52   0:00 /usr/bin/python /usr/bin/salt-master
    root       2564  1.9  7.2 770908 35248 ?        Sl   22:52   0:07 /usr/bin/python /usr/bin/salt-master
    root       2565  0.5  9.9 492556 48304 ?        Sl   22:52   0:02 /usr/bin/python /usr/bin/salt-master
    root       2572  0.1  7.3 467784 35628 ?        Sl   22:52   0:00 /usr/bin/python /usr/bin/salt-master
    root       2573  0.5  9.9 492532 48268 ?        Sl   22:52   0:02 /usr/bin/python /usr/bin/salt-master
    root       2574  0.5 10.0 492532 48536 ?        Sl   22:52   0:02 /usr/bin/python /usr/bin/salt-master
    root       2576  0.5  9.9 492540 48284 ?        Sl   22:52   0:02 /usr/bin/python /usr/bin/salt-master
    root       2577  0.5  9.9 492536 48280 ?        Sl   22:52   0:02 /usr/bin/python /usr/bin/salt-master
    
    
    • 可以看到saltstack的服务实际上是由python运行的;
    [root@vm1 ~]# netstat -tlnp
    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      1272/sshd           
    tcp        0      0 0.0.0.0:4505            0.0.0.0:*               LISTEN      2558/python         
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1968/master         
    tcp        0      0 0.0.0.0:4506            0.0.0.0:*               LISTEN      2564/python         
    tcp6       0      0 :::22                   :::*                    LISTEN      1272/sshd           
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1968/master         
    
    • 其中4505,4506就是saltstack服务端监听的端口,其中4505是用来发布消息的,是saltstack的zeromq消息队列依赖包使用的,4506则是master和minion之间用来通信的端口。
  • 客户端上只需要启动salt-minion服务,服务启动后并不会监听任何端口:

    systemctl start salt-minion
    
    [root@vm2 ~]# ps aux |grep salt
    root       2422  0.0  4.4 313772 21396 ?        Ss   22:58   0:00 /usr/bin/python /usr/bin/salt-minion
    root       2425  0.3  8.8 567280 42648 ?        Sl   22:58   0:01 /usr/bin/python /usr/bin/salt-minion
    root       2433  0.0  4.1 404068 20152 ?        S    22:58   0:00 /usr/bin/python /usr/bin/salt-minion
    
    [root@vm2 ~]# netstat  -tlnp
    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      991/sshd            
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1469/master         
    tcp6       0      0 :::22                   :::*                    LISTEN      991/sshd            
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1469/master     
    

认证配置

  • master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来进行加密和解密的;

  • minion在第一次启动时,会在/etc/salt/pki/minion/下生成minion.pemminion.pub两个文件,其中.pub为公钥,他会把公钥传输给master,但只有在进行认证的时候才会进行传输:

    [root@vm2 ~]# ls /etc/salt/pki/minion/
    minion.pem  minion.pub
    
    
  • master第一次启动时,也会在/etc/salt/pki/master下生成密钥对,当master收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后,就会在/etc/salt/pki/master/minion/目录下存放接受的公钥,并更名为minion客户端主机名,同时客户端也会接受master传过去的公钥,并把它放在/etc/salt/pki/minion/目录下,命名为minion_master.pub

    [root@vm1 ~]# ls /etc/salt/pki/master/
    master.pem  master.pub  minions  minions_autosign  minions_denied  minions_pre  minions_rejected
    
    
  • 上面的认证过程,需要借助salt-key工具来实现,在服务端上执行salt-key -a [client_hostname]命令,可以认证制定的主机:

    [root@vm1 ~]# salt-key -a vm2
    The following keys are going to be accepted:
    Unaccepted Keys:
    vm2
    Proceed? [n/Y] y
    Key for minion vm2 accepted.
    
    
  • 认证完成后,可以直接执行salt-key命令查看认证的秘钥:

    [root@vm1 ~]# salt-key 
    Accepted Keys:
    vm2
    Denied Keys:
    Unaccepted Keys:
    vm1
    Rejected Keys:
    
    
  • 然后在服务端的目录内,可以看到客户端的公钥:

    [root@vm1 ~]# ls /etc/salt/pki/master/minions
    vm2
    
    
  • 客户端同样会保存服务端的公钥:

    [root@vm2 ~]# ls /etc/salt/pki/minion/
    minion_master.pub  minion.pem  minion.pub
    
    
  • salt-key-a选项,只能认证指定的主机,而-A选项,则可以一次认证所有的客户端,关于salt-key命令,还有以下几个选项:

    • -r:跟主机名,拒绝指定主机;
    • -R:拒绝所有主机;
    • -d:跟主机名,删除主机认证;
    • -D:删除所有主机认证;
    • -y:省略交互,直接确认认证,相当于上面认证过程中不再需要按y。
    [root@vm1 ~]# salt-key -D
    The following keys are going to be deleted:
    Accepted Keys:
    vm2
    Unaccepted Keys:
    vm1
    Proceed? [N/y] y
    Key for minion vm1 deleted.
    Key for minion vm2 deleted.
    [root@vm1 ~]# salt-key -A
    The following keys are going to be accepted:
    Unaccepted Keys:
    vm1
    Proceed? [n/Y] y
    Key for minion vm1 accepted.
    [root@vm1 ~]# salt-key
    Accepted Keys:
    vm1
    Denied Keys:
    Unaccepted Keys:
    Rejected Keys:
    
    
    • 这里会发现删除所有认证之后再重新认证,会无法找到vm2,解决的办法是重启客户端的salt-minion服务,然后再服务端重新进行认证即可:
    [root@vm2 ~]# systemctl restart salt-minion
    [root@vm1 ~]# salt-key -A
    The following keys are going to be accepted:
    Unaccepted Keys:
    vm2
    Proceed? [n/Y] y
    Key for minion vm2 accepted.
    [root@vm1 ~]# salt-key 
    Accepted Keys:
    vm1
    vm2
    Denied Keys:
    Unaccepted Keys:
    Rejected Keys:
    


# saltstack