STATE MANAGEMENT
state management也被称为软件配置管理,使系统预设于一种指定的状态,譬如安装软件包,服务管理监视等。
salt state是我们在前面的远程执行教程中讨论的salt模块的扩展,而不是调用一次性执行,系统的状态可以很容易地定义,然后强制执行。
UNDERSTANDING THE SALT STATE SYSTEM COMPONENTS
理解salt state系统的相关组件,了解sls文件格式和渲染机制,而作为一个开发者则需要了解怎样去编写一个更好的state文件。
注意:states文件只在匹配指定的minion端进行编译和执行,执行函数在master被定义。
SALT SLS SYSTEM
salt states的简称是SLS,里面主要包含怎样去配置minion的相关信息,states文件被放在一个目录树下面,可以使用不通的格式进行编写。
states文件的内容和它们的布局方式是尽可能简单,同时允许最大的灵活性。
SLS FILE LAYOUT
states文件被放在salt server端,一个简单的布局示例如下:
1 top.sls 2 ssh.sls 3 sshd_config 4 users/init.sls 5 users/admin.sls 6 salt/master.sls 7 web/init.sls
释义:
top.sls作为一个关键组件,定义了哪些sls文件被配置在哪些minion上。
目录下文件都是以sls后缀结尾,如果文件没有使用sls文件结尾的话,是作为文件被发送到minion端。
sls文件通过点号识别,users/admin.sls通过users.admin进行调用,web/init.sls被引用为web。
SLS FILES
salt状态文件是简单的数据集。由于SLS文件只是单纯的数据,他们可以在许多不同的方式来表达。
salt文件默认时候包含jinja模板的yaml格式的数据,可以使用python和yaml的语言结构。
一个简单的salt state示例:
1 vim: 2 pkg.installed: [] 3 4 salt: 5 pkg.latest: 6 - name: salt 7 service.running: 8 - names: 9 - salt-master 10 - salt-minion 11 - require: 12 - pkg: salt 13 - watch: 14 - file: /etc/salt/minion 15 16 /etc/salt/minion: 17 file.managed: 18 - source: salt://salt/minion 19 - user: root 20 - group: root 21 - mode: 644 22 - require: 23 - pkg: salt
上例做了一个vim,salt,salt-minion,salt-master安装和minion配置同步,并明确安装和配置之间的顺序关系
THE TOP FILE
top文件控制和定义了minion与states之间的映射关系,minion从哪些环境去提取执行的sls文件。
每一个环境都包含了一个或多个minion匹配标记,每一个minion匹配都对应states文件列表。
1 base: 2 '*': 3 - salt 4 - users 5 - users.admin 6 'saltmaster.*': 7 - match: pcre 8 - salt.master
RELOADING MODULES
重载模块,示例:
1 python-pip: 2 cmd.run: 3 - name: | 4 easy_install --script-dir=/usr/bin -U pip 5 - cwd: / 6 7 pep8: 8 pip.installed: 9 - require: 10 - cmd: python-pip
执行结果会出现:
1 ---------- 2 State: - pip 3 Name: pep8 4 Function: installed 5 Result: False 6 Comment: State pip.installed found in sls pep8 is unavailable 7 8 Changes: 9 10 Summary 11 ------------ 12 Succeeded: 1 13 Failed: 1 14 ------------ 15 Total: 2
以上失败的原因是,pep8依赖于python-pip,然而pip在使用cmd命令进行更新,salt无法确定系统是否安装了pip(未重载系统包的安装状态),结果报错,再次执行却状态正常。
注意:salt不会在每一次运行的时候都重载模块的状态,这样运行会大大降低执行的速度。
如何避免上例的情况,可以使用reload_module,reload_module是一个布尔选项,当state设置了一个状态之后,它会强制这个状态完成并更新状态。
示例:
1 python-pip: 2 cmd.run: 3 - name: | 4 easy_install --script-dir=/usr/bin -U pip 5 - cwd: / 6 - reload_modules: true 7 8 pep8: 9 pip.installed: 10 - require: 11 - cmd: python-pip
运行salt-call state.apply pep8在minion端应用。