grains与pillar

grains是记录minion的一些静态信息的组件,是minion第一次启动的时候采集的静态数据

pillar是数据管理中心,主要是存储和定义配置管理中的一些数据(比较灵活)。

定义的属性值是经常变化的,那请采用pillar,如果是很固定、不易变的那请用grains。

1、grains存储的是静态、不常变化的内容,pillar则相反

2、grains是存储在minion本地,而pillar存储在master本地

3、minion有权限操作自己的grains值,但minion只能查看自己的pillar值,无权修改。

4、pillar中定义的数据与不同业务特性的被控主机相关联,这样不同被控主机只能看到自己匹配的数据,安全性较高,使用与一些比较敏感的数据

++++++++++++++++++++++++++++++++++++++++++++++++++++++

grains

①、被控端定义的grains可以放在/etc/salt/grains中,重启minion即生效

  或者修改/etc/salt/minion文件,打开参数default_include:minion.d/*.conf

  定义的内容放在*.conf

②、主动端定义grains

  根据/etc/salt/master配置file_roots项,base(/data/salt)的配置下生成_grains

  eg:

salt '*' grains.items

salt '*' grains.item fqdn

salt '*' grains.get fqdn

    salt '*' sys.doc pillar            # 查看与pillar有关的帮助信息
    salt '*' pillar.items              # 获取所有pillar items值
    salt '*' pillar.data               # 等价于pillar.items
    salt '*' saltutil.refresh_pillar   # 刷新pillar值
    salt '*' saltutil.sync_all         # 刷新pillar值,与refresh_pillar操作类似,但范围更大
    salt '*' sys.list_functions pillar # 列出所有的pillar相关函数方法
    salt '*' pillar.get xxx            # 获取某项的值,类似于python字典的get函数
    salt '*' pillar.raw                 # 内存中获取
    salt '*' state.highstate pillar={'test': 'abc'}  # 在命令设置pillar 数据



vim openfile.py

import os 

import commands

import sys

          

def Grains_openfile():                      

    grains = {}

    _open_file=65535                                  

    try:  

        getulimit = commands.getstatusoutput('source /etc/ptofile;ulimit -n')

    except Exception,e:                     

        pass          

    if getulimit[0] == 0:                   

        _open_file = int(getulimit[1])      

    grains['max_open_file_liu'] = _open_file                              

    return grains

salt 'ios_001' saltutil.sync_all   //同步到被控制端

salt 'ios_001' sys.reload_modules   //使之生效


----------------------------------------------------

pillar

eg:

cat /data/pillar/top.sls

base:

  'ios_001':

    - data

cat /data/pillar/data.sls

appname: website

flow:

  macxonn:2222

  maxmem:333333


salt '*' pillar.data para1 para2   //查看对应参数的值

salt '*' saltutil.refresh_pillar  //使之生效



在top.sls中引用二级配置有两种方式:

  ①、直接引用如上例子

  ②、创建data目录,在引用init.sls文件

为了规范,建议采用第二种

/data/pill/data/init.sls

====================================================

state 

state的入口文件与pillar一样,文件名都是top.sls,但是state的sls文件必须是存放在saltstack base定义的目录下 eg: /data/salt/top.sls。

state描述配置.sls支持jinjia模板、grains及pillar引用等。

通过salt ‘*’ state.hightstate [test=True] 执行生效

salt  ‘*’  state.sls nginx [test=True]  单独执行某一个

http://blog.itpub.net/30129545/viewspace-1458706/

http://blog.csdn.net/wjacketcn/article/details/50853604

EG:

base:
  '*':               #通过正则去匹配所有minion
    - nginx          #这里都是我自己写的state.sls模块名 这里可以无视 后面会提到

  my_app:             #通过分组名去进行匹配 必须要定义match:nodegroup
    - match: nodegroup
    - nginx

  'os:Redhat':        #通过grains模块去匹配,必须要定义match:grain
    - match: grain
    - nginx
nginx:
  pkg:               #定义使用(pkg state module)
    - installed      #安装nginx(yum安装)
  service.running:   #保持服务是启动状态
    - enable: True
    - reload: True
    - require:
      - file: /etc/init.d/nginx
    - watch:                 #检测下面两个配置文件,有变动,立马执行上述/etc/init.d/nginx 命令reload操作
      - file: /etc/nginx/nginx.conf
      - file: /etc/nginx/fastcgi.conf
      - pkg: nginx


match: 配模某个模块

require: 依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个 

watch: 在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作

order: 优先级比require和watch低,有order指定的state比没有order指定的优先级高,假如一个state模块内安装多个服务,或者其他依赖关系,可以使用

nginx:
  pkg.installed:
    - order:1



====================================================

salt-minion -l debug 客户端进行调试

salt-run manage.status 查看所有minion状态

salt-run manage.up  查看所有在线的minion

salt-run manage.down  查看所有不在线的minion

salt-run manage.down removekeys=true 删除所有不在线的minion


salt-key -L 查看所有minion_key

salt-key -d 删除指定的minion-key

salt-key -a 添加指定的minion-key

salt-key -A 添加所有的minion-key

salt-key -D 删除所有的minion-key


salt-cp 'ios_001' test1 /tmp/  ==>只能是文件


salt-ssh

默认指定文件路径/etc/salt/roster,其他文件文件使用-c参数

hudong:

  host: 192.168.22.23

  user: root

  port:  22

  passwd: 12345678

salt-ssh '*' -r 'uptime' -i

-r 执行shell

-i 第一次连接机器时,添加到knows host









-------------------------

salt  '*' sys.list_functions grains  查看grains支持的功能

salt '*' sys.doc grains  查看grains的具体用法

salt '*' sys.list_modules  查看所有modules列表

salt ‘*’ grains.items

salt '*' grains.tien os

salt '*' grains.ls 


states是saltstack中的配置语言

salt '*' sys.list_state_modules 查看minion支持的所有states列表

salt '*' sys.list_state_functions file 查看file.states的所有功能

salt '*' sys.state_doc file


return组件,是saltstatck系统对执行minion返回后的数据进行存储或者返回给其他程序,支持多种存储方式。

https://docs.saltstack.com/en/latest/ref/returners/index.html


salt '*' sys.list_returners

salt '*' cmd.run 'hostname' --return redis  //就把返回信息存储到redis中了

##################

vim /etc/salt/minion

redis.db:  '0'  #redis数据库

redis.host:  'vps'  #redis 主机(ip or 域名)

redis.port:  6379   #redis port  

------------------------------------

确保redis Python Client文件已安装

#################



job管理

salt-run -d|grep jobs    (还不支持kill某个job)

jobs.active 查看当前运行的jobs     

eg:   salt-run jobs.active

jobs.list_job 指定jid查看jobs详细信息

jobs.list_jobs 查看所有jobs信息

jobs.lookup_jid 指定jid查询jobs结果

jobs.print_job 指定jid查询jobs详细信息


使用saltstatck Module来管理job

salt '*' sys.doc saltutil|grep job

saltutil.find_cached_job 查询job cache 信息

saltutil.find_job 查询job信息

saltutil.kill_job 杀掉job

saltutil.signal_job 发送指定信号

eg :salt '*' saltutil.signal_job jid 15 #15是信号

saltutil.term_job  删掉job


Event和reactor

event是saltstatck里面的对每个事件的一个记录,它相比job更加底层,event能记录更加详细的事件,如minion服务启动后请求master签发证书或者校验的过程,都能通过event事件来看整个过程。

salt-run state.event pretty=true  查看event事件

Reactor是基于event的每个事件来做相应的操作,是一直监听着event,然后触发states事件。


mine组件

salt '*' sys.doc mine

是saltstack收集minion数据存储到master的一个组件,功能与grains相似。

主要应用场景是配合前端负载均衡动态获取mine汇报信息,来动态生成配置文件。

支持两种方式:

1、通过在minion配置文件中定义

vim /etc/salt/minion

mine_functions:

    network.ip_address:

        interface:  eth0

2、通过模板的方式去下发mine采集任务。

salt '*' mine.send network.ip_address interface=docker0


salt '*' mine.get '*' network.ip_address



peer组件

peer是minion向master发布任务的一个组件,使用peer可以直接在minion上向master发布一些任务,和我们在master上执行一样的效果。默认peer是没有配置的,配置只需修改master文件即可。

eg:

peer:

   minion:

    -  test.ping

peer_run:

    minion:

    - manage.up

在minion上测试

salt-call publish.publish 'minion' test.ping

local:

    ----------

    minion:

        True


API调用

import salt.client

client = salt.client.LocalClient()

ret = client.cmd('hosts','test.ping',['para'])

print ret

eg:

cmd(self, tgt, fun, arg=(), timeout=None, expr_form='glob', ret='', jid='', kwarg=None, **kwargs)

client.cmd('*', 'test.arg', ['arg1', 'arg2'], kwarg={'foo': 'bar'})

client.cmd('ios_00[234]','cp.get_file',['salt://path/to/file','/minion/dest'])