• saltstack平台基础


    saltstack概述
    saltstack是基于python开发的一套C/S架构配置管理工具,
    使用SSL证书签方的方式进行认证管理
    底层使用ZeroMQ消息队列pub/sub方式通信
       号称世界上最快的消息队列ZeroMQ能快速在成千上万台主机上进行各种操作
       采用RSA Key方式确认身份,传输采用AES加密,使得它的安全性得到了保证


    最主要的两个功能是: 配置管理与远程执行
    saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
    saltstack已经支持Docker相关模块
    在友好地支持各大云平台之后,配合saltstack的Mine实时发现功能可以实现各种云平台业务的自动扩展


    saltstack架构——
    saltstack基于C/S架构
    服务器端称作master,客户端称作minion,可以实现传统处理方式,即客户端发送请求给服务器,服务器收到请求后处理,再将结果返回,
    也可以使用消息队列中的发布与订阅(pub/sub)服务模式。


    saltstack工作机制——
    master和minion都以守护进程的方式运行
    mater监听配置文件里定义的ret_port(接受minion请求),和publish-port(发布消息)的端口。
    当minion运行时,它会自动链接到配置文件里定义的master地址ret_port端口进行连接认证,
    当mater和minion可以正常通信后,就可以进行各种各样的配置管理工作了。


    master与minion互信
    密钥管理:
    salt-key -h
    -L:列出密钥
    -a:接受一个密钥
    -A:接受全部密钥
    -D:删除全部密钥
    。。。。。



    saltstack环境部署
    在所有的主机上添加sale源地址,ping主机名要可以通。关闭selinux

    在master主机上安装
    [root@x ~] yum -y install salt-master(安装master)
    [root@x ~] systemctl start salt-master
    [root@x ~] systemctl enable salt-master(开机自启)

    在所有客户机上安装minion(其他客户机也做相同的操作)
    [root@xx ~] yum -y install salt-minion(安装minion)
    [root@xx ~] systemctl enable stlt-minion(开机自启)
    [root@xx ~] vim /etc/salt/miion
             ......
             master: x.sec.com(master的主机名或者域名)
             ......
             id: xx.sec.com(id指的是本台客户机的主机名或者域名)
    [root@xx ~] systemctl start salt-minion(把所有客户机的minion启动)
    [root@x~] salt-key -L(在master主机上看到下面的客户机信息说明没问题了)
               Accepted Keys:
               Denied Keys:
               Unaccepted Keys:
               x.sec.com
               xx.sec.com
               xxx.sec.com
               Rejected Keys:
    [root@x ~] salt-key -A -y(接受秘钥建立互信)


    salt命令基础:
    salt [options] '<target>' <function> [arguments]
    options是指目标主机
    target指的是在哪些minion上执行,如果在全部minion上运行,采用通配符*
    function一般采用python的 模块.方法 样式
    arguments是传递给方法的参数

    示例:测试所有主机连通性,在主机上执行任意命令
    [root@x ~]# salt '*' test.ping(在所有主机上执行ping)
    xxx.sec.com:
        True
    xxxx.sec.com:
        True
    xx.sec.com:
        True
    [root@x ~]# salt '*' cmd.run 'uname -r'(cmd.run 使用任意指令在所有主机上执行uname -r)
    xx.sec.com:
        3.10.0-693.el7.x86_64
    xxx.sec.com:
        3.10.0-693.el7.x86_64
    xxxx.sec.com:
        3.10.0-693.el7.x86_64

    匹配方式:
      -L:使用列表来匹配
      -E:使用正则来匹配
      -N:使用组来匹配
      -S:使用ip地址来匹配
    [root@x ~] salt -L xx.sec.com test.ping(使用列表匹配)
    [root@x ~] salt -E "sec.comd" test.ping(使用正则匹配)

    使用分组:
    通过配置列表主机名分
    [root@x ~] vim /etc/aslt/master
                 nodegroups:
                    nginx: 'L@xx.sec.com,xxx.sec.com,xxxx.sec.com'(定义名为nginx的组,L@主机名 L为列表匹配,主机间用“,”逗号隔开)
    [root@x ~] salt -N nginx test.ping

    通过ip掩码分:
    [root@x ~] salt -S "172.16.232.10" test.piung
    [root@x ~] salt -S "172.16.232.0.24" test.ping



    salt '主机名' sys,list_modules(列出模块,功能和使用方法)
    salt '主机名' sys.doc cmd.run(查看模块帮助)

    传输文件——master主机传输文件要先创建一个文件夹,master默认的根目录/svr/salt
    [root@x ~] mkdir -p /srv/salt/file(创建要分发到节点的文件 testfile)
    [root@x file~] salt -N nginx cp.get_file salt://srv/salt/file/xxx /tmp/xxx(执行分发指令,把xxx这个文件放到这个组的tmp下)

    拷贝任意文件和目录——file.copy(相当于scp,这里有个坑,文件和文件夹要区分好 ,文件不可以在尾部加/,不然会报错)
    [root@x file~] salt -L 'x,xx,xxx'file.cpoy /etc/passwd /var/tpm/passwd(指定主机拷贝文件)
    [root@x file~] salt -L 'x,xx,xxx'file.cpoy /etc/selinux /var/tpm/(指定主机拷贝文件夹)

    创建用户
    [root@x ~] salt '主机名' -N nginx user.add xxx 2000


    模块及功能——
      列出所有可用模块
      [root@x ~]# salt 'xx.sec.com' sys.list_modules(列出所有的模块)
        xx.sec.com:
        - acl
        - aliases
        .........
     
      查看模块的所有功能
      [root@x ~]# salt 'xx.sec.com' sys.list_functions test(查看tes模块的所有功能)
        xx.sec.com:
        - cp.get_file

      查看模块用法(有点像man帮助)
      [root@x ~]# salt 'xx.sec.com' sys.doc test(查看test模块的用法)
      test.arg:
      Print out the data passed into the function ``*args``and `....




    YAML————
      YAML:YAML Ain't Markup Language
      YMAL的结构通过空格来展示
      项目使用 —— 来表示
      键值对使用:来表示
      master和minion的配置文件均采用YMAL语法

    YMAL规则一:
      YMAL使用一个固定的缩进风格来表示数据层级结构关系,一般每个缩进级别由两个空格组成,切记不能使用tab,缩进是初学者容易出错的地方之一。

    YMAL规则二:
      YMAL的键值对采用冒号分隔,冒号后面必须有空格
      YMAL键值对对应python的字典
      YMAL表示形式:
        name: xx.sec.com
      或
        name:
          xx.sec.com
      python字典:
        {'name': 'xxsec.com'}
      python字典可以嵌套:
        hosts:
          name: xx.sec.com
      字典表示形式为:
        {
          'hosts': {
          'name': xx.sec.com
         }
        }

    YMAL规则三:
      列表项使用一个短横杠加一个空格
        - xx.sec.com
        - xxx.sec.com
        - xxxx.sec.com
      列表可以作为一个键值对的value
        pkg-http:
         - http
         - php
      python语法:
        {'pkg-http': ['http', 'php']}
        

    Grains组件——
      Grains是saltstack最重要的组件之一,存储minion端的基本信息,这些信息一般都是静态的,如CPU,内核,操作系统等,
      Grains存储在minion本地,管理员可以在minion端进行Grains值的修改,如增加,删除等。

    Grains基础应用
      获取minion端所有的Grains信息
      [root@x ~]# salt 'xx.sec.com' grains.items
        xx.sec.com:
        ----------
        SSDs:
        biosreleasedate:
            05/19/2017
        biosversion:

      通过grains.item获取minion端的fqdn信息
      [root@x ~]# salt 'xx.sec.com' grains.item fqdn
        xx.sec.com:
        ----------
        fqdn:
            xx

      匹配minion端OS(操作系统)为centos的执行uptime命令
      [root@x ~]# salt -G 'os:centos' cmd.run 'uptime'
        xxx.sec.com:
         19:02:11 up 10:03,  1 user,  load average: 0.00, 0.01, 0.05
        xx.sec.com:
         19:02:11 up 10:03,  1 user,  load average: 0.00, 0.01, 0.05
        xxxx.sec.com:
         19:02:12 up 10:03,  1 user,  load average: 0.00, 0.01, 0.05


    通过minion定义grains
      定义角色:
        [root@xx ~]# vim /etc/salt/minion
        grains:
          server:(定义属性)
            - webserver(定义为web服务器)
            - dbserver(再定义为数据库服务器)
        [root@xx ~]# systemctl restart salt-minion.service(重启服务)
       
        [root@xxx ~]# vim /etc/salt/minion
        grains:
          server:(定义属性)
            - webserver(定义为web服务器)
        [root@xx ~]# systemctl restart salt-minion.service(重启服务)

      查看角色信息:
        [root@x ~]# salt 'xx.sec.com' grains.item webanddb(查看属性为server的主机)
        xx.sec.com:
        ----------
        webanddb:
            - webserver
            - dbserver
        [root@x ~]# salt -G 'server:webserver' grains.item test.ping(查看属性为server且定义为webserver的主机)
        xx.sec.com:
        ----------
        test.ping:
        xxx.sec.com:
        ----------
        test.ping:



    Pillar组件——
      Pillar也是saltstack最重要的组件之一,作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用
      存储在master端,存放需要提供给minion的信息,常用于敏感信息,每个minion只能访问master分配给自己的Pillar信息,
      用于经常动态变化的信息。

    配置Pillar
      Pillar需要一个pillar_roots来维护Pillar的配置,默认pillar_roots为/srv/pillar
      Pillar_roots在master配置文件中定义

    试例:
      [root@x ~]# vim /etc/salt/master
      pillar_roots:
      base:(环境名)
        - /srv/pillar
      [root@x ~]# mkdir /srv/pillar
      [root@x ~]# systemctl restart salt-master.service
      [root@x pillar]# salt '*' pillar.items(查看pillar数据是空的)
      xxx.sec.com:
        ----------
      xxxx.sec.com:
        ----------
      xx.sec.com:
        ----------

    pillar数据文件
      pillar执行时需要一个名为top.sls的入口文件,通过top.sls文件作为入口,组织其他的pillar文件
      sls文件采用YAML格式
     
      试例:
      [root@x ~]# cd /srv/pillar/
      [root@x pillar]# vim top.sls
      base: (与pillar_roots定义的环境名一致)
       'xx.sec.com':(过滤目标)
        - data(用于包含data.sls)

      [root@x pillar]# vim data.sls
      appname: website(定义一个website)
      flow:
       maxconn: 3000(定义最大并发3000)
       maxmem: 6G(定义最大6G内存)

    同步pillar数据——
      将Pillar数据同步至minion——
        [root@x pillar]#  salt '*' saltutil.refresh_pillar
        xxxx.sec.com:
          True
        xx.sec.com:
          True
        xxx.sec.com:
          True

      获取Pillar全部数据——
        [root@x pillar]# salt '*' pillar.items
        xxxx.sec.com:
        ----------
        xxx.sec.com:
        ----------
        xx.sec.com:
        ----------
        appname:
            website
        flow:
            ----------
            maxconn:
                3000
            maxmem:
                6G

      获取指定数据——
        [root@x pillar]# salt '*' pillar.item appname
        xx.sec.com:
        ----------
        appname:
            website

      根据Pillar值匹配minion——
        [root@x pillar]# salt -I 'appname:website' test.ping
        xx.sec.com:
            True

      复杂Pillar数据
        更为复杂的Pillar数据可以放到目录的sls文件中
        [root@x pillar]# vim top.sls
        base:
         'xx.sec.com':
           - data
         'xxx.sec.com'
           - users
        [root@x pillar]# mkdir users(它会去找一个users的文件夹,如存在,则会找名为init.sls的文件,如没有init.sls的文件,则会找users的文件)
        [root@x users]# vim init.sls
        users:
         xx: 2000(添加xx uid为2000)
         xxx: 20001
         xxxx: 20002
        [root@x pillar]#  salt '*' saltutil.refresh_pillar(同步数据)





    Jinjia基础——
      Jinjia是基于python的模板引擎,在saltstack中我们使用yaml_jinja渲染器来根据模板生产对应的配置文件
      对于不同的操作系统或者不同的情况,通过jinjia可以让配置文件或者操作形成一种模板的编写方式。


    jinjia使用步骤——
      在state文件中使用"- template: jinjia"声明
      在模板文件中使用变量"{{ name }}"申明,name为变量,自己定义
      在state文件中使用"- defautls: name: value"声明


    使用变量
      变量的基本格式为:{{变量}}
      一级字典变量格式为:{{ pill['appname'] }}
      二级字典变量格式为:{{ pillar['flow']['maxconn'] }}


    判断语句:对grains的os值进行判断,根据不同的系统对Apache的值进行不同的设定,这样Apache就相当于是可以随机应变的值
      {% if grains['os'] =='CentOS' %}
      apache: httpd
      {% elif grains['os'] =='Debian' %}
      apache: apache2
      {% endif %}

    循环语句:在state中使用pillar数据,值通过jinjia来访问Pillar即可,多个值通过循环逐个获取
      {% fof user, uid in pillar.get('users',{}).items() %}
      {{users}}:
        user.present;
         - uid: {{uid}}
      {% endfor %}

  • 相关阅读:
    MongoDB Master-Slave cluster with authentication setup
    Linux Shell Scripting Cookbook 读书笔记 5
    Linux Shell Scripting Cookbook 读书笔记 4
    Linux Shell Scripting Cookbook 读书笔记 3
    Linux Shell Scripting Cookbook 读书笔记 2
    Citrix架构
    Jenkins Kubernetes Slave 调度效率优化小记
    <漫谈ElasticSearch>关于ES性能调优几件必须知道的事
    【反思】一个价值两天的BUG,无论工作还是学习C语言的朋友都看看吧!
    <再看TCP/IP第一卷>TCP/IP协议族中的最压轴戏----TCP协议及细节
  • 原文地址:https://www.cnblogs.com/Hydraxx/p/9037934.html
Copyright © 2020-2023  润新知