• saltstack 入门


    1、Saltstack是什么?

    saltstack 是一个异构平台基础设施管理工具,具有远程执行、配置管理、云管理、只需花费数分钟就可以运行起来,扩展性足以支撑上万台服务器,速度快,服务器之间秒级通讯数秒钟即可完成数据传递。

    Saltstack三大功能

    • 远程执行
    • 配置管理(状态)
    • 云管理

    Saltstack四种运行方式

      local  本地运行

      minion/master 传统方式运行

      syndic   分布式

      salt SSH

    Saltstack常用网址

    saltstack官方网站

    saltstack官方文档

    2、Saltstack快速安装

    实验环境

    [root@salt0-master yum.repos.d]# uname -a   //内核参数
    Linux salt0-master 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    [root@salt0-master yum.repos.d]# hostname   //主机名
    salt0-master
    [root@salt0-master yum.repos.d]# hostname -I  //主机ip
    10.0.0.51 172.16.1.51 
    [root@salt0-master yum.repos.d]# cat /etc/redhat-release  //系统版本
    CentOS Linux release 7.5.1804 (Core) 
    虚拟机我给了一核一G,好像有点卡,不过不影响。

      1、配置salt官方阿里云yum仓库

    [root@salt0-master ~]# yum install -y  
    https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
    
    [root@salt0-master ~]# sed -i 
    "s/repo.saltstack.com/mirrors.aliyun.com/saltstack/g" /etc/yum.repos.d/salt-latest.repo
    [root@salt0-master ~]# yum makecache

    注:要确保主机名与文档一致  

    配置完后,安装Matser,启动服务

    [root@salt0-master ~]# yum install salt-master -y
    [root@salt0-master ~]# systemctl enable salt-master
    [root@salt0-master ~]# systemctl start salt-master

    查看端口

    [root@master yum.repos.d]# systemctl start salt-master
    [root@master yum.repos.d]# netstat -lntup
    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      938/sshd            
    tcp        0      0 0.0.0.0:4505            0.0.0.0:*               LISTEN      1679/python         
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1022/master         
    tcp        0      0 0.0.0.0:4506            0.0.0.0:*               LISTEN      1685/python         
    tcp6       0      0 :::3307                 :::*                    LISTEN      933/mysqld          
    tcp6       0      0 :::3308                 :::*                    LISTEN      934/mysqld          
    tcp6       0      0 :::3309                 :::*                    LISTEN      936/mysqld          
    tcp6       0      0 :::3310                 :::*                    LISTEN      940/mysqld          
    tcp6       0      0 :::22                   :::*                    LISTEN      938/sshd            
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1022/master         
    

      2、安装salt-minion指向salt-master 网络地址  

     新起一台机器,安装salt-minion

    [root@salt1-minion ~]# yum install salt-minion -y
    
    #配置master地址或主机名, 建议使用主机名方式
    [root@salt1-minion ~]# sed -i '/master: /cmaster: salt0-master' /etc/salt/minion
    [root@salt1-minion ~]# systemctl enable salt-minion
    [root@salt1-minion ~]# systemctl start salt-minion

      安装时出现的报错

    Error: Package: salt-2018.3.3-1.el7.noarch (salt-latest)
               Requires: systemd-python
    Error: Package: salt-master-2018.3.3-1.el7.noarch (salt-latest)
               Requires: systemd-python
    Error: Package: python-urllib3-1.10.2-1.el7.noarch (salt-latest)
               Requires: python-backports-ssl_match_hostname
    Error: Package: python-tornado-4.2.1-1.el7.x86_64 (salt-latest)
               Requires: python-backports-ssl_match_hostname
     You could try using --skip-broken to work around the problem
     You could try running: rpm -Va --nofiles --nodigest

    解决办法:

      查看本地的/ect/yum.repos.d/目录下是否有Base源,如果没有,去阿里云镜像网站,下载centos7系统的base源,安装完成即可解决。

    安装完成salt-minion 查看 进程

    [root@salt1-minion ~]# ps aux |  grep salt
    root       1733  1.2  1.5 234856 15632 ?        Ss   09:51   0:00 /usr/bin/python /usr/bin/salt-minion
    root       1736  4.1  2.6 530784 26416 ?        Sl   09:51   0:00 /usr/bin/python /usr/bin/salt-minion
    root       1764  0.0  0.0 112704   968 pts/0    R+   09:51   0:00 grep --color=auto salt

      3、salt-master主机验证

    [root@salt0-master yum.repos.d]# salt-key
    Accepted Keys:
    Denied Keys:
    Unaccepted Keys:
    salt1-minion
    Rejected Keys:

     如启动发生故障,查看saltstack相关日志:

    #服务端日志
    [root@salt0-master ~]# tail -f /var/log/salt/master
    #客户端日志
    [root@salt1-minion ~]# tail -f /var/log/salt/minion

    3、Saltstack的认证方式

    saltstack是如何进行master主机和minion连接控制的呢?首先,salt的数据传输是通过AES加密的,master和minion之间在通信之前,需要进行认证操作。

    salt通过认证的方式保证安全性,完成一次认证后,master就可以控制minion来完成各项工作了。

      1、在Minion第一次启动时,会在/etc/salt/pli/minion/下自动生成 minion.pem (也就是private key 私钥)和 minion.pub (public key 公钥)然后将 minion.pub 发送给master

    [root@salt1-minion ~]# tree /etc/salt/
    /etc/salt/
    ├── minion
    ├── minion.d
    ├── minion_id
    └── pki
        └── minion
            ├── minion.pem
            └── minion.pub

      2、在master第一次启动时,会在 /etc/salt/pki/master/ 下自动生成 master.pemmaster.pub 接收到 minion 的 public key ,会在 master 的 /ect/salt/pki/master/minions 目录下 存放以 minion id 命名的 public key 同时 minion 会保存一份 master public key 在 /etc/salt/pki/minion_master.pub

    [root@salt1-minion ~]# tree /etc/salt/
    /etc/salt/
    ├── minion
    ├── minion.d
    │   └── _schedule.conf
    ├── minion_id
    └── pki
        └── minion
            ├── minion_master.pub
            ├── minion.pem
            └── minion.pub

    salt认证原理的小结:

    minion 将 自己的公钥 发送给 master

    master 认证 之后将自己的公钥 也放置在minion 端

    4、Master端key认证示例

    [root@linux-node1 ~]# salt-key -L
    Accepted Keys:   #已经接受的key
    Denied Keys:     #拒绝的key
    Unaccepted Keys: #未加入的key
    Rejected Keys:   #吊销的key
    
    #常用参数
    -L  #查看KEY状态
    -A  #允许所有
    -D  #删除所有
    -a  #认证指定的key
    -d  #删除指定的key
    -r  #注销掉指定key(该状态为未被认证)
    
    #在master端/etc/salt/master配置
    auto_accept: True   #如果对Minion信任,可以配置master自动接受请求

    #添加指定minion的key
    [root@salt0-master ~]# salt-key  -a salt1-minion.example.com -y
    #添加所有minion的key
    [root@salt0-master ~]# salt-key  -A  -y
    
    #删除指定的key
    [root@salt0-master ~]# salt-key -d salt1-minion.example.com -y
    #删除所有的key
    [root@salt0-master ~]# salt-key -D -y

    salt-key 的使用

    [root@salt0-master ~]# salt-key -a salt1-minion  -y   //添加 salt1-minion 到accepted key
    The following keys are going to be accepted:
    Unaccepted Keys:
    salt1-minion
    Key for minion salt1-minion accepted.
    [root@salt0
    -master ~]# salt-key -L //如下表示添加成功 Accepted Keys: salt1-minion Denied Keys: Unaccepted Keys: Rejected Keys:

    查看公钥是否添加

    [root@salt0-master ~]# tree /etc/salt/
    /etc/salt/
    ├── cloud
    ├── cloud.conf.d
    ├── cloud.deploy.d
    ├── cloud.maps.d
    ├── cloud.profiles.d
    ├── cloud.providers.d
    ├── master
    ├── master.d
    ├── minion
    ├── minion.d
    ├── pki
    │   ├── master
    │   │   ├── master.pem
    │   │   ├── master.pub
    │   │   ├── minions
    │   │   │   └── salt1-minion
    │   │   ├── minions_autosign
    │   │   ├── minions_denied
    │   │   ├── minions_pre
    │   │   └── minions_rejected
    │   └── minion
    ├── proxy
    ├── proxy.d
    └── roster

    5、Saltstack远程执行初识

    判断salt的minion 主机是否存活

    [root@salt0-master ~]# salt '*' test.ping
    salt1-minion:
        True
    # salt 是一个命令
    # * 表示目标主机, 在这里代表所有目标主机
    # test.ping是salt远程执行的一个模块下面的方法。

    saltstack可以使用cmd.run 模块 远程执行 shell命令

    //让指定目标Minion节点运行uptime命令
    [root@salt0-master ~]# salt 'salt1-minion' cmd.run 'uptime'
    salt1-minion:
         11:00:15 up  1:41,  1 user,  load average: 0.00, 0.01, 0.05
    # Salt提供了大量的模块执行不同的操作, 不建议生产频繁使用cmd.run

    cmd.run 这个模块很强大,什么命令都可以执行,比如说创建一个/backup目录

    [root@salt0-master ~]# salt 'salt1-minion' cmd.run 'mkdir /backup'   //第一次创建
    salt1-minion:
        mkdir: cannot create directory '/backup': File exists   //提示目录已存在
    ERROR: Minions returned with non-zero exit code
    [root@salt0-master ~]# salt 'salt1-minion' cmd.run 'mkdir /test'  //什么都不提示,则代表创建成功
    salt1-minion:
    [root@salt0-master ~]# salt 'salt1-minion' cmd.run 'll /test'   //如果命令输入错误,提示报错
    salt1-minion:
        /bin/sh: ll: command not found
    ERROR: Minions returned with non-zero exit code
    [root@salt0-master ~]# salt 'salt1-minion' cmd.run 'ls -l  /test'  //查看成功
    salt1-minion:
        total 0

    所以,在生产中,尽量不要用cmd.run这个命令以防误删除等。

    6、Saltstack 配置管理

    salt 通过状态模块来识别配置描述文件 state 状态文件,格式是 YAML  扩展名后缀是 .sls

    1.YAML 基础语法

    YAML:
        1.缩进(层级关系)  2个空格,不能试用Tab。
        2.冒号  key: value
        3.短横线 - list1
                - list2
    
    1.缩进
      YAML使用一个固定的缩进风格表示数据层级结构关系,每个缩进由两个空格组成, 不要使用tabs。
    2.冒号
      以冒号结尾, 以冒号为路径的除外,其他所有冒号后面所有必须有空格。
    3.短横线
      表示列表项,使用一个短横杠加一个空格。
      多个项使用同样的缩进级别作为同一列表。

    2.YAML 配置,设置 base 环境

    #定义基础环境目录位置
    [root@salt0-master ~]# vim /etc/salt/master
    

    663 # Example:
    664 # file_roots:
    665 # base:      //基础环境目录
    666 # - /srv/salt/      
    667 # dev:      //开发环境目录
    668 # - /srv/salt/dev/services
    669 # - /srv/salt/dev/states
    670 # prod:        //生产环境目录
    671 # - /srv/salt/prod/services
    672 # - /srv/salt/prod/states
    673 #


    674 file_roots:    //练习的话只需配置基础环境目录
    675   base:      //空 2 格
    676     - /srv/salt    //空 4 格

    
    #修改配置必须重启服务
    [root@salt0-master ~]# systemctl restart salt-master

    3.编写 YAML 语法文件

    [root@salt0-master ~]# mkdir -p /srv/salt/app    //创建分类目录,用于生产中,区分业务
    [root@salt0-master ~]# cd /srv/salt/app
     
    #编写sls文件, apache安装并启动
    [root@salt0-master app]# cat apache.sls       //书写时,注意YAML语法格式
    apache-install: 
      pkg.installed:
        - name: httpd
    
    apache-systemctl:
      service.running:
        - name: httpd
        - enable: True

    其他的 sls 文件,练习 vsftpd

    #编写sls文件, vsftpd安装并启动
    [root@salt0-master app]# cat vsftpd.sls 
    vsftpd_install:
      pkg.installed:
        - names:
          - vsftpd
          - httpd-tools
    
    vsftpd_systemctl:
      service.running:
        - name: vsftpd
        - enable: True

    练习 nginx 安装启动

    #编写sls文件, nginx安装并启动
    [root@salt0-master app]# cat nginx.sls
    nginx-install:
      pkg.installed:
        - name: nginx
    
    nginx-systemctl:
      service.running:
        - name: nginx

    4.使用 salt 命令的 state 状态模块 让所有的 minion 都应用该配置

    [root@salt0-master app]# salt '*' state.sls app.apache
    

     注: salt 是命令, * 是指 全部主机, state.sls  是状态模块 , app.apache 是文件名字

     温馨提示:

    在操作之前可以加上 test=True ,这个是验证操作,比如说 sed 和 sed -i  的意思。不会真的执行,模拟执行一遍,会出现黄色的字体,属于正常现象。

    5.查看是否运行成功,如下则成功

    [root@salt0-master app]# salt '*' state.sls app.apache
    salt1-minion:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: The following packages were installed/updated: httpd
         Started: 13:15:37.094711
        Duration: 15305.052 ms
         Changes:   
                  ----------
                  apr:
                      ----------
                      new:
                          1.4.8-3.el7_4.1
                      old:
                  apr-util:
                      ----------
                      new:
                          1.5.2-6.el7
                      old:
                  httpd:
                      ----------
                      new:
                          2.4.6-80.el7.centos.1
                      old:
                  httpd-tools:
                      ----------
                      new:
                          2.4.6-80.el7.centos.1
                      old:
                  mailcap:
                      ----------
                      new:
                          2.1.41-2.el7
                      old:
    ----------
              ID: apache-systemctl
        Function: service.running
            Name: httpd
          Result: True
         Comment: Service httpd has been enabled, and is running
         Started: 13:15:52.420757
        Duration: 732.984 ms
         Changes:   
                  ----------
                  httpd:
                      True
    
    Summary for salt1-minion
    ------------
    Succeeded: 2 (changed=2)
    Failed:    0
    ------------
    Total states run:     2
    Total run time:  16.038 s
    oldboy.com:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: The following packages were installed/updated: httpd
         Started: 13:15:40.262922
        Duration: 19089.429 ms
         Changes:   
                  ----------
                  apr:
                      ----------
                      new:
                          1.4.8-3.el7_4.1
                      old:
                  apr-util:
                      ----------
                      new:
                          1.5.2-6.el7
                      old:
                  httpd:
                      ----------
                      new:
                          2.4.6-80.el7.centos.1
                      old:
                  httpd-tools:
                      ----------
                      new:
                          2.4.6-80.el7.centos.1
                      old:
                  mailcap:
                      ----------
                      new:
                          2.1.41-2.el7
                      old:
    ----------
              ID: apache-systemctl
        Function: service.running
            Name: httpd
          Result: True
         Comment: Service httpd has been enabled, and is running
         Started: 13:15:59.465455
        Duration: 1764.248 ms
         Changes:   
                  ----------
                  httpd:
                      True
    
    Summary for oldboy.com
    ------------
    Succeeded: 2 (changed=2)
    Failed:    0
    ------------
    Total states run:     2
    Total run time:  20.854 s

    注:其实在 master 主机上执行 salt 命令就是在 minion 上调用 服务,比如下载nginx ,我们在minion 上可以用 ps aux | grep yum  查看到  正在用 yum install nginx 下载。 

    查看 minion 主机 80端口是否开启

    [root@salt1-minion ~]# netstat -lntup
    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      911/sshd            
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      992/master          
    tcp6       0      0 :::80                   :::*                    LISTEN      3597/httpd          
    tcp6       0      0 :::22                   :::*                    LISTEN      911/sshd            
    tcp6       0      0 ::1:25                  :::*                    LISTEN      992/master          

    7、Saltstack 高级状态模块

    如果想不同的主机应用不同的配置, 则需要使用到   salt 高级状态模块

     687 #top_file_merging_strategy: merge
     688 
     689 # To specify the order in which environments are merged, set the ordering
     690 # in the env_order option. Given a conflict, the last matching value will
     691 # win.
     692 #env_order: ['base', 'dev', 'prod']
     693 
     694 # If top_file_merging_strategy is set to 'same' and an environment does not
     695 # contain a top file, the top file in the environment specified by default_top
     696 # will be used instead.
     697 #default_top: base      //默认的是base

    当使用salt命令执行高级状态, 会将topfile当做入口文件,进行调用

    编写 topfile 文件

    # topfile入口文件只能放置在base环境

    [root@salt0-master salt]# cat top.sls
    base:
      'salt1-minion':    //第一台机器执行app.nginx
        - app.nginx
      'oldboy.com':     //第二台机器执行app.nginx 和 app.apache  
        - app.nginx
        - app.apache

    执行命令将应用发送给所有主机

    [root@salt0-master salt]# salt '*' state.highstate    //高级状态调用的是 state.highstate ,字面意思就是 高级状态  

    然后我们就会看到,每台主机都是按照当时设定的安装不同的服务。

    小结:

       1.首先确定 top 文件和 top 文件里执行的那些文件 都是在base环境下的。

       2.使用state.highstate 就会第一个先找到top.sls。

    8、Saltstack 消息队列

     Saltstack 可以支撑数以千计,甚至更多的服务器,这些性能主要来自于ZeroMq ,因为saltstack的底层是基于 zeromq 进行高效的网络通信。zeromq是一个简单好用的传输层,像框架一样的一个套接字库,他使得socket 编程更加简单,简洁 和性能更高。

    发布与订阅

    zeromq 支持 publish 和 subscribe 即 发布与订阅模式,

    Salt Master运行两个网络服务
    一个是 ZeroMQ PUB 消息发布与订阅系统,默认监听 4505 端口, 主要用于 Master 对 Minion 下发指令

    #所有的Minion连接到Master的4505端口TCP状态持续保持为ESTABLISHED
    [root@linux-node1]# yum install lsof -y
    
    [root@salt0-master salt]# lsof -i :4505
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    salt-mast 1342 root   16u  IPv4  21583      0t0  TCP *:4505 (LISTEN)
    salt-mast 1342 root   18u  IPv4  25484      0t0  TCP db01:4505->db02:49986 (ESTABLISHED)
    salt-mast 1342 root   19u  IPv4  25489      0t0  TCP db01:4505->172.16.1.53:33990 (ESTABLISHED)
    注意: 可以修改/etc/salt/master配置文件的publish_port参数设置端口。

    请求与响应

    ZeroMQ支持Request-Reply请求与响应模式,简称REQ/REP

     

     Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口salt客户端与服务端通信的端口
    同时也主要用于Master接收Minion执行某个命令后的返回值

    注意: 可以修改/etc/salt/master配置文件的ret_port参数设置。
    

    显示SaltStack进程名称方式

    [root@linux-node1]# yum install -y python-setproctitle
    [root@linux-node1]# ps aux | grep salt
    /usr/bin/salt-master -d ProcessManager  #中心进程管理器
    /usr/bin/salt-master -d _clear_old_jobs  #清除旧的Jobs文件及更新fileserver
    /usr/bin/salt-master -d Publisher       #将任务PUB到Minion端
    /usr/bin/salt-master -d EventPublisher  #Event Publisher进程
    /usr/bin/salt-master -d ReqServer_ProcessManager #ReqServer进程管理器
    /usr/bin/salt-master -d MWorker  #工作进程
    /usr/bin/salt-master -d MWorker  #工作进程
    /usr/bin/salt-master -d MWorker  #工作进程
    /usr/bin/salt-master -d MWorker  #工作进程
    /usr/bin/salt-master -d MWorker  #工作进程
    /usr/bin/salt-master -d MWorkerQueue #将Ret接口(ROUTER)数据转发到Worker(DEALER)

    9、Saltstack 常用配置

    salt master 配置

    Salt Master端的配置是修改/etc/salt下master配置文件。以下是Master端常用的配置。

    interface: //指定bind 的地址(默认为0.0.0.0)
    publish_port: //指定发布端⼝(默认为4505)
    ret_port: //指定结果返回端⼝,  与minion配置⽂件中的master_port对应(默认为4506)
    user: //指定master进程的运⾏⽤户,如果调整, 则需要调整部分目录的权限(默认为root)
    timeout: //指定timeout时间,  如果minion规模庞⼤或⺴络状况不好,建议增⼤该值(默认5s)
    keep_jobs: //minion执⾏结果返回master, master会缓存到本地的cachedir目录,该参数指定缓存多⻓时间,可查看之间执行结果会占⽤磁盘空间(默认为24h)
    job_cache: //master是否缓存执⾏结果,如果规模庞⼤(超过5000台),建议使⽤其他⽅式来存储jobs,关闭本选项(默认为True)
    file_recv : //是否允许minion传送⽂件到master 上(默认是Flase)
    file_roots: //指定file server目录,  默认为:
        file_roots:    
           base:    
            - /srv/salt     
    pillar_roots : //指定pillar ⺫录,  默认为:
        pillar_roots:     
          base:     
            - /srv/pillar     
    log_level: //⽇志级别
    ⽀持的⽇志级别有'garbage', 'trace', 'debug', info', 'warning', 'error', ‘critical ’ ( 默认为’warning’)

    Salt Minion配置
    Minion端配置非常简单,一般只需要修改两个配置即可。

    [root@minion ~]# vim /etc/salt/minion
    master: 192.168.56.11 //修改master为master的IP地址
    id: //客户端的id,默认不设置会取客户端的完整主机名

    Salt Minion端常用配置

    master: //指定master 主机(默认为salt)
    master_port: //指定认证和执⾏结果发送到master的哪个端⼝,  与master配置⽂件中的ret_port对应(默认为4506)
    id: //指定本minion的标识, salt内部使⽤id作为标识(默认为主机名)
    user: //指定运⾏minion的⽤户.由于安装包,启动服务等操作需要特权⽤户, 推荐使⽤root( 默认为root)
    cache_jobs : //minion是否缓存执⾏结果(默认为False)
    backup_mode: //在⽂件操作(file.managed 或file.recurse) 时,  如果⽂件发⽣变更,指定备份目录.当前有效
    providers : //指定模块对应的providers, 如在RHEL系列中, pkg对应的providers 是yumpkg5
    renderer: //指定配置管理系统中的渲染器(默认值为:yaml_jinja )
    file_client : //指定file clinet 默认去哪⾥(remote 或local) 寻找⽂件(默认值为remote)
    loglevel: //指定⽇志级别(默认为warning)
    tcp_keepalive : //minion 是否与master 保持keepalive 检查, zeromq3(默认为True)

     

  • 相关阅读:
    高手详解:sscanf函数的高级用法
    堆排序——BuildHeap和Heapify函数的实现
    递归与动态规划求解最长公共子序列
    分享:crpcut 1.8.4 发布,C++ 的单元测试框架
    团队展示 京拍档 电商运营服务、电子商务服务外包 首家京东代运营电子商务服务平台
    Linux中link,unlink,close,fclose详解
    常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比 coder_xia的专栏 博客频道 CSDN.NET
    CAJ文件转PDF文件方法
    递归与动态规划求解最长公共子序列
    NLP Job 专注自然语言处理&机器学习等领域的求职招聘 | 关注自然语言处理|机器学习|数据挖掘|搜索引擎|计算广告|推荐算法等相关领域的工作机会
  • 原文地址:https://www.cnblogs.com/tim1blog/p/9987313.html
Copyright © 2020-2023  润新知