zoukankan      html  css  js  c++  java
  • saltstack运维工具

    salt介绍

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

    salt强大吗

    系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等

    等。如果主机数量庞大,单靠人工维护实在让人难以忍受。

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

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

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

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

    saltstack的运行方式

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

    salt部署基本架构

    在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。

    salt架构中的一种就是master > minion。

    在远程执行系统中,salt用python通过函数调用完成任务。

    运行salt依赖包

    python
    zeromq
    pyzmp
    pycrypto
    msgpack-python
    yaml
    jinja2

    服务器环境准备

    关闭服务器安全策略

    关闭firewalld
    systemctl disable firewalld
    systemctl stop firewalld
    
    关闭iptables
    iptables -F
    
    关闭selinux

    安装saltstack

    1、环境准备

    准备3台机器,配置好ip地址,互相可以通信,即可
    互ping一下看看通没通  ping192.168.61.138
    一个master
    
    一个minion
    
    一个minion

    2、配置hosts解析文件

    配置hosts解析文件,强制进行主机名解析,加速salt的minion查找,分别在三台机器上,写入解析
    
    vim /etc/hosts   
    
    192.168.16.142  s20
    
    192.168.16.7 docker01
    
    192.168.16.47  bogon

    3、下载saltstack软件包

    配置阿里云的源,下载saltstack软件包,  注意区分 服务端和客户端
        1.在master上安装
            yum install salt-master -y
    
        2.在minion1上安装
            yum install salt-minion -y
            
        3.在minion2上安装
            yum install salt-minion -y

    4、配置文件

    【salt-master配置文件】

    配置文件在/etc/salt/master

    vim master  # 打开配置文件,填入如下内容

    interface: 0.0.0.0      #绑定到本地的0.0.0.0地址
    publish_port: 4505 #管理端口,命令发送
    user: root      #运行salt进程的用户
    worker_threads: 5  #salt运行线程数,线程越多处理速度越快,不要超过cpu个数
    ret_port: 4506     #执行结果返回端口
    pidfile: /var/run/salt-master.pid  #pid文件位置
    log_file: /var/log/salt/master  #日志文件地址
    
    #自动接收minion的key
    auto_accept: False

    【salt-minion1配置文件】

    vim /etc/salt/minion  # 打开配置文件,填入如下内容

    master: s20     #指定mastet的通信地址  
    master_port: 4506
    user: root
    id:  s20minion1      #id用于指定minion的身份信息 ,待会可以在master上查看到的
    acceptance_wait_time: 10
    log_file: /var/log/salt/minion

    【salt-minion2配置文件】

    vim /etc/salt/minion  # 打开配置文件,填入如下内容

    master: s20
    master_port: 4506
    user: root
    id:  s20minion2        
    acceptance_wait_time: 10
    log_file: /var/log/salt/minion

    5、重启master和minion,检查密钥是否匹配

    重启

    salt通信是在minion初次启动时候,建立新的连接的

    systemctl restart salt-master
    systemctl restart salt-minion

    检查master和minion的秘钥匹配

    【在master上执行】

    【在minion上获取minion的秘钥】

    确认密钥匹配进行下一步

    6、查看minion的密钥信息

    在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。

    在salt-master执行

    salt-key命令用于管理mionion秘钥

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

    7、验证salt minion信息是否存活

    salt  "*" test.ping

    转化为json信息

    将输出的结果,转化为json信息,可以序列化后,丢给前端渲染

    salt  "*" test.ping --out=json

    salt的命令学习

    上面我们已经配置完master和minion的通信,接下来我们就可以通过salt命令来批量管理minion机器了

    【验证salt minion信息是否存活】
        salt  "*" test.ping
    【转化为json信息】
        salt  "*" test.ping --out=json
    【让机器远程返回主机名给我】
        salt --summary '*' cmd.run 'hostname'
    【远程安装软件】
        salt "*"  cmd.run "yum install nginx -y"
    【salt安装软件的接口】
        远程安装nginx:salt '*' pkg.install  'nginx'
        远程卸载nginx:salt '*' pkg.remove "nginx"
        检查pkg包的版本:salt '*' pkg.version "nginx"
    【远程管理服务模块】
        # 管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
        salt '*' service.start "nginx"    
        salt '*' service.stop "nginx"
        salt '*' service.restart "nginx"

    查看master和minion都安装了哪些软件

    【master端】

    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命令

    【minion端】

    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启动脚本

    【test模块】

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

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

    test模块实际上还有许多其他的函数

    [root@master 192.168.199.155 ~]$salt '*' sys.list_functions test
    slave:
        - test.arg
        - test.arg_repr
        - test.arg_type
        - test.assertion
        - test.attr_call
        - test.collatz
        - test.conf_test
        - test.cross_test
        - test.echo
        - test.exception
        - test.fib
        - test.get_opts
        - test.kwarg
        - test.module_report
        - test.not_loaded
        - test.opts_pkg
        - test.outputter
        - test.ping
        - test.provider
        - test.providers
        - test.rand_sleep
        - test.rand_str
        - test.retcode
        - test.sleep
        - test.stack
        - test.try_
        - test.tty
        - test.version
        - test.versions_information
        - test.versions_report
    
    test其他函数
    View Code

    测试下test.echo

    [root@master 192.168.199.155 ~]$salt '*' test.echo 'henry nb666'
    slave:
        henry nb666

    test.fib生成斐波那契数列

    菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和。

    [root@master 192.168.199.155 ~]$salt '*' test.fib 50
    slave:
        |_
          - 0
          - 1
          - 1
          - 2
          - 3
          - 5
          - 8
          - 13
          - 21
          - 34
        - 1.09672546387e-05

    salt命令的两种输出格式

    【 json】

    salt  "*" test.ping --out=json

     【yaml】

    salt  "*" test.ping --out=yaml

    【yaml语法学习】

    在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循YAML语法。初学者看这玩意很容易懵逼,来,超哥拯救你学习YAML语法
    json xml yaml 数据序列化格式
    yaml容易被解析,应用于配置文件
    
    salt的配置文件是yaml配置文件,不能用tab
    saltstack,k8s,ansible都用的yaml格式配置文件
    
    
    语法规则
        大小写敏感
        使用缩进表示层级关系   
        缩进时禁止tab键,只能空格
        缩进的空格数不重要,相同层级的元素左侧对其即可
        # 表示注释行
    yaml支持的数据结构
        对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict    冒号表示 key: value   key冒号后必须有
        数组: 一组按次序排列的值,又称为序列sequence 列表list     短横线  - list1
        纯量: 单个不可再分的值
    
    对象:键值对
    yaml
        first_key:
          second_key:second_value
    
    python
        {
            'first_key':{
                'second_key':'second_value',
            }
        }
    YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单,
    结构体通过空格展示
    项目使用 '-' 代表
    键值对通过 ':' 分割
    
    YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,禁止用tabs!!!
    Python中的字典是简单的键值对,go语言中称作哈希表map
    字典的key通过冒号分割
    
    key在YAML中表现形式是一个冒号结果的字符串
    my_key: my_value
    转化到python语法中,上述命令为
    {'my_key':'my_value'}
    
    value还可以通过缩进和key关联,四个空格!!
    my_key:
        my_value 
    转化为python语法同样的
    {'my_key':'my_value'}
    
    YAML语法中字典是可以嵌套的
    one_dict_key:
        two_dict_key:value_dict
    转化为python语法
    {
      'one_dict_key':{
        'two_dict_key':'value_dict'
      }
    }
    短横杠
    YAML语法表示列表,使用一个横杠加一个空格
    多个项使用同样的缩进级别作为同一个列表的部分
    - list_value_one
    - list_value_two
    - list_value_three
    列表可以作为一个键值对的value,例如一次性要安装多个软件
    my_dict:
      - l1
      - l2
      - l3
    转化为python代码理解就是
    {
      'my_dict':['l1','l2',;l3]
    }
  • 相关阅读:
    前端基础进阶(十一):详细图解jQuery对象,以及如何扩展jQuery插件
    前端基础进阶(十):面向对象实战之封装拖拽对象
    前端基础进阶(九):详解面向对象、构造函数、原型与原型链
    前端基础进阶(八):深入详解函数的柯里化
    前端基础进阶(七):函数与函数式编程
    前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
    前端基础进阶(五):全方位解读this
    lvs健康检查脚本第三版
    rsync同步常用命令
    nginx启动脚本
  • 原文地址:https://www.cnblogs.com/songzhixue/p/11153013.html
Copyright © 2011-2022 走看看