码迷,mamicode.com
首页 > 其他好文 > 详细

saltstack(五) saltstack的state状态管理

时间:2016-04-21 15:04:13      阅读:412      评论:0      收藏:0      [点我收藏+]

标签:

一,YAML语法

  首先先了解一下YAML,默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。

  YAML语法有三个注意事项,具体如下:

  1,使用空白字符为文件缩排表示结构,不过不能使用TAB

  2,注释用#号

  3,字符串平常不使用引号,如果有需要,可以使用单引号或双引号。使用双引号表示字符串时,特殊字符可以通过倒斜线(\)来进行定义

具体用法

 1,列表:短杠(-)+ 空白字符
        - henry
        - sina
        等价于:[henry,sina]
2,字典:key和value通过冒号(:)+空白字符隔开 name: henry site: http://www.saltstack.cn/ 等价于:{name:henry,site:http://www.saltstack.cn/} 3,多层结构:通过缩进来表示层级 - henry: - sites: - blog: http://www.saltstack.cn/ 等价于:[{henry:[{sites:[{blog:http://www.saltstack.cn/}]}]}]

官网地址:http://docs.saltstack.cn/topics/yaml/index.html

二,jinja

  Salt默认使用Jinja2模板系统来生成YAML,是python语言开发的一个模板引擎,类似于Djingo模板系统

jinja模块的用法:

 1 变量:{{ foo }},变量如果是字典的话可以使用{{foo.bar}}或{{foo[bar]}}      
 2 注释:{# comment #}
 3 for:                          ##可以使用for循环取值
 4   {% for eachitem in items %}
 5     {{ eachitem }}
 6   {% endfor %}
 7 if:                           ##可以做if条件判断
 8   {% if GFW %}
 9     welcome to China!
10   {% elif not Internet %}
11     welcome to North korea!
12   {% else %}
13     Freedom
14   {% endif %}

三,State Tree

  Top file:配置管理入口文件,和pillar类似,指定minions需要完成那些配置管理,默认为top.sls
  注:在定义top.sls时,会先找apache/init.sls,如果没有的话,会找apache.sls
  base:
    ‘*‘:
      - apache
  sls模块使用点(.)来分割,如apache.install等于salt://apache/install.sls或salt://apache/install/init.sls
  Include/Extend:sls文件间可以通过include及extend来引用和扩展
  sls中ID必须唯一,且在该ID下的同一类的状态管理模块只能有一个,所谓的slsID 就是定义sls文件时最开始定义在开头的名字。
  0.17.0 salt增加了state_auto_order参数(默认值为True),使state在没有Requisites的情况下按照从上而下的顺序进行执行

四,Requisites(相当于sls流程控制,那个先执行,那个后执行等) 

  require:本state执行时需要先执行那些state
  require_in:与require位置相反
  watch:除了require外,也会监测依赖的state的状态,如果状态发生变化,做出反应(例如监控文件变化,发生变化后立即重启服务)
  watch_in: 与watch位置相反
  prereq:0.16.0 新增的功能,会通过test=True接口检查所依赖的state的状态,如果状态发生变化,执行
  prereq_in:相反

五,下面介绍三个模块的用法,更多模块用法请参考官网

 官网地址:https://docs.saltstack.com/en/latest/ref/states/all/

 软件包状态管理模块
 模块名:pkg
 功能:管理软件包状态,会根据操作系统不同,选择对应安装方式
 基本操作:

pkg.installed:     #确保软件包已安装,如果没有安装进行安装
pkg.latest:        #确保软件包是最新版本,如果不是,进行升级
pkg.remove:        #确保软件包已卸载,如果之前已安装,进行卸载
pkg.purge:         #除remove外,也会删除其配置文件

 文件状态管理模块:
  模块名:file
  功能:管理文件状态
  基本用法:

file.managed:     #保证文件存在并且为对应的状态
file.recurse:      #保证目录存在并且为对应的状态
file.absent:       #确保文件不存在,如果存在则进行删除操作

  服务状态管理模块:
  模块名:service
  功能: 管理服务状态
  基本用法:

service.running        #确保服务处于运行状态
service.enabled        #确保服务会开机自动启动
service.disabled    #确保服务不会开机自启动
service.dead        #确保服务当前没有运行

六,实例操作

    (一)、安装apache

 

top.sls
    base:
      *:
        - apache
init.sls
    
apache:                    ##slsID
  pkg.installed:                        ##安装httpd
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf  ##拷贝/srv/salt/apache/httpd.conf到minion的/etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
    - require:                      ##检查apache有没有安装成功
      - pkg: apache            
  service.running:
    - enable: True
    - name: httpd
    - watch:                       ##watch检测配置文件,如果发生变化会重启服务
      - pkg: apache
      - file: apache                    

 

运行配置管理:salt ‘*‘ state.sls apache
salt ‘*‘ salt.highstate test=True #test=True用于测试语法

   (二)、apache需要监控8080端口,代码如下:

首先修改apache的主配置文件,修改配置文件为 listen {{ port }},修改完成后可以直接在sls文件里定义
apache:
  pkg.installed:
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
    - require:
      - pkg: apache
    - template: jinja        ##调用jinja模板渲染
    - context:              ##这里可以是context或default效果一样
      port: 8080
  service.running:
    - enable: True
    - name: httpd
    - watch:
      - pkg: apache
      - file: apache
如果多台主机监听的端口不一样,具体修改如下:
    apache:
  pkg.installed:
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
    - require:
      - pkg: apache
    - template: jinja
    - defaults:
      {% if grains.id == "10.13.41.80" %}
        port: 8080
      {% elif grais.id == "10.13.41.81" %}
        port: 8081
      {% else %}
        port: 80
      {% endif %}
  service.running:
    - enable: True
    - name: httpd
    - watch:
      - pkg: apache
      - file: apache

为了让sls文件不参杂业务数据,业务数据应该独立存放,到了该pillar登台的时候了。

/srv/pillar/apache/init.sls
apache:    
  {% if grains.id == "test" %}
     port: 8081
  {% elif grains.id == "test1" %}
     port: 8082
  {% else %}
     port: 80
  {% endif %}
/srv/pillar/top.sls base: *: - apache salt * saltutil.regresh_pillar ##刷新pillar salt * pillar.get apache:port ##取minion的pillar信息 /srv/salt/apache/deploy.sls
- template: jinja
- defaults:
port:{{salt[pillar.get](apaceh:port,80)}}

saltstack的状态管理state就介绍到这里。

 

saltstack(五) saltstack的state状态管理

标签:

原文地址:http://www.cnblogs.com/phennry/p/5416859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!