作者言

这篇文档详细解释了SLS文件中,每个部分的名称与含义,以及SLS中的数据处理后的数据结构。

我只是SaltStack的初学者,如果文中有错误的地方,请不吝赐教。
在学习的过程,我做了一些实验,犯了不少错,积累了一些经验,对SaltStack的运行也有一定了解,如果有什么问题,或是不太理解的地方,非常欢迎留言交流!

Salt State Tree

Top file

Salt State系统的入口文件,其中定义了minion处于哪个环境,加载哪些SLS模块。

State tree

存放在file_roots目录下的一系列SLS文件。使用SLS模块的形式来组织State tree。

Include声明

Include声明

一个list,其元素是要引用到本SLS文件的其他SLS模块。 只能用在highstate结构的顶层。

示例:

include:
- edit.vim
- http.server

Module引用

Module引用

SLS模块的名字,以在Salt master上的文件结构命名。名为edit.vim的模块指向salt://edit/vim.sls

ID声明

ID声明

定义一个独立的highstate数据段。ID在highstate dict中作为key,其对应的value是包含state声明和requisit声明的另一个dict。
用在highstate结构的顶层或extend声明的下一层。
ID在整个State tree中必须是唯一的。如果同一个ID用了两次,只有最先匹配到的生效,其他所有的同名ID声明被忽略。

Extend声明

Extend声明

扩展被引用的SLS模块中的name声明。extend声明也是一个dict,其key必须是在被引用的SLS模块中定义的ID。
只能用在highstate结构的顶层。

在需要增加或修改另一个SLS文件中定义的state声明时,Extend声明非常有用。下面的代码来自mywebsite.sls文件,其中include并且extend了apache.sls模块(增加了apache监视的对象),使得Apache服务在配置文件mywebsite发生改变时自动重启。

include:
- apache extend:
apache:
service:
- watch:
- file: mywebsite mywebsite:
file:
- managed

State声明

State声明

一个list,至少包含一个定义function声明的string,0个或多个function arg声明的dict。
还有一些可选的成员,比如名字覆盖部分(name和names声明),requistie声明。
只能用在ID声明的下一级。

Requisite声明

Requisite声明

一个list,其成员是requisite引用。
用来生成动作依赖树。Salt states被设计成按确定的顺序执行,require或watch其他Salt state可以调整执行的顺序。
做为list组件用在state声明下一级,或是作为key用在ID声明下一级。

Requisite引用

Requisite引用

只有一个key的dict。key是被引用的state声明的名字,value是被引用的ID声明的名字。 只能用作requisite声明的成员。

Function声明

Function声明

state中要要执行的function。1个state声明中只能有1个function声明。

下面的例子中,state声明调用了state模块pkg模块中的installed功能。

httpd:
pkg.installed

可以用行内缩写方式声明function(上面的例子中就是),使用完整写法使得数据结构更清晰:

httpd:
pkg:
- installed

需要注意的是连续的两个简写形式是无效的,为了避免疑惑,建议全部采用完整写法。
INVALID:

httpd:
pkg.installed
service.running

VALID:

httpd:
pkg:
- installed
service:
- running

只能用作state声明的成员。

Function arg声明

Function arg声明

只有1个key的dict,作为参数传递给function声明,其值为有效的Python类型。其类型必须满足function的需要。 用在function声明下一级。

下面的例子中,state声明是file,function声明是managed,user、group和mode是传递给managed的参数:

/etc/http/conf/http.conf:
file.managed:
- user: root
- group: root
- mode: 644

Name声明

Name声明

覆盖state声明中的name参数。name参数的默认值是ID声明。 name总是1个单key字典,其值类型是string。

在有的场景下,修改默认的name参数非常有用。比如说,可以避免ID冲突。下面例子中的两个state不能同时使用/etc/motd作为ID:

motd_perms:
file.managed:
- name: /etc/motd
- mode: 644 motd_quote:
file.append:
- name: /etc/motd
- text: "Of all smells, bread; of all tastes, salt."

另外一个使用name声明的场景是,ID声明非常长,又需要在多次引用这个ID。在下面的例子,使用mywebsite/etc/apache2/sites-available/mywebsite.com方便多了:

mywebsite:
file.managed:
- name: /etc/apache2/sites-available/mywebsite.com
- source: salt://mywebsite.com a2ensite mywebsite.com:
cmd.wait:
- unless: test -L /etc/apache2/sites-enabled/mywebsite.com
- watch:
- file: mywebsite apache2:
service:
- running
- watch:
- file: mywebsite

Names声明

Names声明

将1个state声明扩展为多个不同名的state声明。

看下面的例子:

python-pkgs:
pkg.installed:
- names:
- python-django
- python-crypto
- python-yaml

转换成lowstate后的结果是:

python-django:
pkg.installed python-crypto:
pkg.installed python-yaml:
pkg.installed

完整的例子

下面的YAML是一个完整的例子,其中的名字部分使用的是hightstate组件名。

<Include Declaration>:
- <Module Reference>
- <Module Reference> <Extend Declaration>:
<ID Declaration>:
[<overrides>] # standard declaration <ID Declaration>:
<State Declaration>:
- <Function>
- <Function Arg>
- <Function Arg>
- <Function Arg>
- <Name>: <name>
- <Requisite Declaration>:
- <Requisite Reference>
- <Requisite Reference> # inline function and names <ID Declaration>:
<State Declaration>.<Function>:
- <Function Arg>
- <Function Arg>
- <Function Arg>
- <Names>:
- <name>
- <name>
- <name>
- <Requisite Declaration>:
- <Requisite Reference>
- <Requisite Reference> # multiple states for single id <ID Declaration>:
<State Declaration>:
- <Function>
- <Function Arg>
- <Name>: <name>
- <Requisite Declaration>:
- <Requisite Reference>
<State Declaration>:
- <Function>
- <Function Arg>
- <Names>:
- <name>
- <name>
- <Requisite Declaration>:
- <Requisite Reference>

Salt Highstate数据结构定义的更多相关文章

  1. GO语言的进阶之路-Golang高级数据结构定义

    GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...

  2. 从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧

    最近工作中要查看一下string的长度,然后忘了是哪个函数,所以去网上搜了一搜,决定把网上学的和其他的一些有关长度的东西在这里汇总一下, 然后就有了此帖. string 是从c语言的char数组的概念 ...

  3. c#-1 数据结构 定义相关 界面交互数据 Model层

    1.时间用Nullable<UInt32> 除了最初时间用DateTime TimeSpan不行. 2.其他元素也用Nullable<UInt32> 3.list集合数据绑定类 ...

  4. Salt States概览

    作者言 我也只是SaltStack的初学者,如果文中有错误的地方,请不吝赐教. 在学习的过程,我也做了不少实验,犯了不少错,积累了一些经验,对SaltStack的运行也有一定了解,如果有什么问题,或是 ...

  5. salt demo 环境

    demo 环境 安装 virtualBox和vagrant 安装工具包:virtualBox, vagrant 下载 https://github.com/UtahDave/salt-vagrant- ...

  6. 数据结构《17》---- 自动补齐之《二》----Ternary Search Tree

    一. 序言 上一篇文章中,给出了 trie 树的一个实现.可以看到,trie 树有一个巨大的弊病,内存占用过大. 本文给出另一种数据结构来解决上述问题---- Ternary Search Tree ...

  7. Scalaz(31)- Free :自由数据结构-算式和算法的关注分离

    我们可以通过自由数据结构(Free Structure)实现对程序的算式和算法分离关注(separation of concern).算式(Abstract Syntax Tree, AST)即运算表 ...

  8. 数据结构(DataStructure)与算法(Algorithm)、STL应用

    catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...

  9. 《数据结构与算法分析》学习笔记(五)——二叉树

    (一)查找二叉树ADT 1.二叉查找树ADT性质:     对于树中的每个节点X,它的左子树中所有关键字值都小于X的关键字值,而它的右子树值的关键字值都大于X的关键字值. 2.一些ADT的基本操作 结 ...

随机推荐

  1. 在微信小程序中使用redux

    本文主要讲述,在微信小程序中如何使用redux DEMO 需要解决的问题 如何在小程序中引入redux状态管理库,及它相关的插件? 微信小程序没有清晰的异步api,便于thunkMiddleware处 ...

  2. Spring 开发之组件赋值

    1. @Value & @PropertySource 1.1 使用方式 @PropertySource:读取外部配置文件中的 k/v 保存到运行的环境变量中;加载完外部的配置文件以后使用 $ ...

  3. DTC配置

    在A和B上配置DTC(控制面板→管理工具→组件服务),配置参数如下: 使防火墙里的3个规则enable

  4. 常用内置模块(二)--logging、hashlib、shelve、xml、configparser

    一.logging模块 1.logging作用 1. 控制日志级别  2. 控制日志格式  3. 控制输出的目标为文件 2.日志级别 1 logging.debug( 2 logging.info( ...

  5. linux命令实现在当前文件夹下面模糊搜索文件

    在当前文件中查找包含的字符串 find . -name "*.txt" | xargs grep 'abc' ,例如:查找txt文件中包含字符串a的字符串

  6. linux定时任务crontab怎样执行root命令

    在/var/spool/cron/文件夹下放置了所有定时任务文件, 1.运行crontab -u $用户名 -e会显示$用户的所有定时任务: 2.运行sudo crontab -e会显示root用户所 ...

  7. WebService基础概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  8. jenkins权限管理插件role-based(二)

    一.安装role-based插件 jenkins默认自带“configure global security/全局安全配置”比较简陋,不建议使用 系统管理-->插件管理-->可选插件--& ...

  9. sublime设置代码缩进

    打开sublime的首选项(Preferences)下的设置-用户(Setting-User) ,配置如下代码 , "translate_tabs_to_spaces": true ...

  10. 201671030117 孙欢灵 实验十四 团队项目评审&课程学习总结

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 任务一:团队项目审核已完成.项目验收过程意见表已上交. 任务二:课程学习 ...