salt state函数就是指在salt state中所做的实际工作,是saltstack配置管理最重要的东西。
函数用来安装和配置应用,创建用户,分发文件和关于你配置你系统的所有其它事情。
在我们调用函数之前,我们来看一下salt state函数的语法。
salt state使用YAML来描述系统状态,YAML是描述结构化数据(类似JSON,但更人性化)的简单语言。
下面的图表显示salt state的声明格式:
salt state第一行声明是是一个ID。
ID下面是你调用一个或多个salt state函数的地方。
最好学习salt state函数的方法是学习一个示例。我们再次使用之前搭建的demo环境来学习这个示例https://www.centos.bz/2016/11/saltstack-demo-environment/。
打开终端,切换到salt-vagrant-demo-master目录,执行vagrant up命令。
当环境启动后,创建一个名称为salt-vagrant-demo-master/saltstack/salt/examples.sls的文件,以便你能运行这么示例。
把下面的代码复制到刚才创建的examples.sls文件:
ssh到salt master服务器:
用如下命令应用examples.sls state:
下面是创建目录的示例。
下面的state用来确保一个服务正在运行在salt minion:
每一个state声明以一个state ID来区分。state ID必须是唯一的,它们能包含空格和数字。
你可以在一个state ID下添加多个salt state函数:
当你调用一个函数时,确保你把函数的参数全部看一遍,因为通常你仅需传递额外的参数就可以完成许多事件。通过传递enable: True到service.running函数,saltstack就会确保服务开机启动。
每个函数都有一个name参数。如果你没有设置,那么salt就使用state的ID。在这个示例中,name参数为https://github.com/saltstack/salt.git:
使用ID作为name参数值的确省了敲打一些字符,不过还是推荐都设置一个name,如下:
这样能让你的state更明了,更容易维护。
参数groups的值是一个列表,所以放到下一行,缩进两个空格再加一个短破折号。
平台规范化的一个很好的例子。即使每个平台配置的hosts方式有所不同,salt state仍然能正确地在各个系统配置hosts(不需要关心salt实现的细节)。
service.restart和其它执行函数可以在salt state调用。
你可能好奇为什么不使用service state函数而使用service执行函数,为什么salt state和salt执行函数看起来类似有很多重叠的地方。
如果你比较salt执行函数与salt state函数的名称,如service.restart和service.running,你可能会注意到重要的区别。salt state函数设计用来只在必要的时候应用配置,没有必要时不做任何更改。salt执行函数在每次调用时都执行。
当你调用service.running state函数时,函数首先先查看服务是否已经运行,如果没有就启动,否则不做任何事情。当你调用service.restart执行函数时,始终会重启服务。
在目标系统应用一个salt state会发生许多更改。salt state函数提供了一个机制来测试显示在运行期间将会做怎样的变更。