四、Salt State

来源:互联网 发布:js页面初始化方法 编辑:程序博客网 时间:2024/05/17 12:07

  Salt state的核心是SLS,或者叫Salt State文件。SLS文件采用的数据格式是YAML。SLS描述了系统的目标状态(所谓目标状态就是期待的一个结果,想要达到的一个状态),而且是以一种简单的方式来包含这些数据——这种就是我们常说的配置管理
  简单来说,SLS实际上就是一个数据结构(对于Salt系统来说):词典、列表、字符串和数字等。通过使用这些方法,使得Salt更加灵活. 多写state 文件,将更加明白需要写什么。 其结果就是系统更加容易理解,即使系统管理员和开发人员的需求不断增加。
  States存储在master端的文本文件中,通过master的文件服务(Salt File Server)按需传输到minion端。 这些state文件组成了 State树。在Salt中启动一个中心state系统,首先需要确保已经建立了Salt文件服务(Salt文件服务器应用于Salt State系统,提供文件传输功能)。Salt State的配置是在master端完成,state文件的编辑也是在master端。
  这里我们需要知道的是,所用SLS文件采用的都是YAML格式语言来编写的;基本上YAML贯穿了整个SaltStack。

相关文档
- Salt State System概览

  • Salt State System Reference

  • 命令行查看State System所支持的列表

    salt ‘*’ sys.list_state_modules

  • 查看特定states支持的functions

    salt ‘*’ sys.list_state_functions

  • 查看指定states的详细用法

    salt ‘*’ sys.state_doc iptables
    获取minion上可用的服务列表
    salt ‘*’ service.get_all salt

一、启用 Salt State(启用Salt文件服务器)

  修改master的配置问价,打开file_roots环境

file_roots:   base:     - /srv/salt/

这里表示开启Salt File Server。Salt State的SLS文件也是写在file_roots所定义的目录下。

二、编辑SLS文件

SLS文件位于/srv/salt/目录下.

以安装httpd为例

1.准备TOP文件:/srv/salt/top.sls

base:  '*':    - httpd

文件内容分析:
- top.sls负责minion和SLS文件的绑定——即哪些minion执行什么样的SLS文件。top.sls默认从base标签开始解析,下一级是要操作的目标(即minion),miniom可以通过正则去匹配、也可以通过grain模块、分组名等进行匹配。再下一级是要执行的state文件
- ‘*’表示匹配所有的minion
- httpd表示要执行httpd.sls文件。因此我们还要在/srv/salt/目录下编辑httpd.sls文件
- 使用grains匹配minion。如匹配CentOS系统:

base:  'os:CentOS':    - match: grain              - httpd

  这里的os是grains的属性,CentOS是os属性值。通过命令: salt ‘*’ grains.items 可以查看grains搜集了哪些属性. 必须要定义match: grain,因为这里是通过grains去匹配minion的

不管是top.sls文件还是其他的state文件的语法必须要正确(比如state modules;modules funtion等要正确),否则会报错

2.编辑 /srv/salt/httpd.sls文件

httpd:   pkg:     - installed   service:     - running     - require:       - pkg: httpd

另一种写法:

httpd:  pkg.installed: []  service.running:    - require:      - pkg: httpd

文件内容分析(以第一种写法为例)
- httpd.sls中的数据是YAML格式
- 第一行:ID申明:该组数据的ID。这个ID设置了需要被维护的东西的名字。如:命令、软件或者包名(如httpd)、将要操作的文件或者其他。**
- 第二行:state声明,即定义使用哪个state modules,如这里的使用的是state pkg,用来确保给定的包被安装。
- 第三行:函数声明;定义pkg state 的哪一个函数被使用state。其实二、三行可以写为pkg.installed(格式为 .function>)——即上面的第二种写法
- 第四行是一个名为service的state module
- 第五行:service的函数
- 第六、七行:require函数,执行这个操作需要require函数后的条件达成。如这里表示要运行httpd服务,则需要确保httpd包已经安装
- 以上数据作用:确保名为httpd软件包被安装并且服务处于运行状态。如果httpd软件没有安装,则安装httpd软件包
- 更多state modules查阅

  • * 备注:这个ID可以是任意的。如果是任意的,那么就需要在state modules下明确指定需要维护或管理的事物(一般都是name参数指定),否则会直接使用这个ID作为要安装的包或者要处理的文件等。* 个人建议使用name参数指定较好,这样新手更加容易看懂。。。。

上面的SLS文件就可以这样改:

install_httpd:  pkg.installed:    - name: httpd

一开始写这种SLS文件的时候我很困惑,实际上,这些所谓的“state modules”,函数声明下参数的又是什么。其实,这些对应的是一个类或者函数;函数声明实际上就是在调用函数,函数声明之后的值其实就是函数里面的参数,以pkg模块为例,我们看下他的定义:

salt.states.pkg.installed(name, version=None, refresh=None, fromrepo=None, skip_verify=False, skip_suggestions=False, pkgs=None, sources=None, allow_updates=False, pkg_verify=False, normalize=True, ignore_epoch=False, reinstall=False, update_holds=False, **kwargs)

我们在写SLS文件时,就是这样写的。installed为一个函数。再看一个service模块的定义,如下:

salt.states.service.running(name, enable=None, sig=None, init_delay=None, **kwargs)

如果有Python基础的话,这样看起来就简单多了,不至于一团浆糊,只知道用却不知道到底是怎么传参数的了

3.执行SLS文件

SLS文件写完后,就可以对相应的minion执行SLS文件了,执行方法分两种

  1. 执行所有State SLS文件

salt ‘*’ state.highstate

当minion执行 state.highstate命令后,minion将会下载top.sls文件并且去匹配文件中的表达式,表达式匹配后,列出的模块将会被下载、编译和执行

  1. 执行特定的State SLS文件

salt ‘*’ state.sls

如本例:

salt ‘*’ state.sls httpd

备注: 在State SLS文件中,可以引用Grains和Pillar的数据

三、多个SLS文件

在更有扩展性的部署Salt时,可能会用到多个SLS文件,对于2个或更多的SLS文件,可以结合形成SLS文件树。

举例:安装并启动httpd服务后,并将index.html文件下载到minion端的/var/www/html下以便访问。

/srv/salt/top.sls

base:  '*':    - httpd

/srv/salt/httpd/init.sls

httpd:  pkg:    - installed  service:    - running    - require:      - pkg: httpd/var/www/html/index.html:  file.managed:    - source: salt://httpd/index.html    - require:      - pkg: httpd

在声明ID的时候,实际上就是指定了minion下载文件后的存放路径——/var/www/html/index.html

/srv/salt/httpd/index.html

this is test
  • 最后执行SLS

salt ‘*’ state.sls httpd

四、Jinja模板格式的SLS文件

示例

五、state的常用模块

在Salt State System的SLS文件中,state的各种模块是有特定语法的(我一开始还以为就是命令行中的state的用法,看了官方文档发现其实并不是逃~~)

SLS文件中的Salt State所有模块及其使用方法

SLS文件中的变量引用语法

1. 常用模块

  • pkg : 软件安装
  • file : 文件管理
  • iptables : iptables规则

2. 使用案例

  • openssh-server服务安装以及防火墙配置

/srv/salt/top.sls

base:  '*':    - sshd

/srv/salt/sshd/init.sls

sshd:  pkg:    - installed    - name: openssh-server  service:    - running    - require:       - pkg: openssh-serverfirewall:  iptables.append:    - table: filter         #指定filter表    - chain: INPUT          #指定INPUT链    - jump: ACCEPT          #指定动作:ACCEPT/REJECT    - match: state          #状态匹配    - connstate: NEW    - dport: 22             #指定目标端口    - proto: TCP            #指定协议    - sport: 1025:65535     #指定源端口    - save: True            #service iptables save。规则写入/etc/sysconfig/iptables

iptables最后的命令如下:

#/sbin/iptables  -t filter -A INPUT  -p TCP -m state --state NEW --dport 22 --sport 1025:65535 --jump ACCEPT#service iptables save

Salt State系统的是Salt的核心之一了,熟练写SLS,可以十分方便的管理多个目标主机。更多的State Modules请参考官网

0 0
原创粉丝点击