• 【搭建Saltstack运维工具】


    @


    所谓Salt

    Saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统.

    Salt有多强大!

        系统管理元日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等,如果主机数量庞大, 单靠人工维护是在让人难以忍受.

    搞图01
        早期的运维人员会根据生产环境编写特定的脚本来完成大量的重复性工作,这些脚本复杂且难以维护,系统管理员面临的问题主要是系统配置管理、远程执行命令。因此而诞生了很多开源软件,系统维护方面的有fabricpuppetchefansibleSaltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行.

        Salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署,Salt的设计构造适用于任意数量的服务器,从少量本地网络系统到跨越整个数据中心,扩扑架构都是C/S模型,配置简单.


        不管是几台、几百台、几千台服务器,都可以使用Salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令.


        Salt是使用Python语言编写的,支持用户通过Python自定义功能模块,也提供了大量的Python API接口,用户可以根据需要进行简单快速的扩展.



    Saltstack运行方式

    • Local本地运行,交付管理
    • Master/Minion 常用管理
    • Salt SSH 不需要客户端

    Saltstack部署基本架构

    在开始搭建之前,先理解Salt结构中各个角色:
    主要区分salt-mastersalt-minion,前者是中心控制系统,后者是被管理的客户端.
    在这里插入图片描述
    在远程执行系统中,Salt用Python通过函数调用完成任务.


    开始搭建

    搭建环境

    • 192.168.43.43 master
    • 192.168.43.100 slave01
    • 192.168.43.200 slave02

    安装Saltstack

    Salt软件包需要epel源的支持,那么下载:
    (EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。)

    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all #清空缓存
    yum makecache #生成yum缓存
    

    搞定后,开始在对应的服务器上安装对象的包:

    yum -y install salt-master  # 中心控制系统
    yum -y install salt-minion  # 被管理的客户端
    

    Salt端口

    安装好Salt后开始配置,其中salt-master默认监听两个端口:

    • publish_port 4505 提供远程命令发送功能
    • ret_port 4506 提供认证,文件服务,结果收集等功能

    Salt配置文件

    配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面.
    salt-master的配置文件为/etc/salt/master.
    salt-minion的配置文件为/etc/salt/minion.


    salt-master

    # ⚠️冒号":"后面必须留一个空格
    
    # 绑定到本地的0.0.0.0地址
    interface: 0.0.0.0
    
    # 运行salt程序的用户,影响到salt的执行权限
    user: root
    
    # salt的运行线程,开的线程越多一般处理的速度越快,但一般不要超过CPU的个数
    worker_threads: 10
    
    # master的管理端口
    publish_port: 4505
    
    # master跟minion的通讯端口,用于文件服务,认证,接收返回结果等
    ret_port: 4506
    
    # 如果这个master运行的salt-syndic连接到了一个更层级别的master
    # 那么这个参数需要配置成连接到这个高层级别的master的监听端口
    syndic_master_port: 4506
    
    # 指定pid文件位置
    pidfile: /var/run/salt/master.pid
    

    salt-minion

    # minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
    id: slave01
    # 这里展示的slave01主机的配置文件,slave02主机的id为slave02
    
    # salt运行的用户权限
    user: root
    
    # master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
    master : master
     
    # master通信端口
    master_port: 4506
     
    # 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
    backup_mode: minion
     
    # 执行salt-call时候的输出方式
    output: nested
     
    # minion等待master接受认证的时间
    acceptance_wait_time: 10
     
    # 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
    acceptance_wait_time_max: 0
     
    # 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴
    random_reauth_delay: 60
     
    # 日志文件位置
    log_file: /var/logs/salt/minion.log
    

    配置文件写好之后,还需要指明主机名与其ip的对应关系,可通过在/etc/hosts文件添加主机信息:

    192.168.1.100 slave01
    192.168.1.200 slave02
    # 这里展示的master的hosts文件,slave服务器的hosts文件请添加上对应的主机与IP
    

    修改后,在对应的服务器上启动对应的服务:

    systemctl start salt-master
    systemctl start salt-minion
    

    配置接受密钥

    salt-key的参数

    在接受密钥之前,我们先来看看它有那些参数:

    • -L 查看KEY状态
    • -A 认证所有密钥
    • -D删除所有密钥
    • -a认证指定的key
    • -d删除指定的key
    • -r注销掉指定的key(该状态为未被认证)

    开始接受密钥


    启动minion后,minion会自动去寻找连接master,并请求master为其签发证书.
    待证书签发完成后,master便会信任minion,此时便可通信,它们之间的通信是加密的.



    salt-key命令用于管理minion密钥,在master执行:
    在这里插入图片描述


    在master上查看minion的密钥信息:

    # '*'代表所有salve主机
    [root@fedora ~]# salt-key -f '*'
    
    # 还可以指定某一个主机
    [root@fedora ~]# salt-key -f slave01</font>
    

    在minion上查看master的密钥信息:

    [root@slave01 ~]# salt-call --local key.finger
    

    确认密钥匹配后,在master上接受密钥:

    # -A:将允许所有的salve
    [root@fedora ~]# salt-key -A -y
    
    # -a:将允许指定的salve
    [root@fedora ~]# salt-key -a slave01
    

    在这里插入图片描述
    此时已经成功接受了密钥.
    在这里插入图片描述


    我们再来看看密钥信息:
    在这里插入图片描述


    salt命令

    日常命令参数

    首先要知道master和minion都安装了那些文件,然后才知道怎么操作.



    master端

    [root@fedora ~]# rpm -ql salt-master
    /etc/salt/master  # salt master主配置文件
    /usr/bin/salt  # salt master核心操作命令
    /usr/bin/salt-cp  # salt文件传输命令
    /usr/bin/salt-key  # salt证书管理
    /usr/bin/salt-master  # salt master服务命令
    /usr/bin/salt-run  # salt master runner命令
    

    slave端

    [root@slave01 ~]# rpm -ql salt-minion 
    /etc/salt/minion  # minion配置文件
    /usr/bin/salt-call  # 拉取命令
    /usr/bin/salt-minion  # minion服务命令
    /usr/lib/systemd/system/salt-minion.service  # minion启动脚本
    

    开始你的salt命令


    test.ping

    # 检测目标主机是否存活
    [root@fedora ~]# salt '*' test.ping
    slave01:
        True
    slave02:
        True
    # '*'表示所有主机,将返回所有主机是否存活,也可以指定某一个主机.
    # test.ping是salt远程执行的一个模块下面的方法.
    

    test.ping是条很简单的探测minion主机收否存活的命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活.


    test.echo

    [root@fedora ~]# salt slave01 test.echo 'is ok'
    slave01:
        is ok
    

    test.fib

    [root@fedora ~]# salt slave02 test.fib 8
    slave02:
        |_
          - 0
          - 1
          - 1
          - 2
          - 3
          - 5
        - 2.86102294922e-06
    

    test.fib可生成斐波那契数列.
    斐波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和.


    test模块实际上还有许多其它的函数,可通过salt '*' sys.list_functions test查看.

    salt命令组成结构

    • 在命令行输入的命令都是 执行模块.
    • 等到命令写入到文件中 就叫做状态模块.

    完整的五部分命令:

    # --summary参数显示salt命令的概要
    [root@fedora ~]# salt --summary '*' cmd.run > 'hostname'
    slave02:
        slave02
    slave01:
        slave01
    
    
    -------------------------------------------
    Summary
    -------------------------------------------
    # of Minions Targeted: 2
    # of Minions Returned: 2
    # of Minions Did Not Return: 0
    -------------------------------------------
    

    sys模块用于与系统交互,下面的命令将列出所有salt的sys模块:

    [root@fedora ~]# salt '*' sys.list_modules
    

    远程执行命令模块


    cmd
    一个超级模块,所有shell命令都能执行:

    [root@fedora ~]# salt 'slave01' cmd.run hostname
    slave01:
        slave01
        
    # 还可以使用cmd.run_all返回更详细的信息:
    [root@fedora ~]# salt 'slave01' cmd.run_all hostname
    

    pkg
    用于安装软件,其底层调用的是yum工具:

    # 在slave01上安装nginx
    [root@fedora ~]# salt 'slave01' pkg.install "nginx"
    # 卸载slave01上的nginx
    [root@fedora ~]# salt 'slave01' pkg.remove "nginx"
    # 检查pkg包的版本
    [root@fedora ~]# salt 'slave01' pkg.version "nginx"
    

    server
    用于管理服务:

    [root@fedora ~]$salt 'slave' service.start "nginx"
    slave:
        True
    [root@fedora ~]$salt 'slave' service.status "nginx"
    slave:
        True
    [root@fedora ~]$salt 'slave' service.stop "nginx"
    slave:
        True
    

    关于 --out=json 与--out=yaml


    --out=json

    # 返回的数据是Json类型,如下
    [root@fedora ~]# salt --out=json 'slave01' cmd.run 'hostname'
    {
        "slave01": "slave01"
    }
    

    --out=json

    [root@fedora ~]# salt --out=yaml 'slave01' cmd.run 'hostname'
    slave01: slave01
    


    YAML详解

    在学习Saltstack过程中,第一要点就是States编写技巧,简称SLS文件,这个文件遵循YAML语法.

    json、xml、yaml都是数据序列化格式,yaml容易被解析,应用于配置文件.

    Salt的配置文件就是yaml格式,不能使用tab键.

    还有saltstackk8sansible都用的yaml格式配置文件.

    YAML语法规则

    • 大小写敏感
    • 使用缩进表示层级关系,缩进不可用tab键
    • 缩进的空格数不重要,相同层级的元素左侧对其即可
    • "#"号表示注释行

    YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单:
    结构体通过空格展示
    项目使用 - 代表
    键值对通过 : 分割
    YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,不可使用tab键.

    YAML与JSON格式对比


    YAML

    first_key:
    	second_key:second_value
    

    JSON

    {
    	'first_key':{
    		'second_key':'second_value',
    	}
    }
    

    短横杠


    YAML语法表示列表,使用一个横杠加一个空格,多个项使用同样的缩进级别作为同一个列表的部分,如下图:
    在这里插入图片描述

    列表可以作为一个键值对的value,例如一次性要安装多个软件:

    在这里插入图片描述


    目标定位字符串

    之前的salt命令我们都是使用salt '*'控制所有minion,并且我们只有两台minion,但是生产环境的服务器很可能是成千上百的minion,因此需要灵活地定位所需的服务器并且执行远程命令.
    在这里插入图片描述

    全局匹配

    [root@fedora ~]# salt '*' test.ping
    slave01:
        True
    slave02:
        True
    

    Linux通配符

    • * 代表任意字符,或空字符串
    • ? 代表任意一个字符,不可以为空
    • [a-z] 任何一个小写字母
    • [0-9] 任何一个数字

    示例:

    [root@fedora ~]# salt 'slave0[1-2]' test.ping
    [root@fedora ~]# salt 'slave0?' test.ping
    # 以上两条都可以匹配到slave01和slave02主机
    

    state模块定义主机状态

    之前执行的远程命令,都是一个过程式的,类似一段shell或者python脚本执行,执行一次触发一次相同的功能.

    那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态.

    下面我们将通过state模块来部署nginx


    打开master的配置文件/etc/salt/master,加入如下配置:

    # 必须严格遵循语法,空格,不可用tab键
    file_roots:
      base:
        - /srv/salt/base
      dev:
        - /srv/salt/dev
      test:
        - /srv/salt/test
      prod:
        - /srv/salt/prod
    # 修改master配置文件后重启服务
    

    创建文件夹(此步骤master与minion都要执行):

    # 在master和minion上都要创建:
    mkdir -p /srv/salt/{base,dev,test,prod}
    

    /srv/salt/base下创建nginx.sls文件,其文件内容如下(此步骤master与minion都要执行):

    nginx-install:
      pkg.installed:
        - name: nginx
    
    nginx-service:
      service.running:
        - name: nginx
        - enable: True
    

    此时用state模块部署nginx软件,通过我们编写的nginx.sls描述性配置文件,命令行调用state模块的sls函数:

    # 启动命令,执行后nginx将被安装且激活,可进行状态管理
    [root@fedora ~]# salt 'slave01' state.sls nginx
    

    解释下nginx.sls描述文件:
    sls配置文件都遵循YAML语言描述
    第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做.
    状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性.


    Salt采集静态信息之GrainsSalt

  • 相关阅读:
    springmvc学习笔记--json--返回json的日期格式问题
    springmvc学习笔记--mybatis--使用插件自动生成实体和mapper
    velocity的一些用法
    String.split()用法以及特殊分隔符注意,ps:|
    Mybatis在idea中错误:Invalid bound statement (not found)
    maven中使用junit老是找不到包
    java字符编码和oracle乱码
    ehcache报错
    java继承覆盖与向上转型,权限
    java变量的加载顺序
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176561.html
Copyright © 2020-2023  润新知