$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