$ID:               定义state的名称,通常采用与描述的对象保持一致的方法,如apache、nginx等
   $State:      须管理对象的类型,详见http://docs.saltstack.com/ref/states/all/index.html
      - $state: states      定制对象的状态

salt \* state.sls dhcp   使用
salt \* state.sls dhcp/aaa   使用dhcp目录下的aaa.sls
salt \* state.sls dhcp test=True   测试,不会修改minion
salt \* state.highstate

/usr/lib/python2.6/site-packages/salt/states        映射到modules
/usr/lib/python2.6/site-packages/salt/modules
如果使用states,需要在/srv/salt 下编写sls文件
state
确定你的文件路径
file_roots:
  base:
    - /srv/salt
保证你有入口文件
state文件包

vim /srv/salt/dhcp/init.sls
include:
  - dhcp.python_devel        包含dhcp目录下的python_devel.sls
cat /srv/salt/dhcp/python_devel.sls
dhcp:
  pkg.installed
salt \* state.sls dhcp


[root@node1 salt]# cat top.sls
base:
  '*':
    - test
找test.sls
test是一个sls文件的名字 或者是一个目录的名字(该目录下必须有init.sls这个文件)
[root@node1 salt]# cat test.sls
httpd: #id(默认这个位置对应的是name的值)
  pkg: #state
    - installed #state的函数

state目录
/usr/lib/python2.6/site-packages/salt/states
使用该state
salt 'node2' state.highstate

sls文件的中的任务执行顺序可以使用关键字控制(require)
httpd:        ID
  pkg:        states模块
    - installed        模块的函数
  service.running:
    - require:        需要,依赖
      - pkg: httpd
指定执行某一个sls文件(文件的扩展名.sls不需要写出来)
[root@node1 salt]# salt 'node2' state.sls test
针对配置文件设置监听,实现自动重启
###############################################
httpd:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: httpd
    - watch:            观察,文件有变化就启动
      - file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
  file:
    - managed
    - source: salt://httpd.conf
    - require:
      - pkg: httpd
################################################
apache:
  pkg:
    - name: httpd
    - installed

  service.running:
    - name: httpd
    - require:
      - pkg: httpd
    - watch:
      - file: apache_config

apache_config:
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
- source: salt://httpd.conf
- template: jinja    在apache_config控制的文件用jinja渲染
    - require:
      - pkg: httpd

httpd.conf




1、    安装软件包
2、    修改配置文件
3、    启动服务
https://docs.saltstack.com/en/latest/ref/states/all/index.html

vim user.sls
{%for user in ['test1','test1','test3','test4']%}        渲染
{{user}}:                                    变量
user.present
{%endfor%}                                结束(如果是if 为endif)

一次调用多个sls文件
vim /srv/salt/top.sls
base:
  ‘*’
-    user
-    apache_start
salt \* state.highstate


源码安装nginx
nginx_source:
 file.recurse:    # file.managed:用于单文件,file.recurse用于目录
  - name: /tmp/
  - source: salt://nginx/
extract_nginx:
cmd.run:
  - cwd: /tmp
  - names:                # 多命令用names,单命令用name
    - tar xf nginx-1.6.2.tar.gz
    - tar xf pcre-8.35.tar.gz
  - require:
    - file: nginx_source
nginx_compile:
cmd.run:
  - cwd: /tmp/nginx-1.6.2
  - names:
    - ./configure --prefix=/usr/local/nginx --with-pcre=/tmp/pcre-8.35 && make
    - make install
  - require:
    - cmd: extract_nginx

自定义
state就是用来控制sls文件与module的映射
state默认路径   /usr/lib/python2.6/site-packages/salt/states

mkdir -pv /srv/salt/_states
[root@node1 _states]# cat wjj.py
def bs(name, x):                                定义函数
    ret = {                                定义一个字典
            'name': name,           
            'changes': {},
            'result': False,
            'comment': 'test_state' 描述的字段
            }
    try:
        result = x*x                做一些事情
        ret['changes']['new'] = result
        ret['result'] = True
    except:                                出现异常怎么办
        ret['changes']['new'] = 'jisuan cuwu'
        return ret
注意你的函数的第一个参数应该永远是name
同步一下你的修改
salt '*' saltutil.sync_all

使用你自定义的state
定义sls文件
[root@node1 _states]# cat /srv/salt/jisuan.sls
test:
  wjj:
    -  bs
    -  x: 3
salt 'node2' state.sls jisuan

tips:在state里面引用salt命令
__salt__['模块.函数'](参数)

#encoding=utf-8
import logging
import os

log = logging.getLogger(__name__)

def touch(name, path, file):
    ret = {
            'name': name,
            'changes': {},
            'result': True,
            'comment': 'test_state'
            }
    #log.error(name)
    #log.error(path)
    try:
        with open(path+'/'+str(file), 'w') as f:
            f.write('my test!')
    except Exception, e:
        log.error(str(e))

    return ret

def delete(name, path, file):
    ret = {
            'name': name,
            'changes': {},
            'result': True,
            'comment': 'test_state'
            }
    cmd='rm -fr ' + path + '/' + file
    os.system(cmd)
    ret['result']=True
    return ret

results matching ""

    No results matching ""