CONFIGURATION MANAGEMENT(第一部分)

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
View Code

 

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
View Code

第一行: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
View Code

这个示例极大的扩展了许多功能,如下简要说明:
(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
View Code

注意:在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
View Code

看点:
(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
View Code

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
View Code

看点:
(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
View Code

看点:
  以上的示例演示的是在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
View Code

看点:
(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']}}
View Code

sls文件的第一行表示使用py渲染器解释,再定义一个run函数,返回值设置为一个符合salt要求的数据结构。

示例:

1 #!pydsl
2 
3 include('python', delayed=True)
4 state('django').pkg.installed(
View Code

示例:

1 #!pyobjects
2 
3 include('python')
4 Pkg.installed("django")
View Code

说明:使用YAML是一个好的选择,同时使用纯python的sls文件可以获得更加复杂强大的功能。


RUNNING AND DEBUGGING SALT STATES

在准备运行sls文件的时候,最好先测试运行一下,示例:
在minion端运行:
  salt-call state.apply -l debug
或则打开前台运行观察详细执行情况
  salt-minion -l debug

 

posted @ 2017-09-07 23:52  孤独的海浪  阅读(343)  评论(0编辑  收藏  举报