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 %}

原文地址:https://www.cnblogs.com/Hydraxx/p/9037934.html