SaltStack系列(二)之常用模块
一、saltstack的内置模块汇总
acl, aliases, alternatives, apache, archive, artifactory, blockdev, btrfs, buildout,
cloud, cmd, composer, config, container_resource, cp, cron, data, defaults,
devmap, dig, disk, django, dnsmasq, dnsutil, drbd, elasticsearch, environ,
etcd, event, extfs, file, gem, genesis, git, grains, group, grub, hashutil,
hg, hipchat, hosts, http, img, incron, ini, introspect, ip, iptables, jboss7,
jboss7_cli, key, kmod, locale, locate, logrotate, lowpkg, match, mine,
modjk, mount, network, openstack_config, pagerduty, pillar, pip, pkg,
pkg_resource, postfix, publish, puppet, pyenv, raid, random, random_org,
rbenv, ret, rsync, runit, rvm, s3, saltutil, schedule, scsi, sdb, seed,
selinux, serverdensity_device, service, shadow, slack, smtp, sqlite3, ssh,
state, status, supervisord, sys, sysctl, syslog_ng, system, test, timezone,
user, vbox_guest, virtualenv, webutil, xfs
二、saltstack常用模块介绍
这里重点是要将经常用到的模块记录的用法记录下来,我们直接在master端用#salt命令可以做一些简单的操作,也为做.sls文件打基础。
2.1 cmd模块的常用使用方法:
# salt 'agent1.salt' sys.doc cmd #可以看cmd模块都有哪些使用方法,这里只列举常用的。
2.1.1 cmd.has_exec的用法(如果可执行文件在minion上可用,则返回true,否则返回false)
例子:
# salt '*' cmd.has_exec ifconfig #这里只能是单个命令,如果你用'ip addr'这种形式的话,肯定返回的是False.
2.1.2 cmd.retcode的用法(在minion端执行一个shell命令并返回命令的返回码。0表示成功,0以外表示失败有问题。)
例子:
# salt '*' cmd.retcode 'ls -l /etc/hostname' #如我们可以查看一个文件是否存在根据返回码来判断,或者执行一个脚本等,''里面就是你要执行的命令。正好跟cmd.has_exec相反
2.1.3 cmd.run的用法(这个执行shell命令跟cmd.retcode类似,但是不同的是,cmd.run就像再本地执行一样。cmd.run_stderr意思只会在出问题的时候返回信息。)
2.1.4 cmd.script和cmd.script_retcode(从远程salt服务器或者ftp服务器或者http服务器下载脚本到本地执行):
例子(这里就引用man中的例子):
#salt '*' cmd.script salt://scripts/runme.sh
#salt '*' cmd.script salt://scripts/runme.sh 'arg1 arg2 "arg 3"'
2.1.5 cmd.shell和cmd.shells(cmd.shell跟cmd.run一样,一般用cmd.run,cmd.shells是通过/ etc / shells文件列出此系统上的有效shell):
例子(这个基本也用不到也是引用man中的例子):
# salt '*' cmd.shells
2.1.6 cmd.which和cmd.which_bin的用法(就是查找执行文件所在的位置,which命令嘛都不陌生)
例子:
# salt '*' cmd.which ifconfig #查看节点所有ifconfig命令的位置,在写脚本或者定时任务的时候很有用,因为系统不同执行文件的绝对路径也不通。# salt '*' cmd.run "which ifconfig"一个效果。
# salt '*' cmd.which_bin '[cat, ifconfig, touch]' #这是定义了一个列表,返回在命令列表中找到的第一个命令。
2.2 cp模块的常用使用方法
# salt 'agent1.salt' sys.doc cp #只列举一些常用的,详细的可以自行执行此命令查看
2.2.1 cp.get_dir和cp.get_file的用法(就是从master端cp目录或者文件到minion端的目录,get_dir支持与get_file相同的模板和gzip参数。对应的是cp.push:,cp.push_dir:,就是把客户端的文件或者目录推送到master端的cachedir,默认为/var/cache/salt/master/minions/minion-id/files,但是这种用法是禁用状态,一般不让minion端的文件或目录发送到master端,这里只是记录一下有这种用法。)
例子:
#salt '*' cp.get_dir salt://path/to/dir/ /minion/dest #从salt master递归复制目录到minion客户端的/minion/dest目录下面。
#salt '*' cp.get_file salt://path/to/file /minion/dest #从服务端拷贝单个文件到minion端的/minion/dest目录下面。
#salt '*' cp.get_file "salt://{{grains.os}}/vimrc" /etc/vimrc template=jinja #所有Salt minions从与其os粒度相同名称的目录下载vimrc,并将其复制到/etc/vimrc
2.2.2 cp.get_url(用于从URL获取单个文件)
例子:
# salt '*' cp.get_url salt://cptest1/cptest1file /tmp/test #将salt://cptest1/cptest1file文件里面的内容写入到/tmp/test文件里面,每次都会覆盖里面的内容。这种就跟cp.get_file一样。
# salt '*' cp.get_url http://www.51niux.com/?id=116 /tmp/test #如这种就把一个页面的html信息写入到了客户端的/tmp/test文件,切记只能是这种文本形式的文件,不要是压缩包啥的。
# salt '*' cp.get_url http://www.51niux.com/zb_users/upload/2017/03/201703091489030442220789.txt /tmp/load_one_check.sh #最主要的用法还是这种,我们可以以httpd的形式去下载一个sh脚本啊,config文件啊等。
# salt '*' cmd.run " cat /tmp/load_one_check.sh" #下面是部分内容,这样我们很多文本类的文件就不用从salt服务端发布了,直接做个ftp服务或者http服务来发布文本类的东西什么的就可以了。当然cmd.run命令也可以了......
agent1.salt:
#!/bin/bash
# ========================================================================================
# System loadavg plugin for Nagios
#
# Written by : chaishao
# From : 51niux.com
# Release : 1.1.0
# Creation date : 2017-03-08
# Revision date : 2017-03-08
# Description : Nagios plugin (script) to check system load_one .
# This script has been designed and written on Linux System.
#
# USAGE : ./$PROGNAME [-w -c]
#
# Exemple: : ./$PROGNAME -w n1 -c n2
# ========================================================================================
2.2.3 cp.list_master和cp.list_master_dirs的用法(这个就是查看salt master本地的file服务器又哪些文件或者目录)
例子:
# salt 'agent1.salt' cp.list_master #这种就不要指定所有机器了,匹配一台机器就可以了,列出存储在主机上的所有文件。
# salt 'agent1.salt' cp.list_master_dirs #列出存储在master主机上面的所有目录。
2.3 file模块的常用使用方法
2.3.1 file.access的用法(f代表存在,rwx分别代表读、写、执行权限)还有file.file_exists、file.get_mode和file.stats的用法。
例子:
# salt '*' file.access /opt/check.sh f #查看/opt/check.sh文件是否存在,这个挺有用的,我们查看某个脚本或者某个文件是否存在。
#上面的例子也可以写成这种:#salt '*' file.file_exists /opt/check.sh (文件存在就返回True,否则返回False)
# salt '*' file.access /opt/check.sh x #如果有此脚本之后,我们还可以查看此脚本是否具有执行权限,f、r、w、x,只能写一种,真就返回true,否则false。
# salt '*' file.get_mode /etc/passwd #file.get_mode后面指定目录或者文件,可以查看其授权情况,如文件一般是0644,如果文件或目录不存在无信息(当然还有:file.is_blkdev检查文件是否存在并且是块设备,file.is_chrdev检查文件是否存在并且是字符设备,file.is_fifo检查文件是否存在并且是FIFO,file.is_link检查路径是否是符号链接)
# salt '*' file.stats /etc/passwd #file.stats返回一个文件或目录的统计信息,这里是返回/etc/passwd文件的统计信息(类型,时间,属组,权限等)。
2.3.2 file.append和file.write的用法(前者将内容追加到文件的末尾,后者是直接覆盖类似于echo >,但是格式跟前者一样。)
例子:
第一组:单引号和双引号的区别,还有!需要注意的地方:
# salt '*' file.append /tmp/1 "`hostname` This is a good day\!" #用双引号,就是里面可以接变量,但是这个!需要注意,不用\转义的话会报错。
# salt '*' file.append /tmp/1 '`hostname` This is a good day!' #所以如果出现!最好放到单引号里面来引用,因为上面就算转义了也显示的不对。
第二组:换行符的使用
# salt '*' file.append /tmp/1 "Two""Two Two" #这表示两组字符串在一行,中间默认加个空格隔开。
# salt '*' file.append /tmp/1 "Two" "Two Two" #这表示两组字符串是换行的。
#上面的截图为,两组测试结果,可以明显的比较出差别。
第三组:!是不知道怎么解决了,要么就放单引号。还有个=是需要注意的,有个args用法,以及[]外面加不加双引号的区别。
# salt '*' file.append /tmp/1 args='Hostname=`hostname`' #如果字符串里面有等号要用这种args的用法。
# salt '*' file.append /tmp/1 args="Hostname=`hostname`" #atgs用单引号和双引号的区别就在于里面的变量是否解析为变量的值还是字符串。
# salt '*' file.append /tmp/1 args=['Hostname=`hostname`''rel=`cat /etc/redhat-release`'] #这里就是定义一个并排的两个字符串
# salt '*' file.append /tmp/1 args=['Hostname=`hostname`','rel=`cat /etc/redhat-release`'] #可见args默认是单引号的形式,两组字符串中间加逗号。
# salt '*' file.append /tmp/1 args="['Hostname=`hostname`','rel=`cat /etc/redhat-release`']" #双引号不是默认的,所以要单独的加上。
#从结果我们可以看出,两个字符串之间如果没有逗号的话,不换行,但是中间也没有分隔,可以学习awk,在两个字符串中间加" "来进行添加空格的操作。
其实主要还是字符串里面有=就用args的形式,如果是多组字符串可以用[]的形式,如果要是用变量就用双引号的形式,默认是单引号的形式。
2.3.3 file.chgrp、file.chown和file.set_mode用法(前者是更改文件的属组,中者是更改文件数的属主属组,后者是更改文件或目录的权限)
例子:
# salt '*' file.chgrp /tmp/1 test9 #将minion端的/tmp/1文件更改用户组为test9,如果客户端有此用户组则返回None,没有此用户组则返回用户组不存在
# salt '*' file.chown /tmp/1 test7 test9 #第一个是用户,第二个是用户组,固定格式必须存在,将/tmp/1的用户组设置为test7,用户组设置为test9.
# salt '*' file.set_mode /opt/cs 0550 #设置/opt/cs目录权限为0550,如果授权成功会显示授权后的权限,如果没有此文件或目录会提示
2.3.4 file.comment和file.comment_line的用法(注释指定内容的行,每次操作前都会更新文件名命令的.bak备份文件)
例子:
# salt '*' file.comment /tmp/passwd ftp #这就是将以/tmp/passwd文件以ftp开头的行注释掉,如果注释会显示注释行的信息,如果没注释则返回False
# salt '*' file.comment /tmp/passwd ftp.*nologin$ #另外还支持正则表达式,这里就表示以ftp开头以nologin结尾的行。多行注释
# salt '*' file.comment /tmp/passwd ftp.*nologin$ '-' #后面可以指定在行开头加什么字符,当然默认是#,前面也可以这样后面指定要行头添加的字符。
2.3.5 file.copy用法(复制文件或目录到指定的目录下面,成功返回True,失败会有提示的。另外还有file.move,移动文件的用法。)
例子:(引用man帮助)
#salt '*' file.copy /path/to/src /path/to/dst #这里是文件拷贝,将文件/path/to/src拷贝到/path/to/目录下面,其名称为dst,切记这里一定要是文件名。
目录复制的区别看下面的例子(#复制目录的话,要加recurse=True递归标记):
# salt '*' file.copy /opt/file2 /tmp/haha/ recurse=True #这种不管时/tmp/haha/还是/tmp/haha,如果这个haha存在的话,就是将/opt/file2下面的内容cp -r拷贝到/tmp/haha目录下面,如果haha目录不存在的话,就是将/opt/file2目录变为/tmp/haha目录。
# salt '*' file.copy /opt/file2 /tmp/haha/file2 recurse=True #这种才是正确的将/opt/file2目录复制到/tmp/haha/目录下方。如haha目录不存在会创建
#salt '*' file.copy /path/to/src_dir /path/to/dst_dir recurse=True remove_existing=True #remove_existing=True 这种就是完全覆盖的形式。
2.3.6 'file.directory_exists和file.dirname的用法(前者检查一个目录是否存在,后者取文件的路径)
例子:
# salt '*' file.directory_exists /tmp/haha/file2 #/tmp/haha/file目录存在就会返回True,不存在就会返回False
# salt '*' file.dirname '/opt/file2/' #取出来的结果是/opt/file2,这就是末尾加/,认为这两个都是目录,当然不管是否有这个目录
# salt '*' file.dirname '/opt/file2/test1' #取出来的结果是/opt/file2
2.3.7 file.find方法(类似于linux下面的find命令)
例子(man的例子):
#salt '*' file.find / type=f name=\*.bak size=+10m #查找/目录下,文件类型为文件的(a:所有文件类型,b:块设备 ,c:字符设备,d:目录, p:FIFO(命名管道), f:普通文件 ,l:符号链接 ,s:套接字),名称为.bak结尾的(这里支持正则表达式),大小大于10MB的文件(b:字节,k:千字节,m:兆字节,g:GB,t:太字节也是TB)。
#salt '*' file.find /var mtime=+30d size=+10m print=path,size,mtime #这里是查找/var目录下,最后一次更改时间是30天以前(w:周,d:天,h:小时,
m:分钟,s:秒),大小大于10MB的文件,并打印文件的路径,大小,更改时间(可打印的内容有:group:组名,md5:文件内容的MD5摘要,mode:文件权限(以整数形式),mtime:最后修改时间,name:文件基础名称,path:文件绝对路径,size:文件大小(以字节为单位),type:文件类型,user:用户名)。
#salt '*' file.find /var/log name=\*.[0-9] mtime=+30d size=+10m delete #find的匹配条件有(name区分大小写,iname不区分大小写,type类型,user用户,group用户组,size[+-]大小,mtime修改时间,grep搜索文件内容),最后执行的动作除了delete和print,还有exec command。
2.3.8 file.get_gid、file.get_uid 和file.get_group、file.get_user的用法(前一组返回文件或目录的gid号和uid号,后一组返回文件或目录group和user)
例子(其他的就替换函数就可以了):
# salt '*' file.get_user /etc #查看/etc目录的属组,如果文件或目录不存在返回false。
# salt '*' file.get_uid /etc #查看/etc目录的属组的uid号。如果目录或者文件不存在返回-1.
2.3.9 file.grep的用法(类似于linux上面的grep命令)
例子:
# salt '*' file.grep /etc/passwd nobody #过滤/ect/passwd文件中包含nobody的行。(会输出:pid:是grep运行的pid号,retcode:为状态码,0是成功过滤1为非成功过滤,stderr:错误输出,stdout:正常输出也就是我们要过滤的内容。)
# salt '*' file.grep /etc/sysconfig/network-scripts/ifcfg-eth0 ipaddr " -i" #“-i”的目的是不区分大小写,注意-i前面有空格,额外的参数之间都有空格。
# salt '*' file.grep /etc/sysconfig/network-scripts/ifcfg-eth0 ipaddr " -i -B2 -A2" #-B2就是连上面两行也过滤出来,-A2就是连下两行也过滤出来。
2.3.10 file.link和file.symlink的用法(前者是创建文件的硬链接,后者是创建符号链接也就是软链接)
例子:
# salt '*' file.link /tmp/1 /tmp/2 #为/tmp/1创建一个硬链接是/tmp/2,只能是文件。
# salt '*' file.symlink /tmp/haha /tmp/buhaha #为/tmp/haha目录创建一个软链接/tmp/buhaha,成功返回Ture,失败有提示信息。
2.3.11 file.mkdir和file.makedirs方法(两种都是创建目录。前者对结尾的/不敏感,后者对/敏感)
# salt '*' file.mkdir /opt/cs/ds #这就是在/opt/目录下面创建cs目录,并在cs目录下面创建ds目录,如果cs目录不存在就创建。目录存不存在也不会有提示
# salt '*' file.makedirs /opt/cs/ds #这里只会创建/opt/cs目录,首先如果/opt要创建的目录是存在的会有提示,/opt/cs/ds/才会在cs目录下面创建ds目录
2.3.12 file.remove、file.rmdir和file.rename用法(前者是删除文件或者目录,中间是删除目录但是目录一定要为空、后者是重命名文件或目录)
例子:
# salt '*' file.remove /opt/cs/ #删除/opt目录下面的cs目录
# salt '*' file.rmdir /opt/cs #删除/opt/cs目录,如果cs目录下面有内容会提示目录不会空删除失败,如果为空则会执行并返回True
# salt '*' file.rename /opt/cs/ds /opt/cs/dss #更改/opt/cs目录下的ds目录为dss目录
2.3.13 file.touch和file.truncate的用法
例子:
# salt '*' file.touch /tmp/test1 #文件不存在则创建此文件,如果文件存在里面的内容不会发生变化,但是它的time信息会更新,上级目录必须存在。
# salt '*' file.truncate /tmp/passwd 3 #将/tmp/passwd 第三个字段以后的内容全删除掉了,就剩下了roo三个字段。
博文来自:www.51niux.com
2.4 hosts模块的常用使用方法
#salt '*' sys.doc hosts #通过这个命令可以查看详细用法,我们生产中如果没有用内建DNS服务,使用hosts模块修改/etc/hosts还是经常会用到的。
2.4.1 hosts.add_host、hosts.rm_host和hosts.set_host的用法(前者是追加,中着是删除、后者是覆盖)
例子:
#salt '*' hosts.add_host 192.168.1.113 foreman.puppet #hosts.add会先判断/etc/hosts里面有没有这个IP192.168.1.113,如果有foreman.puppet会将alias名追加到这个IP后面,跟之前的解析别名一起使用这个IP。
#salt '*' hosts.add_host 192.168.1.114 foreman.puppet #如果没有这个IP,则会新创建一行hosts记录,但是192.168.1.113那条还是存在的。两条记录
#salt '*' hosts.set_host 192.168.1.114 test.hahahah #hosts.set_host这个的不同之处就是,如果这个IP不存在则创建新的一条hosts记录,如果hosts存在这个IP的解析记录。会完全覆盖掉。也就是旧的IP解析记录完全变成现在的结果。
#salt '*' hosts.rm_host 192.168.1.114 test.haha #删除192.168.1.114 test.haha这条解析记录。如果192.168.1.114这行有多条解析记录,而只会删除test.haha这条记录,其他的192.168.1.114 xxx.xxx,还会存在不会删除,可以说是有选择性的删除。
2.4.2 其他查看hosts解析的用法
例子:
#salt '*' hosts.get_alias 192.168.1.114 #192.168.1.114这个IP对应的别名解析,如果有则返回对应的hosts别名解析记录。没有则什么都不返回。
# salt '*' hosts.get_ip wo.haha #这个就是返回wo.haha在/etc/hosts里面对应的IP,但是有个问题,如果有多条只会返回文件最上方的那一条对应的IP地址
# salt '*' hosts.has_pair 192.168.1.113 foreman.puppet #如果有这条别名解析记录,则返回True,如果没有则返回False。
# salt '*' hosts.list_hosts #类似于cat /etc/hosts的操作,但是不同的是,这相当于一个汇总,会以第一行是IP:下一行是其对应的别名解析的方式来呈现,比如一个IP有好几行的解析,这所有的解析记录都会汇总到这个IP下面,注释过的别名解析的行不会出现在这个汇总信息里面。
2.5 cron模块的常用使用方法
2.5.1 cron.raw_cron的用法(cron.list_tab和cron.ls和跟其效果一样,格式也一样必须要指定某一个用户,都是显示指定用户crontab文件里面的定时任务)
例子:
# salt '*' cron.raw_cron root #必须指定用户,这里是显示root的crontab文件里面的内容,注释的行也会显示
2.5.2 cron.set_job的用法(为指定用户设置一个定时任务)
例子:
# salt '*' cron.set_job root '0' '0' '*' '*' '*' '/bin/bash /opt/scripts/scp.sh >/dev/null 2>&1' #如果'/bin/bash /opt/scripts/scp.sh >/dev/null 2>&1'这一部分存在了,那么这一步操作就是update,也就是更新前面执行crontab的时间,如果不存在,这就相当于一条添加定时任务的操作返回内容为new。
2.5.3 cron.rm_job的用法(删除指定用户指定的的定时任务)
例子:
# salt '*' cron.rm_job root '/bin/bash /opt/scripts/scp.sh >/dev/null 2>&1' #注意格式是用户 后面跟要删除的任务,不要加前面的时间,成功会返回removed,如果没有这条记录会返回absent。
2.6 network模块的常用使用方法
例子:
#salt '*' network.get_hostname #返回minion的主机名
# salt '*' network.hw_addr eth0 #返回指定网络接口的mac地址
# salt '*' network.in_subnet 192.168.1.0/24 #查看主机在某个子网内就返回True,如果不在的话就返回False,多子网用空格隔开。
# salt '*' network.ip_addrs #查看minion端绑定的IP地址,多IP也会显示出来,127.0.0.1除外。(#salt '*' network.interfaces会显示所有接口的详细信息,但是别名的网卡类似于eth0:1这种不会显示。)
# salt '*' network.interface_ip eth0 #显示指定网卡接口上面的IP,只会显示IP不会显示其他内容。(network.interface会连网关子网掩码也显示)
# salt 'agent1.salt' network.mod_hostname test1.salt #修改某一个minion的主机名,显然这一步操作只适合在初始化的时候而且不适合执行所有主机。
# salt '*' network.ping www.baidu.com return_boolean=True timeout=3 #如果不加return_boolean=True显示的是ping的结果信息,加了就是如果ping通了就返回True,ping不通就返回False。timeout=3就是ping的时间,3秒超时这样能快速返回结果。这个其实挺好用的,比如我们可以测试哪些主机的DNS设置有问题不能正常解析啊,或者是我们内网DNS指向了一个非公网的域名解析,可以通过这个看哪些主机设置了内网DNS而哪些没设置内网DNS。
#salt '*' network.subnets #返回主机所属的子网
2.7 sys模块的常用使用方法
2.7.1 sys.argspec的用法(返回Salt执行模块中函数的参数说明。对于我们后期写.sls文件很有帮助)
例子:
#salt '*' sys.argspec pkg.install #查看pkg.install函数的参数说明
#salt '*' sys.argspec sys #查看sys模块里面所有函数的规则说明,或者#salt '*' sys.argspec 'sys.*'
2.7.2 sys.doc的用法(显示模块下函数的使用文档信息类似于man帮助,前面已介绍过,多模块或者多函数之间用空格隔开)
2.7.3 sys.list_functions和sys.list_modules的用法(前者就是列出所有模块下面的函数,多模块也是用空格隔开。后者是将所有模块列出来.)
例子:
# salt '*' sys.list_functions 'sys.list_*' #可以用这种方法将所有sys.list开头的函数列出来。
# salt '*' sys.list_modules #列出所有的模块
# salt '*' sys.list_modules 's*' #列出所有以s开头的模块。
2.8 service模块的常用使用方法
例子:
#salt '*' service.available sshd #查看某个命令的服务是否可用,这里是查看sshd服务是否可用,可用返回True,不可用返回False.
# salt '*' service.disable postfix #禁止某个服务开机启动,这里是禁止postfix服务开机启动。
# salt '*' service.disabled postfix #查看某个服务是否已经开机不启动,这里是以postfix服务为例,是返回True,否则返回False.
# salt '*' service.enable postfix #设置某个服务开机启动,这里以postfix为例
# salt '*' service.enabled postfix #查看某个服务是否开机启动,这里以postfix服务为例
# salt '*' service.get_all #查看所有的服务项
# salt '*' service.get_enabled #查看所有开机启动的服务
# salt '*' service.reload <service name> #重新加载指定名称的服务
# salt '*' service.restart <service name> #重新启动指定名称的服务
# salt '*' service.start <service name> #启动指定名称的服务
# salt '*' service.status <service name> #查看指定服务的状态,启动状态是True,关闭状态是False。
# salt '*' service.stop <service name> #关闭指定名称的服务
2.9 pkg模块的常用使用方法
2.9.1 pkg.install的用法(安装传递的包,在安装包之前,添加refresh = True来清理yum数据库。)
参数介绍:
name:要安装的软件包的名称。如果传递了“pkgs”或“sources“”此参数则会被忽略
# salt '*' pkg.install httpd #如这就相当于在minion端执行yum install httpd -y操作
# salt '*' pkg.install httpd refresh=True #如果是第一个yum的话,还是可以refresh参数,相当于yum clean all操作。
skip_verify:跳过GPG验证检查
version:安装包的特定版本
fromrepo:指定从哪个repo库来安装软件。
pkgs : 指定多个软件包,一定是要以列表传递。
#salt '*' pkg.install pkgs='["foo", "bar"]'
#salt '*' pkg.install pkgs='["foo", {"bar": "1.2.3-4.el5"}]'
sources:要安装的RPM软件包列表。 其中的键是包名称,值作为包的源URI或本地路径。
#salt '*' pkg.install sources='[{"foo": "salt://foo.rpm"}, {"bar": "salt://bar.rpm"}]'
2.9.2 pkg.latest_version的用法(更新软件包至最新版本)
例子:
#salt '*' pkg.latest_version <package name> #更新指定的软件包
#salt '*' pkg.latest_version <package name> fromrepo=epel-testing #指定repo源来更新软件包
#salt '*' pkg.latest_version <package1> <package2> <package3> ... #多个要更新的软件之间用空格隔开
2.9.3 pkg.remove的用法(删除软件的操作)
例子:
# salt '*' pkg.remove <package name> #卸载指定的软件
# salt '*' pkg.remove <package1>,<package2>,<package3> #多软件可以用空格隔开
# salt '*' pkg.remove pkgs='["foo", "bar"]' #也可以用pkgs使用python列表的形式
2.9.4 salt '*' pkg.version的用法(查看软件的版本)
# salt '*' pkg.version <package name> #查看指定软件的版本号
# salt '*' pkg.version <package1> <package2> <package3> ... #查看多软件版本号