配置管理篇(1)_SaltStack常用可执行模块(execution modules)及解决rm -f带来的困惑

前言

所有的可执行模块(execution modules)可以查看官方文档,记录下我常用到的模块teststatuscmdmoduseraddsystemsystemdfile和解决rm -f带来困惑的方法。使用方法除了查看官方文档和手册外,查看源代码(源代码中也详细描述了使用方法和示例)也是一个好的方法。

test

test模块提供对minion端有限项的任意测试,常见的有ping、echo、version等,
源码在minion端/usr/lib/python2.6/site-packages/salt/modules/test.py,详细的使用方法查源码最直接了。

1
2
3
4
5
6
7
8
9
$ salt minion01 test.ping 
minion01:
True
$ salt minion01 test.echo 'hello world'
minion01:
hello world
$ salt minion01 test.version
minion01:
2014.1.10
status

status可以查看minion的基本状态如CPU、内存、硬盘、网络等,常见的有all_status、uptime、w、netstats等,
源码在minion端/usr/lib/python2.6/site-packages/salt/modules/status.py
对于all_status方法查看源码可以看到这个版本支持的可查询状态有cpuinfo、cpustatus、… …等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def all_status(): 
... ... ...
return {
'cpuinfo': cpuinfo(),
'cpustats': cpustats(),
'diskstats': diskstats(),
'diskusage': diskusage(),
'loadavg': loadavg(),
'meminfo': meminfo(),
'netdev': netdev(),
'netstats': netstats(),
'uptime': uptime(),
'vmstats': vmstats(),
'w': w()
}
```

使用方法很简单,例如:

``` bash
$ salt minion01 status.uptime
minion01:
14:27:49 up 4:43, 1 user, load average: 0.00, 0.00, 0.00
cmdmod与cmd

cmd这个模块中的run可以执行在bash里执行的所有命令,很强大但是也得注意在run中执行类似rm这样的命令是很危险的。
源码位置在minion端的/usr/lib/python2.6/site-packages/salt/modules/cmdmod.py
cmd.run执行命令就像在minion端本地执行命令一样亲切。

1
2
3
4
5
6
$ salt minion01 cmd.run 'df -hT' 
minion01:
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.5G 15G 15% /
tmpfs tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 ext4 504M 39M 440M 9% /boot

亲切的同时也会带来困惑,如果误操作是这样的,后果很可怕。

1
$ salt \* cmd.run "rm -rf /"

可以修改源代码禁止执行rm这种较危险的命令,打开minion端的文件
/usr/lib/python2.6/site-packages/salt/modules/cmdmod.py
找到run()函数,在其调用_run()函数的时候判断参数cmd中是否包含rm命令,如果包含了就返回并提示”rm命令很危险,任务执行失败”,这样一来master上cmd.run就不能执行rm命令了。

1
2
3
4
5
6
7
8
9
10
''' 
... ... ...
salt '*' cmd.run "grep f" stdin='one\\ntwo\\nthree\\nfour\\nfive\\n
'''
#在以下位置添加代码
if r'rm ' in cmd:
return "'rm' is dangerous!!! MISSION FAILED!!!"
#在以上位置添加代码
ret = _run(cmd,
... ... ...

修改文件后重启minion后生效,测试下效果

1
2
3
$ salt minion01 cmd.run "rm -rf /" 
minion01:
'rm' is dangerous!!! MISSION FAILED!!!

可以看出修改已经生效,再也不用担心cmd.run误操作了。不过有个问题就是,在cmdmod模块中不仅cmd.run可以执行rm命令还有cmd.run_all、cmd.run_stdout等都可以执行rm命令,为了更彻底的封掉rm这个命名,仔细看了下代码发现它们最终都是调用的_run()来完成任务的,可以修改_run()这个函数(在/usr/lib/python2.6/site-packages/salt/modules/cmdmod.py文件第213行)来彻底的封掉rm这个命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
''' 
... ... ...
Do the DRY thing and only call subprocess.Popen() once
'''
#在以下位置添加代码
if r'rm ' in cmd:
ret = {}
ret['stdout'] = "'rm' is dangerous!!! MISSION FAILED!!!"
ret['stderr'] = ''
ret['pid'] = ''
ret['retcode'] = 0
return ret
#在以上位置添加代码
if salt.utils.is_true(quiet):
... ... ...

如果是修改_run()函数后就不用修改run()等其它函数了,修改文件后重启minion后生效,测试下效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ salt minion01 cmd.run "rm -rf /" 
minion01:
'rm' is dangerous!!! MISSION FAILED!!!
$ salt minion01 cmd.run_all "rm -f test"
minion01:
----------
pid:

retcode:
0
stderr:

stdout:
'rm' is dangerous!!! MISSION FAILED!!!

将修改过的salt-minion打成rpm包后放到本地的yum源,然后重新安装所有的minion端就可以解决rm带来的困惑了。

useradd

这个模块主是用来用户管理的,源文件位置在minion端(下同)
/usr/lib/python2.6/site-packages/salt/modules/useradd.py,记录几个常用的。
user.add添加新用户

1
2
3
$ salt minion01 user.add testuser 
minion01:
True

user.list_users列出所有的用户,可以看到刚才添加的用户

1
2
$ salt minion01 user.list_users | grep testuser 
- testuser

user.info查看用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ salt minion01 user.info testuser 
minion01:
----------
fullname:

gid:
500
groups:
- testuser
home:
/home/testuser
homephone:

name:
testuser
passwd:
x
roomnumber:

shell:
/bin/bash
uid:
500
workphone:

user模块还有很多可用的方法,可以根据名称就可以知道其功能了比如

1
2
3
4
5
6
7
8
9
10
user.getent 
user.delete name remove=True force=True
user.chworkphone foo "7735550123"
user.chuid foo 4376
user.chshell foo /bin/zsh
user.chroomnumber foo 123
user.chfullname foo "Foo Bar"
user.chgid foo 4376
user.chgroups foo wheel,root True
user.chhome foo /home/users/foo True
system

系统管理模块,能看懂的就不记录了。
源码位置/usr/lib/python2.6/site-packages/salt/modules/system.py

1
2
3
4
5
system.halt #停止正在运行的系统 
system.init 3 #切换到字符界面,5是图形界面
system.poweroff
system.reboot
system.shutdown
systemd

系统服务管理模块,
源码位置/usr/lib/python2.6/site-packages/salt/modules/systemd.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
service.available sshd #查看服务是否可用 
service.disable <service name> #设置开机启动的服务
service.enable <service name>
service.disabled <service name> #查看服务是不是开机启动
service.enabled <service name>
service.get_disabled #返回所有关闭的服务
service.get_enabled #返回所有开启的服务
service.get_all #返回所有服务
service.reload <service name> #重新载入指定的服务
service.restart <service name> #重启服务
service.start <service name>
service.stop <service name>
service.status <service name>
service.force_reload <service name> #强制载入指定的服务
file

文件管理模块,这个模块的方法太多,非常强大,选些常用的记一下。
源文件/usr/lib/python2.6/site-packages/salt/modules/file.py中有所有方法的功能和使用说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
file.copy /path/to/src /path/to/dst #将master文件拷贝到minion上,salt还有个专门的拷文件的命令salt-cp 
file.append /etc/motd "append test." #为minion的文件/etc/moth追加内容
file.check_hash /etc/fstab md5=<md5sum> #检测并对比文件的md5值,并返回布尔值
file.get_hash /etc/passwd #获取文件的md5值
file.check_perms /etc/sudoers '{}' root root 400 #检测并更改文件的用户、组、权限
file.chgrp /etc/passwd root
file.chown /etc/passwd root root
file.directory_exists /tmp #检测文件夹是否存在
file.file_exists /etc/passwd
file.get_group /etc/passwd
file.get_user /etc/passwd
file.get_mode /etc/passwd #检测文件权限
file.set_mode /etc/passwd 0644 #设置权限
file.get_gid /etc/passwd
file.get_uid /etc/passwd
----------------本文结束 感谢阅读----------------