Salt-Formulas的使用

Saltstack自0.17.x版本开始引进Formulas的概念,旨在经过简化State和集成数据来实现State的友好管理。根据SALT FORMULAS的官方文档,在完成手动添加formula目录后,formula应该提供一些默认的配置而当即可用。若是须要进一步的配置,大部分的formulas能够经过Pillar数据进行配置,能够参考每一个Formula仓库的pillar.example文件查询可用的配置。html

1、未集成的State

先来看下编写State的通常样例:apache

 

  1. apache:
  2. pkg:
  3. - installed
  4. {% if grains['os_family'] == 'RedHat' %}
  5. - name: httpd
  6. {% elif grains['os_family'] == 'Debian' %}
  7. - name: apache2
  8. {% endif %}

乍看一下以为这样写很正常,但是仔细想一想吧,这样一来,apache的应用属性的判断逻辑写死在sls文件里,一旦须要更多的判断逻辑时这样的写法便稍显笨拙,那么,有什么好办法呢?spa

2、引进 Formulas

其实简单来讲的话,Formulas便是建议使用Salt的用户编写State sls时统一使用map.jinjia来完成处理逻辑和判断,从而生成相似pillar的变量数据。下面,一样以apache为例讲述Salt Formulas编写逻辑。Formulas结构以下:rest

 

  1. .
  2. ├── /srv/salt/apache/conf.sls
  3. ├── /srv/salt/apache/init.sls
  4. └── /srv/salt/apache/map.jinja

Formulas的核心便在于map.jinja的编写,如上Apache对应的map.jinja样例内容以下:orm

 

  1. {% set apache = salt[‘grains.filter_by’]({
  2. Debian’: {
  3. server’: apache2’,
  4. service’: apache2’,
  5. conf’: ‘/etc/apache2/apache.conf’,
  6. },
  7. RedHat’: {
  8. server’: httpd’,
  9. service’: httpd’,
  10. conf’: ‘/etc/httpd/httpd.conf’,
  11. },
  12. }, merge=salt[‘pillar.get’](‘apache:lookup’)) %}

这样一来,apache对应的主sls(init.sls)内容则能够改写为以下:server

 

  1. {% from apache/map.jinja import apache with context %}
  2. apache:
  3. pkg:
  4. - installed
  5. - name: {{ apache.server }}
  6. service:
  7. - running
  8. - name: {{ apache.service }}
  9. - enable: True

少了复杂的判断逻辑,多了变量数据的简单使用!htm

3、结合Pillar的Formulas

Salt Formulas 还能够经过结合Pillar实现更多的扩展。一样以上述Apache的配置为例,须要编写conf.sls来完成apache的配置,结合Formulas Map 概念以后,它可能变成以下内容:blog

salt-formulas-pillar

注意上述配置里,除了导入map.jinja预约义内容外,还有一行source配置使用了奇怪的salt["pillar.get"]["apache:lookup:config:tmpl"],熟悉pillar的应该不陌生,这即是结合了pillar来完成state的定义。文档

事先在/srv/pillar/top.sls里包含apache.sls,然后在这个pillar定义文件里添加对应内容来重写映射关系:get

 

  1. apache:
  2. lookup:
  3. config:
  4. tmpl: salt://apache/files/redhat/
  5. server: my_custom_apache

这样一来,即可以基于Formulas map基础上作更多的特点化配置。

4、Salt Formulas 制做

如你所见,Formulas其实应该算是State的集成和封装,事实上,Github也已经有不少的*-Formulas state出现,一个标准的*-Formulas 拥有如下结构:

 

  1. foo-formula
  2. |-- foo/
  3. | |-- map.jinja
  4. | |-- init.sls
  5. | `-- bar.sls
  6. |-- CHANGELOG.rst
  7. |-- LICENSE
  8. |-- pillar.example
  9. |-- README.rst
  10. `-- VERSION

具体可参照Github上已有的Formulas样例,这里再也不赘述。

参考内容:

salt官网

Forrest Alvarez Demo

相关文章
相关标签/搜索