CONFIGURATION MANAGEMENT(第一部分)
salt有一个强大而灵活的配置框架,它建立在远程执行模块的核心上,可以通过指定语言编写的sls文件轻易的在上万台主机上执行。
states的介绍:
使用一个精简容易阅读和理解的配置文件表示主机状态。
Full list of states
包含一系列的states模块,譬如pkg,group功能模块等
Pillar System
关于pillar变量系统的描述
Highstate data structure
高级state文件的结构和语法定义
Writing states
如何管理和编写一个states文件,并且去扩展更多的功能
注意:
执行模块和状态模块是有所区别的,执行模块参考:
https://docs.saltstack.com/en/latest/ref/modules/all/index.html
使用示例:
salt '*' user.add name <uid> <gid> <groups> <home> <shell>
状态模块是让目标达成一种预定的配置状态,不能在state文件中直接使用执行模块,可以通过module states来调用执行模块。
示例:
1 moe: 2 user.rename: 3 - new_name: larry 4 - onlyif: id moe 5 6 rename_moe: 7 module.run: 8 - m_name: moe 9 - new_name: larry 10 - onlyif: id moe
Renderers
渲染器,salt使用模板语言来组织sls文件的格式和逻辑。
Full list of renderers
支持的模板使用列表,参考链接:
https://docs.saltstack.com/en/2016.11/ref/renderers/all/index.html#all-salt-renderers
HOW DO I USE SALT STATES?
salt state配置的非常简单,同时也非常强大,salt系统的核心在于state文件,它作为一种状态的表示,使用简单的格式包装这些配置数据。
IT IS ALL JUST DATA
sls文件是由字典,列表,数字,字符串组成的一个数据结构。
THE TOP FILE
作为一个入口文件,定义了minion主机与sls文件之间的对应关系。
DEFAULT DATA - YAML
默认sls文件使用yaml格式组织起来。
一个典型的sls文件示例:
1 apache: 2 pkg.installed: [] 3 service.running: 4 - require: 5 - pkg: apache
第一行:ID Declaration(声明),可以设置为被操作事务的名称。
第二,三行:<state_module>.<function>,state模块和函数声明:
最后两行:require定义了依赖关系,确保会先成功执行了pkg之后再执行服务启动。
ADDING CONFIGS AND USERS
1 apache: 2 pkg.installed: [] 3 service.running: 4 - watch: 5 - pkg: apache 6 - file: /etc/httpd/conf/httpd.conf 7 - user: apache 8 user.present: 9 - uid: 87 10 - gid: 87 11 - home: /var/www/html 12 - shell: /bin/nologin 13 - require: 14 - group: apache 15 group.present: 16 - gid: 87 17 - require: 18 - pkg: apache 19 20 /etc/httpd/conf/httpd.conf: 21 file.managed: 22 - source: salt://apache/httpd.conf 23 - user: root 24 - group: root 25 - mode: 644
这个示例极大的扩展了许多功能,如下简要说明:
(1)ID声明使用apache,并充当里面state模块的name参数,当然也可以使用内部的name参数来覆盖。
(2)一个ID状态声明包含了多个state模块状态,但是一个模块状态只能包含一个函数
(3)使用require和watch定义了配置之间的依赖关系,配置起来更为灵活
注意:watch与require的功能相似,但是watch要比require多一个监视功能,如果对象发生变化会触发动作。
MOVING BEYOND A SINGLE SLS
如果要将配置结构设计成可扩展灵活的形式,就需要将sls文件进行分类,这些sls文件被组织在一个state数状结构中。
示例:
1 apache/init.sls 2 apache/httpd.conf
注意:在sls文件的命名中不要使用点号,这样会导致top文件引用是识别文件名错误。
以下是一个较为复杂的示例:
ssh/init.sls:
1 openssh-client: 2 pkg.installed 3 4 /etc/ssh/ssh_config: 5 file.managed: 6 - user: root 7 - group: root 8 - mode: 644 9 - source: salt://ssh/ssh_config 10 - require: 11 - pkg: openssh-client 12 13 ssh/server.sls: 14 15 include: 16 - ssh 17 18 openssh-server: 19 pkg.installed 20 21 sshd: 22 service.running: 23 - require: 24 - pkg: openssh-client 25 - pkg: openssh-server 26 - file: /etc/ssh/banner 27 - file: /etc/ssh/sshd_config 28 29 /etc/ssh/sshd_config: 30 file.managed: 31 - user: root 32 - group: root 33 - mode: 644 34 - source: salt://ssh/sshd_config 35 - require: 36 - pkg: openssh-server 37 38 /etc/ssh/banner: 39 file: 40 - managed 41 - user: root 42 - group: root 43 - mode: 644 44 - source: salt://ssh/banner 45 - require: 46 - pkg: openssh-server
看点:
(1)state文件结构组织比较合理,将客户端和服务端状态进行分离
(2)使用include将ssh文件导入到server状态文件中,实现重用
(3)定义了完整合理的依赖关系
EXTENDING INCLUDED SLS DATA
示例:
ssh/custom-server.sls:
1 include: 2 - ssh.server 3 4 extend: 5 /etc/ssh/banner: 6 file: 7 - source: salt://ssh/custom-banner
python/mod_python.sls:
示例:
1 include: 2 - apache 3 4 extend: 5 apache: 6 service: 7 - watch: 8 - pkg: mod_python 9 10 mod_python: 11 pkg.installed
看点:
(1)示例1使用extend将/etc/ssh/banner state状态的source参数重新配置,实现灵活的变更
(2)示例2使用extend为apache模块添加依赖关系,并增加了一个依赖状态模块mod_python
注意:extend功能只是进行附加,而不是像watch和require那样引进一个完整的状态。
UNDERSTANDING THE RENDER SYSTEM
理解模板引擎
sls文件默认使用yaml_jinja,整个sls文件使用jinja模板渲染之后,再序列化成yaml的文档格式,jinja模板可用在state模块函数中。
GETTING TO KNOW THE DEFAULT - YAML_JINJA
示例:
1 apache: 2 pkg.installed: 3 {% if grains['os'] == 'RedHat'%} 4 - name: httpd 5 {% endif %} 6 service.running: 7 {% if grains['os'] == 'RedHat'%} 8 - name: httpd 9 {% endif %} 10 - watch: 11 - pkg: apache 12 - file: /etc/httpd/conf/httpd.conf 13 - user: apache 14 user.present: 15 - uid: 87 16 - gid: 87 17 - home: /var/www/html 18 - shell: /bin/nologin 19 - require: 20 - group: apache 21 group.present: 22 - gid: 87 23 - require: 24 - pkg: apache 25 26 /etc/httpd/conf/httpd.conf: 27 file.managed: 28 - source: salt://apache/httpd.conf 29 - user: root 30 - group: root 31 - mode: 644
看点:
以上的示例演示的是在sls文件中使用jinja模板,在jinja模板中salt,grains,pillar都可以使用,允许调用salt函数(指的是执行模块),非常强大,
下面以部署moosefs为例来讲解模板的一些复杂使用方法:
moosefs/chunk.sls:
1 include: 2 - moosefs 3 4 {% for mnt in salt['cmd.run']('ls /dev/data/moose*').split() %} 5 /mnt/moose{{ mnt[-1] }}: 6 mount.mounted: 7 - device: {{ mnt }} 8 - fstype: xfs 9 - mkmnt: True 10 file.directory: 11 - user: mfs 12 - group: mfs 13 - require: 14 - user: mfs 15 - group: mfs 16 {% endfor %} 17 18 /etc/mfshdd.cfg: 19 file.managed: 20 - source: salt://moosefs/mfshdd.cfg 21 - user: root 22 - group: root 23 - mode: 644 24 - template: jinja 25 - require: 26 - pkg: mfs-chunkserver 27 28 /etc/mfschunkserver.cfg: 29 file.managed: 30 - source: salt://moosefs/mfschunkserver.cfg 31 - user: root 32 - group: root 33 - mode: 644 34 - template: jinja 35 - require: 36 - pkg: mfs-chunkserver 37 38 mfs-chunkserver: 39 pkg.installed: [] 40 mfschunkserver: 41 service.running: 42 - require: 43 {% for mnt in salt['cmd.run']('ls /dev/data/moose*') %} 44 - mount: /mnt/moose{{ mnt[-1] }} 45 - file: /mnt/moose{{ mnt[-1] }} 46 {% endfor %} 47 - file: /etc/mfschunkserver.cfg 48 - file: /etc/mfshdd.cfg 49 - file: /var/lib/mfs
看点:
(1)使用了salt执行模块cmd.run。
(2)使用了模板的for逻辑处理结构
INTRODUCING THE PYTHON, PYDSL, AND THE PYOBJECTS RENDERERS
使用额外的其他模板
示例:
python/django.sls:
1 #!py 2 3 def run(): 4 ''' 5 Install the django package 6 ''' 7 return {'include': ['python'], 8 'django': {'pkg': ['installed']}}
sls文件的第一行表示使用py渲染器解释,再定义一个run函数,返回值设置为一个符合salt要求的数据结构。
示例:
1 #!pydsl 2 3 include('python', delayed=True) 4 state('django').pkg.installed(
示例:
1 #!pyobjects 2 3 include('python') 4 Pkg.installed("django")
说明:使用YAML是一个好的选择,同时使用纯python的sls文件可以获得更加复杂强大的功能。
RUNNING AND DEBUGGING SALT STATES
在准备运行sls文件的时候,最好先测试运行一下,示例:
在minion端运行:
salt-call state.apply -l debug
或则打开前台运行观察详细执行情况
salt-minion -l debug