saltstack通过state模块定义主机状态

一、state的概念以及撰写第一条状态

状态是对minion的一种描述和定义,管理人员可以不关心具体部署任务是如何完成的,只需要描述minion要到达什么状态,底层由Salt的状态模块来完成功能。
比如我们想在所有minion主机上部署Apache,可以用过程式的方法完成:

[root@29-server]# salt "*" pkg.install httpd
minion-one:
    ----------
    apr:
        ----------
        new:
            1.4.8-3.el7_4.1
        old:
    apr-util:
        ----------
        new:
            1.5.2-6.el7
        old:
    httpd:
        ----------
        new:
            2.4.6-89.el7.centos.1
        old:
    httpd-tools:
        ----------
        new:
            2.4.6-89.el7.centos.1
        old:

下面利用state模块完成部署apache:

首先删除上面安装的apache,并创建目录:
[root@29-server ~]# salt "*" pkg.remove httpd
minion-one:
    ----------
    httpd:
        ----------
        new:
        old:
            2.4.6-89.el7.centos.1
            
[root@29-server ~]# mkdir -p /srv/salt/
[root@29-server ~]# cd /srv/salt/

然后建立apache.sls文件:
[root@29-server salt]# cat apache.sls 
install_apache:
  pkg.installed:
    - name: httpd
    

执行以下命令:
[root@29-server salt]# salt "*" state.sls apache
minion-one:
----------
          ID: install_apache
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: The following packages were installed/updated: httpd
     Started: 10:05:57.431330
    Duration: 25387.143 ms
     Changes:   
              ----------
              httpd:
                  ----------
                  new:
                      2.4.6-89.el7.centos.1
                  old:

Summary for minion-one
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  25.387 s

在执行一次:
[root@29-server salt]# salt "*" state.sls apache
minion-one:
----------
          ID: install_apache
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 10:07:34.892568
    Duration: 2866.866 ms
     Changes:   

Summary for minion-one
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time:   2.867 s

从返回结果可以看出httpd软件已经安装过了,如果多次运行上面的命令会得到相同的结果。这就表明了执行模块和状态模块之间的主要区别——执行模块是过程式的,而状态模块则是描述性的。这是什么意思呢?当你连续几次调用同一个执行模块时,实际上将执行相同的逻辑和指令。而状态模块则恰恰相反,状态模块设计为描述性的,它们只是执行必要的工作,在目标minion上创建根据描述文件指定的状态。

二、状态配置文件的各个要素

1.salt sls文件使用语言及规则

Salt默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。只要记住三个非常简单的规则就可以使用YAML语法写SLS文件了。

(1).缩进:不能使用tab,每个缩进级别必须由两个空格组成。
(2).冒号:在每个冒号后边需要加一个空格。
(3).用一个短横杠加一个空格来表示列表项。多个项使用同样的缩进级别作为同一列表的一部分。

2.salt sls文件格式

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

每个状态的 字符串必须独一无二。可以包含 字母、数字、空格和下画线,只需要是一个有效的Python字符串,ID尽量保持简洁明了。.< Function>: 远程执行的状态模块命令。

最后是函数参数。首个参数通常是name,然后是状态所需的其他参数。这里的不同点是所有使用的模块都是状态模块而不是普通的远程执行模块。

三、常用的状态模块用法

获取所有状态模块以及某个模块所有函数的命令:

[root@29-server ~]# salt "*" sys.list_state_modules
[root@29-server ~]# salt "*" sys.list_state_functions pkg
[root@29-server ~]#salt "minion-one" sys.state_doc cmd.run

1.file模块

file.managed    下发文件,确保文件存在  
file.directory  建立目录  
file.symlink    建立软连接  
file.recurse    下发整个目录
file.directory  创建目录
file.tidied:    查找匹配的文件或目录删除,如果没有不做操作
    - name: {{tomcat_dir}}/webapps/
    - rmdirs: True
    - matches:
      - gcreport
      - gcreport.war

四、使用requisites对状态进行排序

require:本state执行时需要先执行那些state
require_in:与require位置相反
watch:除了require外,也会监测依赖的state的状态,如果状态发生变化,做出反应(例如监控文件变化,发生变化后立即重启服务)
watch_in: 与watch位置相反
prereq:0.16.0 新增的功能,会通过test=True接口检查所依赖的state的状态,如果状态发生变化,执行
prereq_in:相反

原文地址:https://www.cnblogs.com/wangyajian/p/11633678.html