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

所有的可执行模块(execution modules)可以查看官方文档,记录下我常用到的模块test、status、cmdmod、useradd、system、systemd、file和解决rm -f带来困惑的方法。使用方法除了查看官方文档和手册外,查看源代码(源代码中也详细描述了使用方法和示例)也是一个好的方法。
1、test
test模块提供对minion端有限项的任意测试,常见的有ping、echo、version等,源码在minion端/usr/lib/python2.6/site-packages/salt/modules/test.py,详细的使用方法查源码最直接了。

[root@saltstack ~]# salt minion01 test.ping
minion01:
    True
[root@saltstack ~]# salt minion01 test.echo 'hello world'
minion01:
    hello world
[root@saltstack ~]# salt minion01 test.version
minion01:
    2014.1.10
[root@saltstack ~]#

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

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()}

使用方法很简单,例如:

[root@saltstack ~]# salt minion01 status.uptime
minion01:
     14:27:49 up  4:43,  1 user,  load average: 0.00, 0.00, 0.00
[root@saltstack ~]#

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

[root@saltstack ~]# 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
[root@saltstack ~]#

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

[root@saltstack ~]# 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命令了。

    '''
    ... ... ...
         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后生效,测试下效果

[root@saltstack ~]# salt minion01 cmd.run "rm -rf /"
minion01:
    'rm' is dangerous!!!  MISSION FAILED!!!
[root@saltstack ~]#

可以看出修改已经生效,再也不用担心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这个命令。

'''
    ... ... ...
    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后生效,测试下效果

[root@saltstack ~]# salt minion01 cmd.run "rm -rf /"
minion01:
    'rm' is dangerous!!!  MISSION FAILED!!!
[root@saltstack ~]# 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带来的困惑了。

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

[root@saltstack ~]# salt minion01 user.add testuser
minion01:
    True

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

[root@saltstack ~]# salt minion01 user.list_users | grep testuser
    - testuser
[root@saltstack ~]#

user.info查看用户信息

[root@saltstack ~]# 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模块还有很多可用的方法,可以根据名称就可以知道其功能了比如

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

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

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

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

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>  #强制载入指定的服务

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

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

转载请注明出处:http://www.xiaomastack.com/2014/10/16/saltstack01/ 谢谢!

5 Comments

 Add your comment
  1. 禁用命令的,正好适合新手学习。谢谢了

  2. 大牛,您好,请问下您文章中提到的将修改过的salt-minion重新打包成RPM包,能否说下这个如何操作?也就是如何将通过yum安装的软件重新再打包,这个我百度了好久也没有找到,目前只知道使用rpm-build这个工具进行打包。
    我通过rpm -ql命令查了下salt-minion,发现提到的py文件并不是在这个RPM包中,通过命令发现是在salt这个RPM包中,更改完py的代码,是否应该是重新打包salt?
    请问您是否有其他的联系方式,想请教下您,谢谢。

  3. 嗯,salt的核心代码都在salt包里面。重新打包rpm我了解的有2种简单的方法:
    1、用rpmbuild,这个编译配置较复杂,可以在网上找rpm的源码包,拉下来直接改代码再build即可。类似http://rpmfind.net/ 这类网站就有这样的rpm源码包。
    2、用fpm制作rpm包,将改过后的代码打成rpm包,配置非常简单。

  4. 感谢您提供思路,按照方法1已经成功了,在官方有.src.rpm的源码包,直接通过源码包修改py文件,然后再打成RPM包就可以了,替换了自己搭建的YUM源中的文件,然后安装salt测试了下,是修改源码后的salt。
    顺便百度了下fpm制作rpm包,比用rpmbuild简单,又学到了新工具。
    再次感谢大牛!
    总结下:
    针对于这种更改已有rpm源码并重新打包的情况,用方法1是最好的,因为文件释放等操作非常多,目录结构也复杂,有现成的spec,直接打包即可,不用关心里面的操作,和原RPM包可以保持一致。
    如是自己打包单独的程序源码成RPM,则采用fpm打包相对简单一些,或使用rpmbuild自己写spec文件,定义一系列操作。

  5. 总结很好:)

发表评论:

你的电子邮件地址将不会被公开.

70 − = 62