在上一节的《Saltstack入门到精通教程(二):实验环境搭建和体验》中,我们通过实验环境的操作,熟悉了如何去写一个简单的state文件,如何在命令行去应用state文件,以及如何利用top文件去对不同的minion去应用不同的state文件。这一节我们基于这些基础进一步来探索配置管理中的更多的功能。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
state函数
书写格式
在上一节中,我们简单创建了一个states的sls文件,并且用它改变了其中一个minion的配置。我们再来回顾一下我们创建的nettools.sls
文件
install_network_packages:
pkg.installed:
- pkgs:
- rsync
- lftp
- curl
这里使用的是YAML格式,是一种比JSON还要更友好的结构语句。我们将上面这6行文字大致对应到下面的这个格式里面来
ID:
module.function:
- name: name
- argument: value
- argument:
- value1
- value2
ID: 用来描述这个state的字符串,可以带空格和数字,但必须要唯一,后面接一个冒号。
module.function: 每一个函数调用都在ID
的基础上缩进两个空格(注意不能用tab),后面接一个冒号。需要调用的state模块可以在官方state模块列表中查找到,也就是那些名字为salt.states.*
的模块。例如上面这个例子用到的就是salt.states.pkg
,点进去模块就会看到很多个函数。上面提到的官方文档会有函数的功能描述,参数详解和使用范例,对于大多数用户来说是够用了。如果想要查看具体的函数源码,可以到salt的github仓库查看,和states有关的模块在salt/salt/states
中,这里使用的是salt/salt/states/pkg.py
模块中定义的installed
函数。
name:参数列表是一个list数据类型,在YAML中由短线表示每个元素,并且要缩进两个空格。name是一个比较特殊的函数参数,大多数的函数都用name来表示比较核心的参数,例如安装包函数的包名,启动进程的进程名,添加用户的用户名等。所以很少有name参数省略的情况,如果name参数省略,那么要么有别的参数代替了它的功能,或者ID被默认赋值给name。像上面这个例子,如果查阅参数详解就能看到,在pkgs
这个参数存在的情况下,name可以忽略。
argument:如果参数的值只有一个,直接写到同一行即可,中间由冒号和空格隔开。如果参数也是一个list,那么参数从下一行开始,并且有两个空格的缩进,正如上面的例子所展示的那样。
几个例子
还是采用前一节搭建的测试环境。直接在本地的salt-vagrant-demo-master/saltstack/salt
目录里面添加example.sls
文件,vagrant会自动将其映射到saltmaster的/srv/salt
目录中。通过几个例子来演示下如何去使用state的函数,具体函数不重要,主要是如何去查找函数的思路。
- 安装软件
如同上面讲解的那样,在调用pkg.installed
的时候,不仅可以用pkgs
这个参数,还可以用name
来表示待安装的包,只不过name
后面只能接单个参数。例如
install curl:
pkg.installed:
- name: curl
对minion2运行一下
root@saltmaster:/srv/salt# salt minion2 state.apply example
结果如下
minion2:
----------
ID: install curl
Function: pkg.installed
Name: curl
Result: True
Comment: All specified packages are already installed
Started: 09:03:57.208930
Duration: 98.343 ms
Changes:
Summary for minion2
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 98.343 ms
- 删除软件
在salt.states.pkg
中查找,发现有purged
和removed
两个函数。熟悉ubuntu的朋友应该知道这两者的差别,前者完全删除,后者会保留一些配置文件便于误删恢复。我们选择removed
这个函数。
这里会发现函数名都是英文中的过去式,很有意思,而这也正是state的含义所在。state文件定义了一种状态,minion会针对这个状态进行自检,如果不符合这个状态就进行配置修改,如果符合就维持原状。
查看函数的说明,和installed
差不多,name
参数接一个包名,或者pkgs
参数接一个python的list。构建example.sls
文件如下
remove curl:
pkg.removed:
- name: curl
对minion2运行一下
root@saltmaster:/srv/salt# salt minion2 state.apply example
结果如下
minion2:
----------
ID: remove curl
Function: pkg.removed
Name: curl
Result: True
Comment: All targeted packages were removed.
Started: 10:20:15.377807
Duration: 5715.589 ms
Changes:
----------
curl:
----------
new:
old:
7.58.0-2ubuntu3.8
pollinate:
----------
new:
old:
4.33-0ubuntu1~18.04.1
ubuntu-server:
----------
new:
old:
1.417.3
Summary for minion2
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 5.716 s
- 创建目录
在上面的函数列表中并没有发现salt.states.directory
这个模块,但是找到了salt.states.file
。阅读模块说明发现这个模块不仅可以针对文件,也可以对目录进行操作。
SALT.STATES.FILE
OPERATIONS ON REGULAR FILES, SPECIAL FILES, DIRECTORIES, AND SYMLINKS
发现了其中的salt.states.file.directory
函数,刚好就是我们所需要的创建文件夹的功能。如果文件夹不存在就创