简单介绍


什么是state模块?

  • 远程执行是salt的核心所在。
  • 管理员可以通过执行远程执行模块,达到对minion的控制(如cmd.run "yum install -y httpd")。但对于minion的环境或者状态控制,即你想让minion达到一个什么样的状态,用state模块更便利。 只需要描述想让salt minion达到什么状态即可,执行部分由state模块完成。

远程执行&&State模块:

  • 区别:执行模块是过程式,连续调用时将执行相同的逻辑和指令;状态模块为描述性的,它们只是执行必要的工作,在minion上根据描述文件达到指定的状态。
  • 所有的state模块都会遵循这个原则,只在检测到真实状态和所需状态不同的情况下才执行功能。这可以通过判断来让minion以最小的代价进入指定的状态。

State 配置文件(sls)


SLS配置文件使用 YAML 语言描述。Salt默认的sls文件的renderer是 YAML renderer,它的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。

重要的三个规则:

  • 缩进:用两个空格,不要使用 tab 键。
  • 冒号:与Python的映射如下:
## YAML
my_key: my_value
## python
{'my_key': 'my_value'}

## YAML
my_key1: my_key2:my_value
## python
{'my_key': {
    'my_key2': 'my_value'
    
    }
    
}

  • 短横杠:用一个短横杠加一个空格来表示列表项(Python中的列表[])
keys:
  - value1
  - value2
  - value3
## 映射为Python:
{'key':['value1','value2','value3']

State文件的格式:

<ID Declaration>:
  <State Module>.<Function>:
    - name: <name>
    - <Function Arg>
    - <Function Arg>
    - <Function Arg>
    - <Requisite Declaration>:
      - <Requisite Reference>

## 下面列举写法:

<ID Declaration>:
  <State Module>.<Function>:
    - <Function Arg>
    - <Function Arg>
    - <Function Arg>
    - <Names>:
      - <name>
      - <name>
      - <name>
    - <Requisite Declaration>:
      - <Requisite Reference>
      - <Requisite Reference>

State sls配置文件中:

  • <ID Declaration>必须是独一无二的有效的Python字符串,自定义的。
  • <State Module>.<Function>与远程执行命令采用相同格式,但是具体支持的模块和函数与远程执行的模块和函数有差异,可分别通过sys.list_state_modules、sys.list_state_functions 查看,远程对应的则是sys.list_modules、sys.list_functions。
  • 最后是函数参数,首个函数参数通常是name,然后是状态所需的其他参数。具体用法可参考sys.state_doc.

实践案例


  • 配置windows防火墙

conf-firewall.sls

configure-firewall:
  win_firewall.disabled:
    - name: allprofiles

实践效果: image.png

执行前,私有网络和共有网络防火墙为开启状态;state执行后,变成关闭状态。

  • 管理windows服务

conf-services.sls

#启用开机自启
enable-boot-services:
  service.enabled:
   - name: w32Time
#禁用开机自启
#disable-boot-services:
#  service.disabled:
#    - name: w32Time 
#启服
#start-services:
#  service.running:
#    - names:
#      - w32Time
#      - wuauserv
#停服   
stop-services:
  service.dead:
    - names:
      - w32Time
      - wuauserv
 

实践效果:

执行前:

image.png

执行后: 两个服务均被停止运行,且w32Time被设置为开机自启动。

image.png

  • 执行ps脚本【以服务器封网为例】

conf-gateway.sls

clear-gateway:
  cmd.script:
    - name: set_netroute.ps1
    - source: salt://scripts/Deny_Server_Access_InterNet/set_netroute.ps1
    - shell: powershell

执行前:

image.png

执行后: 缺省网关被删除。

image.png

  • 启用RDP远程桌面

conf-rdp.sls

configure-rdp:
  rdp.enabled

实践效果:

image.png