State

 

state的作用最大的作用就是check功能,基于状态的好处是,与定义的目标配置,如果服务器上有了就什么都不做,如果没有就进行变更

 

控制state执行顺序

如果所需的状态执行成功,则依赖状态将执行。如果要求的状态执行失败,则依赖状态将不会发生

可以使用如下语句

                                          正向            反向
依赖某个状态                              require       require_in         
关注某个状态                              watch         watch_in
根据尚未执行的状态的预期结果来采取行动        prereq        prereq_in
继承在另一个id声明中传递的参数               use           use_in
重新执行                                  onfail        onfail_in

 

 

require示例

aa1:
  cmd.run:
    - name: ls /han
    - require:             # aa2执行成功时执行aa1,否则aa1不执行
      - cmd: aa2
aa2:
  cmd.run:
    - name: mkdir /han



aa1:
  cmd.run:
    - name: ls /han
aa2:
  cmd.run:
    - name: mkdir /han
    - require_in:               # aa2执行成功时执行aa1,否则aa1不执行
      - cmd: aa1 

 

watch示例

ntpd:
  service.running:
    - watch:             # 配置文件更新后重启服务,否则不会发生任何事情
      - file: /etc/ntp.conf

file.managed:
    - name: /etc/ntp.conf
    - source: salt://ntp/files/ntp.conf

 

prereq示例

graceful-down:
  cmd.run:
    - name: service apache graceful
    - prereq:
      - file: site-code

site-code:
  file.recurse:
    - name: /opt/site_code
    - source: salt://site/code

更新网站代码前线关闭apache服务

 

use示例

/tmp/foo.conf:
  file.managed:
    - source: salt://foo.conf
    - template: jinja
    - mkdirs: True
    - user: apache
    - group: apache
    - mode: 755

/tmp/bar.conf:
  file.managed:
    - source: salt://bar.conf
    - use:                # 继承/tmp/foo.conf中声明的变量
      - file: /tmp/foo.conf 

 

onfail示例

a2:
  cmd.run:
      - name: cho "connect 1.1.1.1:8080 server..."   
a3:
  cmd.run:
    - names:
      - echo "connect 1.1.1.2:8080 server..."
      - touch /tmp/111111111
    - onfail:   # a2执行失败时执行a3,否则a3不执行
      - cmd: a2

 

top入口文件

base:

    # 所有minion使用以下state文件
    '*':
        - ldap-client
        - networking
        - salt.minion
        
        

    # minion_id 以字符串 'nag1' 开头
    # 或者grains role的值是 'monitoring' 
    # 使用 nagios/server.sls state文件
    'nag1* or G@role:monitoring':
        - nagios.server

    # 使用正则匹配minion_id
    '^(memcache|web).(qa|prod).loc$':
        - match: pcre
        - nagios.mon.web
        - apache.server

    # 使用Grains匹配minion_id
    'os:Ubuntu':
        - match: grain
        - repos.ubuntu

    # 使用Grains正则匹配minion_id
    'os:(RedHat|CentOS)':
        - match: grain_pcre
        - repos.epel

    # minion_id列表
    'foo,bar,baz':
        - match: list
        - database

    # 使用Pillar “somekey:abc”匹配minion
    'somekey:abc':
        - match: pillar
        - xyz

 

编写SLS文件

# for循环
{% for usr in ['moe','larry','curly'] %}
{{ usr }}:
  user.present
{% endfor %}

# if判断
{% if pillar.get('webserver_role', '') %}
/var/www/foobarcom:
  file.recurse:
    - source: salt://webserver/src/foobarcom
    - env: {{ pillar['webserver_role'] }}         # 引用Piillar
    - user: grains['http_user']                   # 引用Grains
    - group: grains['http_group']
{% endif %}

 

使用Jinja模板

nginx_server:
  file.managed:
    - name: /use/local/nginx/nginx.conf
    - source: salt://nginx/files/nginx.conf
    - template: jinja
    - defaults:
      port : {{ pillar['port'] }}
      
nginx/files/nginx.conf:
...
{{ port }}
...
...     

 

 

扩展State模块

/srv/salt/_states/check.py
import os
def path(name,abspath=None):
    ret = {
       'name': name,
      'changes': {}, 
       'result': '',
       'comment': ''} 
    if os.path.exists(abspath):
        ret['result'] = True    
    else:
        ret['result'] = False
    ret['comment'] = abspath
    return ret

/srv/salt/aaa.sls
asdsad:
  check.path:
    - abspath: /tmp

返回
salt "*" state.sls aaa
----------
          ID: asdsad
    Function: check.path
      Result: True
     Comment: /tmp
     Started: 17:01:09.052687
    Duration: 0.835 ms
     Changes:   
Summary
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1

 

posted @ 2017-05-29 22:14  跟随心走  阅读(262)  评论(0)    收藏  举报