SaltStack常用的模块
SaltStack模块介绍
Module是日常使用SaltStack接触最多的一个组件,其用于管理对象操作,这也是SaltStack通过Push的方式进行管理的入口,比如我们日常简单的执行命令、查看包安装情况、查看服务运行情况等工作都是通过SaltStack Module来实现的。
当安装好Master和Minion包后,系统上会安装很多Module,大家可以通过以下命令查看支持的所有Module列表:
环境说明
主机名字 | 主机类型 | ip | 安装的应用 |
---|---|---|---|
master | 控制记 | 192.168.200.132 | salt-master salt-minion |
node1 | 被控记 | 192.168.200.133 | salt-minion |
// 查看所有主机能否ping通
[root@master ~]# salt-key -L
Accepted Keys:
master
node1
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@master ~]# salt '*' test.ping
node1:
True
master:
True
// 查看所有的module列表
[root@master ~]# salt 'node1' sys.list_modules
node1:
- acl
- aliases
- alternatives
- archive
- artifactory
- baredoc
- beacons
- bigip
- btrfs
- buildout
- chroot
- cloud
- cmd
- composer
- config
- consul
- container_resource
- cp
- cron
- cryptdev
- data
- defaults
- devinfo
- devmap
- disk
- django
- dnsmasq
- dnsutil
- drbd
- environ
- ethtool
- event
- extfs
- file
- firewalld
- freezer
- gem
- genesis
- glassfish
- gnome
- google_chat
- grafana4
- grains
- group
- hashutil
- helm
- highstate_doc
- hosts
- http
- hue
- incron
- ini
- inspector
- introspect
- iosconfig
- ip
- ipset
- iptables
- jboss7
- jboss7_cli
- jinja
- k8s
- kernelpkg
- key
- keyboard
- kmod
- kubeadm
- locale
- locate
- log
- logrotate
- lowpkg
- lvm
- mandrill
- match
- mattermost
- mine
- minion
- modjk
- mount
- msteams
- nagios_rpc
- namecheap_domains
- namecheap_domains_dns
- namecheap_domains_ns
- namecheap_ssl
- namecheap_users
- network
- nexus
- nftables
- nova
- nspawn
- nxos
- nxos_api
- nxos_upgrade
- openscap
- openstack_config
- opsgenie
- out
- pagerduty
- pagerduty_util
- pam
- parallels
- partition
- peeringdb
- pillar
- pip
- pkg
- pkg_resource
- ps
- publish
- pushover
- pyenv
- random
- random_org
- rbenv
- rest_sample_utils
- restartcheck
- ret
- rvm
- s3
- s6
- salt_proxy
- salt_version
- saltcheck
- saltutil
- schedule
- scsi
- sdb
- seed
- serverdensity_device
- service
- shadow
- slack
- slsutil
- smbios
- smtp
- solrcloud
- sqlite3
- ssh
- state
- status
- statuspage
- supervisord
- sys
- sysctl
- sysfs
- syslog_ng
- system
- telegram
- telemetry
- temp
- test
- timezone
- tls
- travisci
- tuned
- udev
- uptime
- user
- vault
- vbox_guest
- virtualenv
- vsphere
- x509
- xfs
- xml
- zabbix
- zenoss
// 查看指定module的所有function
[root@master ~]# salt 'node1' sys.list_functions cmd
node1:
- cmd.exec_code
- cmd.exec_code_all
- cmd.has_exec
- cmd.powershell
- cmd.powershell_all
- cmd.retcode
- cmd.run
- cmd.run_all
- cmd.run_bg
- cmd.run_chroot
- cmd.run_stderr
- cmd.run_stdout
- cmd.script
- cmd.script_retcode
- cmd.shell
- cmd.shell_info
- cmd.shells
- cmd.tty
- cmd.which
- cmd.which_bin
// 查看指定module的用法
[root@master ~]# salt 'node1' sys.doc cmd | head -10
cmd.exec_code:
Pass in two strings, the first naming the executable language, aka -
python2, python3, ruby, perl, lua, etc. the second string containing
the code you wish to execute. The stdout will be returned.
All parameters from :mod:`cmd.run_all <salt.modules.cmdmod.run_all>` except python_shell can be used.
CLI Example:
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
//SaltStack默认也支持一次执行多个Module,Module之间通过逗号隔开,默认传参之间也是用逗号分隔,也支持指定传参分隔符号--args-separator=@即可
[root@master ~]# salt 'node1' test.echo,cmd.run,service.status hello,hostname,salt-minion
node1:
----------
cmd.run:
node1
service.status:
True
test.echo:
hello
SaltStack常用模块
SaltStack常用模块之network
network.active_tcp
返回所有活动的tcp连接
[root@master ~]# salt '*' network.active_tcp
node1:
----------
0:
----------
local_addr:
192.168.200.133
local_port:
47322
remote_addr:
192.168.200.132
remote_port:
4505
1:
----------
local_addr:
192.168.200.133
local_port:
22
remote_addr:
192.168.200.1
remote_port:
52999
2:
----------
local_addr:
192.168.200.133
local_port:
22
remote_addr:
192.168.200.1
remote_port:
52997
master:
----------
0:
----------
local_addr:
192.168.200.132
local_port:
52980
remote_addr:
192.168.200.132
remote_port:
4505
1:
----------
local_addr:
192.168.200.132
local_port:
22
remote_addr:
192.168.200.1
remote_port:
53001
2:
----------
local_addr:
192.168.200.132
local_port:
22
remote_addr:
192.168.200.1
remote_port:
53002
3:
----------
local_addr:
192.168.200.132
local_port:
4505
remote_addr:
192.168.200.132
remote_port:
52980
4:
----------
local_addr:
192.168.200.132
local_port:
4505
remote_addr:
192.168.200.133
remote_port:
47322
network.calc_net
通过IP和子网掩码计算出网段
[root@master ~]# salt '*' network.calc_net 192.168.200.133 255.255.254.0
node1:
192.168.200.0/23
master:
192.168.200.0/23
network.connect
测试minion至某一台服务器的网络是否连通
[root@master ~]# salt '*' network.connect baidu.com 80
master:
----------
comment:
Successfully connected to baidu.com (220.181.38.148) on tcp port 80
result:
True
node1:
----------
comment:
Successfully connected to baidu.com (220.181.38.251) on tcp port 80
result:
True
network.default_route
查看默认路由
[root@master ~]# salt '*' network.default_route
master:
|_
----------
addr_family:
inet
destination:
0.0.0.0
flags:
UG
gateway:
192.168.200.2
interface:
ens160
netmask:
0.0.0.0
node1:
|_
----------
addr_family:
inet
destination:
0.0.0.0
flags:
UG
gateway:
192.168.200.2
interface:
ens160
netmask:
0.0.0.0
network.get_fqdn
查看主机的fqdn(完全限定域名)
[root@master ~]# salt '*' network.get_fqdn
node1:
node1
master:
master
network.get_hostname
获取主机名
[root@master ~]# salt '*' network.get_hostname
master:
master
node1:
node1
network.get_route
查询到一个目标网络的路由信息
[root@master ~]# salt '*' network.get_route 192.168.200.133
master:
----------
destination:
192.168.200.133
gateway:
None
interface:
ens160
source:
192.168.200.132
node1:
----------
destination:
192.168.200.133
gateway:
None
interface:
lo
source:
192.168.200.133
network.hw_addr
返回指定网卡的MAC地址
[root@master ~]# salt '*' network.hw_addr ens160
master:
00:0c:29:0b:25:75
node1:
00:0c:29:25:71:39
network.ifacestartswith
从特定CIDR检索接口名称
[root@master ~]# salt '*' network.ifacestartswith 192.168
node1:
- ens160
master:
- ens160
network.in_subnet
判断当前主机是否在某一个网段内
[root@master ~]# salt '*' network.in_subnet 192.168.200.0/24
master:
True
node1:
True
network.interface
返回指定网卡的信息
[root@master ~]# salt '*' network.interface ens160
master:
|_
----------
address:
192.168.200.132
broadcast:
192.168.200.255
label:
ens160
netmask:
255.255.255.0
node1:
|_
----------
address:
192.168.200.133
broadcast:
192.168.200.255
label:
ens160
netmask:
255.255.255.0
network.interface_ip
返回指定网卡的IP地址
[root@master ~]# salt '*' network.interface_ip ens160
node1:
192.168.200.133
master:
192.168.200.132
network.interfaces
返回当前系统中所有的网卡信息
[root@master ~]# salt '*' network.interfaces
node1:
----------
ens160:
----------
hwaddr:
00:0c:29:25:71:39
inet:
|_
----------
address:
192.168.200.133
broadcast:
192.168.200.255
label:
ens160
netmask:
255.255.255.0
inet6:
|_
----------
address:
fe80::7adf:d0f6:d42d:6711
prefixlen:
64
scope:
link
up:
True
lo:
----------
hwaddr:
00:00:00:00:00:00
inet:
|_
----------
address:
127.0.0.1
broadcast:
None
label:
lo
netmask:
255.0.0.0
inet6:
|_
----------
address:
::1
prefixlen:
128
scope:
host
up:
True
master:
----------
ens160:
----------
hwaddr:
00:0c:29:0b:25:75
inet:
|_
----------
address:
192.168.200.132
broadcast:
192.168.200.255
label:
ens160
netmask:
255.255.255.0
inet6:
|_
----------
address:
fe80::d773:7f44:20d7:eeec
prefixlen:
64
scope:
link
up:
True
lo:
----------
hwaddr:
00:00:00:00:00:00
inet:
|_
----------
address:
127.0.0.1
broadcast:
None
label:
lo
netmask:
255.0.0.0
inet6:
|_
----------
address:
::1
prefixlen:
128
scope:
host
up:
True
network.ip_addrs
返回一个IPv4的地址列表
该函数将会忽略掉127.0.0.1
的地址
[root@master ~]# salt 'node1' network.netstat
node1:
|_
----------
inode:
28236
local-address:
192.168.200.133%ens160:68
program:
NetworkManager
proto:
udp
recv-q:
0
remote-address:
192.168.200.254:67
send-q:
0
user:
0
|_
----------
inode:
26757
local-address:
0.0.0.0:22
program:
sshd
proto:
tcp
recv-q:
0
remote-address:
0.0.0.0:*
send-q:
128
state:
LISTEN
user:
0
|_
----------
inode:
29188
local-address:
192.168.200.133:47322
program:
salt-minion
proto:
tcp
recv-q:
0
remote-address:
192.168.200.132:4505
send-q:
0
state:
ESTABLISHED
user:
0
|_
----------
inode:
0
local-address:
192.168.200.133:33428
program:
proto:
tcp
recv-q:
0
remote-address:
192.168.200.132:4506
send-q:
0
state:
TIME-WAIT
user:
0
|_
----------
inode:
34028
local-address:
192.168.200.133:22
program:
sshd
proto:
tcp
recv-q:
0
remote-address:
192.168.200.1:52999
send-q:
0
state:
ESTABLISHED
user:
0
|_
----------
inode:
33881
local-address:
192.168.200.133:22
program:
sshd
proto:
tcp
recv-q:
0
remote-address:
192.168.200.1:52997
send-q:
0
state:
ESTABLISHED
user:
0
|_
----------
inode:
26759
local-address:
[::]:22
program:
sshd
proto:
tcp
recv-q:
0
remote-address:
[::]:*
send-q:
128
state:
LISTEN
user:
0
network.ping
使用ping命令测试到某主机的连通性
[root@master ~]# salt 'node1' network.ping baidu.com
node1:
PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=1 ttl=128 time=207 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=2 ttl=128 time=72.0 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=3 ttl=128 time=64.0 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=4 ttl=128 time=73.3 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 64.011/104.049/206.823/59.444 ms
network.reverse_ip
返回一个指定的IP地址的反向地址
[root@master ~]# salt '*' network.reverse_ip 192.168.200.111
node1:
111.200.168.192.in-addr.arpa
master:
111.200.168.192.in-addr.arpa
SaltStack常用模块之service
service.available
判断指定的服务是否可用
[root@master ~]# salt '*' service.available sshd
node1:
True
master:
True
[root@master ~]# salt '*' service.available vsftpd
node1:
False
master:
False
service.get_all
获取所有正在运行的服务
[root@master ~]# salt 'node1' service.get_all
node1:
- NetworkManager
- NetworkManager-dispatcher
- NetworkManager-wait-online
- auditd
- autovt@
- basic.target
- blk-availability
- bluetooth.target
- console-getty
- container-getty@
- cpupower
- crond
- cryptsetup-pre.target
- cryptsetup.target
- ctrl-alt-del.target
- dbus
- dbus-org.freedesktop.hostname1
- dbus-org.freedesktop.locale1
- dbus-org.freedesktop.login1
- dbus-org.freedesktop.nm-dispatcher
- dbus-org.freedesktop.portable1
- dbus-org.freedesktop.timedate1
- dbus.socket
- debug-shell
- default.target
- dev-hugepages.mount
- dev-mqueue.mount
- dm-event
- dm-event.socket
- dnf-makecache
- dnf-makecache.timer
- dracut-cmdline
- dracut-initqueue
- dracut-mount
- dracut-pre-mount
- dracut-pre-pivot
- dracut-pre-trigger
- dracut-pre-udev
- dracut-shutdown
- ebtables
- emergency
- emergency.target
- exit.target
- final.target
- firewalld
- fstrim
- fstrim.timer
- getty-pre.target
- getty.target
- getty@
- graphical.target
- grub-boot-indeterminate
- halt-local
- halt.target
- hibernate.target
- hybrid-sleep.target
- import-state
- initrd-cleanup
- initrd-fs.target
- initrd-parse-etc
- initrd-root-device.target
- initrd-root-fs.target
- initrd-switch-root
- initrd-switch-root.target
- initrd-udevadm-cleanup-db
- initrd.target
- iprdump
- iprinit
- iprupdate
- iprutils.target
- irqbalance
- kdump
- kexec.target
- kmod-static-nodes
- ldconfig
- loadmodules
- local-fs-pre.target
- local-fs.target
- lvm2-lvmpolld
- lvm2-lvmpolld.socket
- lvm2-monitor
- lvm2-pvscan@
- man-db-cache-update
- messagebus
- microcode
- multi-user.target
- network-online.target
- network-pre.target
- network.target
- nftables
- nis-domainname
- nss-lookup.target
- nss-user-lookup.target
- paths.target
- plymouth-halt
- plymouth-kexec
- plymouth-poweroff
- plymouth-quit
- plymouth-quit-wait
- plymouth-read-write
- plymouth-reboot
- plymouth-start
- plymouth-switch-root
- polkit
- poweroff.target
- printer.target
- proc-sys-fs-binfmt_misc.automount
- proc-sys-fs-binfmt_misc.mount
- quotaon
- rc-local
- rdisc
- reboot.target
- remote-cryptsetup.target
- remote-fs-pre.target
- remote-fs.target
- rescue
- rescue.target
- rhnsd
- rhsm
- rhsm-facts
- rhsmcertd
- rngd
- rngd-wake-threshold
- rpcbind.target
- rsyslog
- runlevel0.target
- runlevel1.target
- runlevel2.target
- runlevel3.target
- runlevel4.target
- runlevel5.target
- runlevel6.target
- salt-minion
- salt-proxy@
- selinux-autorelabel
- selinux-autorelabel-mark
- selinux-autorelabel.target
- serial-getty@
- shutdown.target
- sigpwr.target
- sleep.target
- slices.target
- smartcard.target
- sockets.target
- sound.target
- sshd
- sshd-keygen.target
- sshd-keygen@
- sshd.socket
- sshd@
- sssd
- sssd-autofs
- sssd-autofs.socket
- sssd-kcm
- sssd-kcm.socket
- sssd-nss
- sssd-nss.socket
- sssd-pac
- sssd-pac.socket
- sssd-pam
- sssd-pam-priv.socket
- sssd-pam.socket
- sssd-ssh
- sssd-ssh.socket
- sssd-sudo
- sssd-sudo.socket
- suspend-then-hibernate.target
- suspend.target
- swap.target
- sys-fs-fuse-connections.mount
- sys-kernel-config.mount
- sys-kernel-debug.mount
- sysinit.target
- syslog
- syslog.socket
- system-update-cleanup
- system-update-pre.target
- system-update.target
- systemd-ask-password-console
- systemd-ask-password-console.path
- systemd-ask-password-plymouth
- systemd-ask-password-plymouth.path
- systemd-ask-password-wall
- systemd-ask-password-wall.path
- systemd-backlight@
- systemd-binfmt
- systemd-coredump.socket
- systemd-coredump@
- systemd-exit
- systemd-firstboot
- systemd-fsck-root
- systemd-fsck@
- systemd-halt
- systemd-hibernate
- systemd-hibernate-resume@
- systemd-hostnamed
- systemd-hwdb-update
- systemd-hybrid-sleep
- systemd-initctl
- systemd-initctl.socket
- systemd-journal-catalog-update
- systemd-journal-flush
- systemd-journald
- systemd-journald-audit.socket
- systemd-journald-dev-log.socket
- systemd-journald.socket
- systemd-kexec
- systemd-localed
- systemd-logind
- systemd-machine-id-commit
- systemd-modules-load
- systemd-portabled
- systemd-poweroff
- systemd-quotacheck
- systemd-random-seed
- systemd-reboot
- systemd-remount-fs
- systemd-resolved
- systemd-rfkill
- systemd-rfkill.socket
- systemd-suspend
- systemd-suspend-then-hibernate
- systemd-sysctl
- systemd-sysusers
- systemd-timedated
- systemd-tmpfiles-clean
- systemd-tmpfiles-clean.timer
- systemd-tmpfiles-setup
- systemd-tmpfiles-setup-dev
- systemd-udev-settle
- systemd-udev-trigger
- systemd-udevd
- systemd-udevd-control.socket
- systemd-udevd-kernel.socket
- systemd-update-done
- systemd-update-utmp
- systemd-update-utmp-runlevel
- systemd-user-sessions
- systemd-vconsole-setup
- systemd-volatile-root
- tcsd
- teamd@
- time-sync.target
- timers.target
- tmp.mount
- tuned
- umount.target
- unbound-anchor
- unbound-anchor.timer
- user-runtime-dir@
- user@
- vgauthd
- vmtoolsd
service.disabled
检查指定服务是否开机不自动启动
// 查看node1上httpd服务的状态
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vend>
Active: active (running) since Wed 2021-11-03 15:19:19 CST; 39s ago
Docs: man:httpd.service(8)
Main PID: 69437 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11300)
Memory: 29.3M
CGroup: /system.slice/httpd.service
├─69437 /usr/sbin/httpd -DFOREGROUND
├─70375 /usr/sbin/httpd -DFOREGROUND
├─70376 /usr/sbin/httpd -DFOREGROUND
├─70377 /usr/sbin/httpd -DFOREGROUND
└─70378 /usr/sbin/httpd -DFOREGROUND
[root@master ~]# salt 'node1' service.disabled httpd
node1:
False
service.enabled
检查指定服务是否开机自动启动
[root@master ~]# salt 'node1' service.enabled httpd
node1:
True
service.disable
设置指定服务开机不自动启动
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vend>
Active: active (running) since Wed 2021-11-03 15:19:19 CST; 39s ago
Docs: man:httpd.service(8)
Main PID: 69437 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11300)
Memory: 29.3M
CGroup: /system.slice/httpd.service
├─69437 /usr/sbin/httpd -DFOREGROUND
├─70375 /usr/sbin/httpd -DFOREGROUND
├─70376 /usr/sbin/httpd -DFOREGROUND
├─70377 /usr/sbin/httpd -DFOREGROUND
└─70378 /usr/sbin/httpd -DFOREGROUND
[root@master ~]# salt 'node1' service.disable httpd
node1:
True
// 查看node1主机 httpd状态
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; ven> // 已经变成disabled
Active: active (running) since Wed 2021-11-03 15:19:19 CST; 3min 32s>
Docs: man:httpd.service(8)
Main PID: 69437 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11300)
Memory: 29.3M
CGroup: /system.slice/httpd.service
├─69437 /usr/sbin/httpd -DFOREGROUND
├─70375 /usr/sbin/httpd -DFOREGROUND
├─70376 /usr/sbin/httpd -DFOREGROUND
├─70377 /usr/sbin/httpd -DFOREGROUND
└─70378 /usr/sbin/httpd -DFOREGROUND
service.enable
设置指定服务开机自动启动
[root@master ~]# salt 'node1' service.enable httpd
node1:
True
// 查看node1主机 httpd状态
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vend>
Active: active (running) since Wed 2021-11-03 15:19:19 CST; 7min ago
Docs: man:httpd.service(8)
Main PID: 69437 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11300)
Memory: 29.3M
CGroup: /system.slice/httpd.service
├─69437 /usr/sbin/httpd -DFOREGROUND
├─70375 /usr/sbin/httpd -DFOREGROUND
├─70376 /usr/sbin/httpd -DFOREGROUND
├─70377 /usr/sbin/httpd -DFOREGROUND
└─70378 /usr/sbin/httpd -DFOREGROUND
service.reload
重新加载指定服务
[root@master ~]# salt 'node1' service.reload httpd
node1:
True
service.stop
停止指定服务
[root@master ~]# salt 'node1' service.stop httpd
node1:
True
// 查看node1上httpd服务的状态
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vend>
Active: inactive (dead) since Wed 2021-11-03 15:28:55 CST; 15s ago
Docs: man:httpd.service(8)
Process: 85948 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=>
Process: 69437 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=>
Main PID: 69437 (code=exited, status=0/SUCCESS)
Status: "Running, listening on: port 80"
service.start
启动指定服务
[root@master ~]# salt 'node1' service.start httpd
node1:
True
// 查看node1上httpd服务的状态
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vend>
Active: active (running) since Wed 2021-11-03 15:30:42 CST; 1min 25s>
Docs: man:httpd.service(8)
Process: 85948 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=>
Main PID: 91169 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11300)
Memory: 29.2M
CGroup: /system.slice/httpd.service
├─91169 /usr/sbin/httpd -DFOREGROUND
├─91997 /usr/sbin/httpd -DFOREGROUND
├─91998 /usr/sbin/httpd -DFOREGROUND
├─91999 /usr/sbin/httpd -DFOREGROUND
└─92000 /usr/sbin/httpd -DFOREGROUND
service.restart
重启指定服务
[root@master ~]# salt 'node1' service.restart httpd
node1:
True
service.status
查看指定服务的状态
// httpd服务开启状态查看的时候返回True
[root@master ~]# salt 'node1' service.status httpd
node1:
True
// 关闭httpd服务查看状态返回Flase
[root@node1 ~]# systemctl stop httpd
[root@master ~]# salt 'node1' service.status httpd
node1:
False
service.missing
查看指定服务是否存在
[root@master ~]# salt 'node1' service.missing httpd
node1:
False
[root@master ~]# salt 'node1' service.missing nginx
node1:
True
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vend>
Active: reloading (reload) since Wed 2021-11-03 16:45:21 CST; 2s ago
Docs: man:httpd.service(8)
Main PID: 233930 (httpd)
Status: "Reading configuration..."
Tasks: 1 (limit: 11300)
Memory: 3.3M
CGroup: /system.slice/httpd.service
└─233930 /usr/sbin/httpd -DFOREGROUND
11月 03 16:45:05 node1 systemd[1]: Starting The Apache HTTP Server...
11月 03 16:45:21 node1 httpd[233930]: AH00558: httpd: Could not reliabl>
11月 03 16:45:21 node1 systemd[1]: Started The Apache HTTP Server.
SaltStack常用模块之pkg
pkg.download
只下载软件包但不安装
此功能将会下载指定的软件包,但是需要在minion端安装yum-utils
,可以使用 cmd.run 进行远程安装
// 在node1上安装wget
[root@master ~]# salt 'node1' pkg.download wget
node1:
----------
wget:
/var/cache/yum/packages/wget-1.19.5-10.el8.x86_64.rpm
// 查看下载情况
[root@node1 ~]# cd /var/cache/yum/packages/
[root@node1 packages]# ls
wget-1.19.5-10.el8.x86_64.rpm
pkg.file_list
列出指定包或系统中已安装的所有包的文件
[root@master ~]# salt 'node1' pkg.file_list httpd
node1:
----------
errors:
files:
- /etc/httpd/conf
- /etc/httpd/conf.d/autoindex.conf
- /etc/httpd/conf.d/userdir.conf
- /etc/httpd/conf.d/welcome.conf
- /etc/httpd/conf.modules.d
- /etc/httpd/conf.modules.d/00-base.conf
- /etc/httpd/conf.modules.d/00-dav.conf
- /etc/httpd/conf.modules.d/00-lua.conf
- /etc/httpd/conf.modules.d/00-mpm.conf
- /etc/httpd/conf.modules.d/00-optional.conf
- /etc/httpd/conf.modules.d/00-proxy.conf
- /etc/httpd/conf.modules.d/00-systemd.conf
- /etc/httpd/conf.modules.d/01-cgi.conf
- /etc/httpd/conf.modules.d/README
- /etc/httpd/conf/httpd.conf
- /etc/httpd/conf/magic
- /etc/httpd/logs
- /etc/httpd/modules
- /etc/httpd/run
......省略
// 当不提供参数时,将会列出当前系统中所有已安装软件的文件列表
[root@master ~]# salt '*' pkg.file_list
node1:
----------
errors:
files:
VALUE_TRIMMED
master:
----------
errors:
files:
VALUE_TRIMMED
pkg.group_info
查看包组的信息
[root@master ~]# salt 'node1' pkg.group_info 'Development Tools'
node1:
----------
conditional:
default:
- asciidoc
- byacc
- ctags
- diffstat
- elfutils-libelf-devel
- git
- intltool
- jna
- ltrace
- patchutils
- perl-Fedora-VSP
- perl-Sys-Syslog
- perl-generators
- pesign
- source-highlight
- systemtap
- valgrind
- valgrind-devel
description:
A basic development environment.
group:
Development Tools
id:
None
mandatory:
- autoconf
- automake
- binutils
- bison
- flex
- gcc
- gcc-c++
- gdb
- glibc-devel
- libtool
- make
- pkgconf
- pkgconf-m4
- pkgconf-pkg-config
- redhat-rpm-config
- rpm-build
- rpm-sign
- strace
optional:
- cmake
- expect
- rpmdevtools
- rpmlint
type:
package group
pkg.group_list
列出系统中所有的包组
[root@master ~]# salt 'node1' pkg.group_list
node1:
----------
available:
- Conflicts BaseOS
- Dial-up Networking Support
- Hardware Monitoring Utilities
- Hardware Support
- Large Systems Performance
- Legacy UNIX Compatibility
- Python Web
- Server product core
- Windows File Server
- Additional Development
- Anaconda tools
- Backup Client
- Base
- base-x
- Conflicts AppStream
- Container Management
- Debugging Tools
- Desktop Debugging and Performance Tools
- Development Tools
- .NET Core Development
- File and Storage Server
- Fonts
- FTP Server
- GNOME Applications
- GNOME
- Graphical Administration Tools
- Graphics Creation Tools
- Guest Agents
- Guest Desktop Agents
- Headless Management
- Infiniband Support
- Input Methods
- Internet Applications
- Internet Browser
- Java Platform
- Legacy X Window System Compatibility
- Mail Server
- Mainframe Access
- Multimedia
- Network File System Client
- Network Servers
- Networking Tools
- Common NetworkManager submodules
- Office Suite and Productivity
- Atomic Host ostree support
- Performance Tools
- Platform Development
- KVM platform specific packages
- Hyper-v platform specific packages
- Printing Client
- Remote Desktop Clients
- Remote Management for Linux
- RPM Development Tools
- Scientific Support
- Security Tools
- Smart Card Support
- Standard
- System Tools
- TeX formatting system
- Virtualization Client
- Virtualization Hypervisor
- Virtualization Platform
- Virtualization Tools
- Basic Web Server
- Workstation product core
available environments:
- Server with GUI
- Server
- Workstation
- Custom Operating System
- Virtualization Host
available languages:
----------
installed:
- Core
- VMware platform specific packages
installed environments:
- Minimal Install
pkg.install
安装软件
[root@master ~]# salt 'node1' pkg.install mariadb
node1:
----------
mariadb:
----------
new:
3:10.3.28-1.module_el8.3.0+757+d382997d
old:
mariadb-common:
----------
new:
3:10.3.28-1.module_el8.3.0+757+d382997d
old:
mariadb-connector-c:
----------
new:
3.1.11-2.el8_3
old:
mariadb-connector-c-config:
----------
new:
3.1.11-2.el8_3
old:
perl-Carp:
----------
new:
1.42-396.el8
old:
perl-Data-Dumper:
----------
new:
2.167-399.el8
old:
perl-Digest:
----------
new:
1.17-395.el8
old:
perl-Digest-MD5:
----------
new:
2.55-396.el8
old:
......省略
// 查看
[root@node1 ~]# rpm -qa | grep mariadb
mariadb-common-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-config-3.1.11-2.el8_3.noarch
mariadb-connector-c-3.1.11-2.el8_3.x86_64
mariadb-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
pkg.list_downloaded
列出已下载到本地的软件包
[root@master ~]# salt '*' pkg.list_downloaded
node1:
----------
master:
----------
pkg.list_pkgs
以字典的方式列出当前已安装的软件包
[root@master ~]# salt 'node1' pkg.list_pkgs
node1:
----------
NetworkManager:
1:1.22.8-4.el8
NetworkManager-libnm:
1:1.22.8-4.el8
NetworkManager-team:
1:1.22.8-4.el8
NetworkManager-tui:
1:1.22.8-4.el8
acl:
2.2.53-1.el8
apr:
1.6.3-11.el8
apr-util:
1.6.1-6.el8
apr-util-bdb:
1.6.1-6.el8
apr-util-openssl:
1.6.1-6.el8
audit:
3.0-0.17.20191104git1c2f876.el8
audit-libs:
......省略
pkg.owner
列出指定文件是由哪个包提供的
[root@master ~]# salt 'node1' pkg.owner /usr/sbin/apachectl
node1:
httpd
[root@master ~]# salt 'node1' pkg.owner /usr/sbin/apachectl /etc/httpd/conf/httpd.conf
node1:
----------
/etc/httpd/conf/httpd.conf:
httpd
/usr/sbin/apachectl:
httpd
pkg.remove
卸载指定软件
// 查看node主机是否下载mariadb
[root@node1 ~]# rpm -qa | grep mariadb
mariadb-common-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-config-3.1.11-2.el8_3.noarch
mariadb-connector-c-3.1.11-2.el8_3.x86_64
mariadb-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
// 使用万能模块cmd.run过滤mariadb
[root@master ~]# salt 'node1' cmd.run 'rpm -qa | grep mariadb'
node1:
mariadb-common-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-config-3.1.11-2.el8_3.noarch
mariadb-connector-c-3.1.11-2.el8_3.x86_64
mariadb-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
// 开始删除
[root@master ~]# salt 'node1' pkg.remove mariadb
node1:
----------
mariadb:
----------
new:
old:
3:10.3.28-1.module_el8.3.0+757+d382997d
mariadb-common:
----------
new:
old:
3:10.3.28-1.module_el8.3.0+757+d382997d
mariadb-connector-c:
----------
new:
old:
3.1.11-2.el8_3
mariadb-connector-c-config:
----------
new:
old:
3.1.11-2.el8_3
perl-Carp:
----------
new:
old:
1.42-396.el8
perl-Data-Dumper:
----------
new:
old:
2.167-399.el8
......省略
// 删除成功
[root@node1 ~]# rpm -qa | grep mariadb
// 若要卸载多个文件,中间需要用逗号隔开
pkg.upgrade
升级系统中所有的软件包或升级指定的软件包
[root@master ~]# salt 'node1' pkg.upgrade name=openssl
node1:
----------
openssl:
----------
new:
1:1.1.1g-15.el8_3
old:
1:1.1.1c-15.el8
openssl-libs:
----------
new:
1:1.1.1g-15.el8_3
old:
1:1.1.1c-15.el8
// 若想升级系统中所有的软件包则把 name 参数去掉即可
pkg.group_install
安装包组
[root@master ~]# salt 'node1' pkg.group_install 'Development Tools'
node1:
----------
adobe-mappings-cmap:
----------
new:
20171205-3.el8
old:
adobe-mappings-cmap-deprecated:
----------
new:
20171205-3.el8
old:
adobe-mappings-pdf:
----------
new:
20180407-1.el8
old:
annobin:
----------
new:
9.50-1.el8
old:
asciidoc:
----------
new:
8.6.10-0.5.20180627gitf7c2274.el8
old:
atk:
----------
new:
2.28.1-1.el8
old:
autoconf:
----------
new:
2.69-27.el8
old:
automake:
SaltStack常用模块之state
state.show_highstate
显示当前系统中有哪些高级状态
[root@master ~]# salt 'node1' state.show_highstate
node1:
----------
apache-install:
----------
__env__:
base
__sls__:
web.apache.install
pkg:
|_
----------
name:
httpd
- installed
|_
----------
order:
10000
apache-service:
----------
__env__:
base
__sls__:
web.apache.install
service:
|_
----------
name:
httpd
|_
----------
enable:
True
- running
|_
----------
order:
10001
state.highstate
执行高级状态
pillar自定义数据:
在master的配置文件里找pillar_roots可以看到其存放pillar的位置
[root@master ~]# vim /etc/salt/master
# Pillar is laid out in the same fashion as the file server, with environments,
# a top file and sls files. However, pillar data does not need to be in the
# highstate format, and is generally just key/value pairs.
pillar_roots: // 取消这三行注释
base:
- /srv/pillar/base
#
#ext_pillar:
# - hiera: /etc/hiera.yaml
# - cmd_yaml: cat /etc/salt/yaml
[root@master ~]# systemctl restart salt-master
[root@master ~]# mkdir -p /srv/pillar/base
[root@master ~]# vim /srv/pillar/base/test.sls
{% if grains['os'] == 'CentOS Stream' %}
test: httpd
{% elif grains['os'] == 'CentOS' %}
test: nginx
{% endif %}
[root@master ~]# vim /srv/pillar/base/top.sls
base: // 指定环境
'192.168.200.133': // 指定目标
- test
[root@master ~]# vim /etc/salt/master
#pillar_opts: True // 这一行重新注释
[root@master ~]# salt '*' pillar.items
master:
----------
node1:
----------
test:
httpd
// 在salt下修改nginx的状态文件,引用pillar的数据
[root@master ~]# vim /srv/salt/base/web/apache/install.sls
apache-install:
pkg.installed:
- name: "{{ pillar['test'] }}"
apache-service:
service.running:
- name: "{{ pillar['test'] }}"
- enable: True
// 高级状态
[root@master ~]# salt 'node1' state.highstate web.apache.install
node1:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 10:29:45.259589
Duration: 688.226 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 10:29:45.952305
Duration: 45.629 ms
Changes:
Summary for node1
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 733.855 ms
state.show_state_usage
显示当前系统中的高级状态执行情况
[root@master ~]# salt 'node1' state.show_state_usage
node1:
----------
base:
----------
count_all:
3
count_unused:
2
count_used:
1
unused:
- top
- web.nginx.install
used:
- web.apache.install
dev:
----------
count_all:
0
count_unused:
0
count_used:
0
unused:
used:
prod:
----------
count_all:
0
count_unused:
0
count_used:
0
unused:
used:
test:
----------
count_all:
0
count_unused:
0
count_used:
0
unused:
used:
state.show_top
返回minion将用于highstate的顶级数据
[root@master ~]# salt 'node1' state.show_top
node1:
----------
base:
- web.apache.install
state.top
执行指定的top file
// 在top file里面使用Grains
[root@master ~]# vim /srv/salt/base/top.sls
base:
'os:Centos Stream':
- match: grain
- web.apache.install
执行指定的top file,而不是默认的
[root@master ~]# salt "node1" state.top top.sls
node1:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 13:03:22.950776
Duration: 679.831 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 13:03:23.632397
Duration: 42.748 ms
Changes:
Summary for node1
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 722.579 ms
state.show_sls
显示 master 上特定sls或sls文件列表中的状态数据
[root@master ~]# salt 'node1' state.show_sls web.apache.install
node1:
----------
apache-install:
----------
__env__:
base
__sls__:
web.apache.install
pkg:
|_
----------
name:
httpd
- installed
|_
----------
order:
10000
apache-service:
----------
__env__:
base
__sls__:
web.apache.install
service:
|_
----------
name:
httpd
|_
----------
enable:
True
- running
|_
----------
order:
10001
SaltStack常用模块之user
user.add
创建用户
[root@node1 ~]# id jjyy
id: “jjyy”:无此用户
[root@master ~]# salt 'node1' user.add jjyy
node1:
True
[root@node1 ~]# id jjyy
uid=1001(jjyy) gid=1001(jjyy) 组=1001(jjyy)
user.chfullname
更改用户完整名称
[root@master ~]# salt "master" user.chfullname syb "syb lyw"
master:
True
[root@master ~]# cat /etc/passwd |tail -1
syb:x:1001:1001:syb lyw:/home/syb:/bin/bash
user.chuid
更改用户UID
[root@master ~]# id syb
uid=1001(syb) gid=1001(syb) 组=1001(syb)
[root@master ~]# salt 'master' user.chuid syb 2000
master:
True
[root@master ~]# id syb
uid=2000(syb) gid=1001(syb) 组=1001(syb)
user.gid
更改用户GID
[root@master ~]# salt 'master' user.add lyw
master:
True
[root@master ~]# id lyw
uid=2001(lyw) gid=2001(lyw) 组=2001(lyw)
[root@master ~]# salt 'master' user.chgid syb 2001
master:
True
[root@master ~]# id syb
uid=2000(syb) gid=2001(lyw) 组=2001(lyw)
user.info
返回用户信息
[root@master ~]# salt 'master' user.info syb
master:
----------
fullname:
syb lyw
gid:
2001
groups:
- lyw
home:
/home/syb
homephone:
name:
syb
other:
passwd:
x
roomnumber:
shell:
/bin/bash
uid:
2000
workphone:
user.getent
返回所有系统用户信息的列表
[root@master ~]# salt 'master' user.getent
master:
|_
----------
fullname:
root
gid:
0
groups:
- root
home:
/root
homephone:
name:
root
other:
passwd:
x
roomnumber:
shell:
/bin/bash
uid:
0
workphone:
|_
......省略
user.list_groups
列出指定用户所属组的列表
[root@master ~]# salt 'master' user.list_groups syb
master:
- lyw
user.list_users
返回所有用户的列表
[root@master ~]# salt 'master' user.list_users
master:
- adm
- admin
- bin
- daemon
- dbus
- ftp
- games
- halt
- lp
- lyw
- mail
- nobody
- operator
- polkitd
- rngd
- root
- shutdown
- sshd
- sssd
- syb
- sync
- systemd-coredump
- systemd-resolve
- tss
- unbound
user.rename
修改指定用户的用户名
[root@master ~]# id syb
uid=2000(syb) gid=2001(lyw) 组=2001(lyw)
[root@master ~]# salt 'master' user.rename syb syblyw
master:
False
[root@master ~]# id syb
id: “syb”:无此用户
[root@master ~]# id syblyw
uid=2000(syblyw) gid=2001(lyw) 组=2001(lyw)
[root@master ~]# cat /etc/passwd | tail -2
lyw:x:2001:2001::/home/lyw:/bin/bash
syblyw:x:2000:2001:syb lyw:/home/syb:/bin/bash
// 虽然返回False但是操作是成功完成了的
user.delete
删除用户
[root@master ~]# id syblyw
uid=2000(syblyw) gid=2001(lyw) 组=2001(lyw)
[root@master ~]# salt 'master' user.delete syblyw
master:
True
[root@master ~]# id syblyw
id: “syblyw”:无此用户
[root@master ~]# cat /etc/passwd |tail -2
admin:x:1000:1000:admin:/home/admin:/bin/bash
lyw:x:2001:2001::/home/lyw:/bin/bash
// amu123用户已被删除
SaltStack常用模块之salt-cp
salt-cp
能够很方便的把 master 上的文件批量传到 minion上
// 拷贝单个文件到目标主机的/usr/src目录下
[root@master ~]# salt 'node1' cmd.run 'ls /usr/src'
node1:
debug
kernels
[root@master ~]# salt-cp 'node1' /etc/passwd /usr/src/
node1:
----------
/usr/src/passwd:
True
[root@master ~]# salt 'node1' cmd.run 'ls /usr/src'
node1:
debug
kernels
passwd
// 拷贝多个文件到目标主机的/usr/src目录下
[root@master ~]# salt-cp 'node1' /etc/shadow /etc/group /usr/src
node1:
----------
/usr/src/group:
True
/usr/src/shadow:
True
[root@master ~]# salt 'node1' cmd.run 'ls /usr/src'
node1:
debug
group
kernels
passwd
shadow
SaltStack常用模块之file
file.access
检查指定路径是否存在
// 文件存在
[root@master ~]# salt 'node1' file.access /usr/src/passwd f
node1:
True
// 文件不存在
[root@master ~]# salt 'node1' file.access /usr/src/abc f
node1:
False
检查指定文件的权限信息
[root@master ~]# salt 'node1' cmd.run 'ls -l /usr/src'
node1:
total 12
drwxr-xr-x. 2 root root 6 Aug 12 2018 debug
-rw-r--r-- 1 root root 537 Nov 4 15:31 group
drwxr-xr-x. 3 root root 42 Nov 3 17:03 kernels
-rw-r--r-- 1 root root 1189 Nov 4 15:30 passwd
-rw-r--r-- 1 root root 807 Nov 4 15:31 shadow
// 检查/usr/src/passwd文件是否有读权限
[root@master ~]# salt 'node1' file.access /usr/src/passwd r
node1:
True
// 检查/usr/src/passwd文件是否有写权限
[root@master ~]# salt 'node1' file.access /usr/src/passwd w
node1:
True
// 检查/usr/src/passwd文件是否有执行权限
[root@master ~]# salt 'node1' file.access /usr/src/passwd x
node1:
False
file.append
往一个文件里追加内容,若此文件不存在则会报异常
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/abc'
node1:
ls: cannot access '/root/abc': No such file or directory
ERROR: Minions returned with non-zero exit code
// 创建文件
[root@master ~]# salt 'node1' cmd.run 'touch abc'
node1:
[root@master ~]# salt 'node1' cmd.run 'ls /root'
node1:
abc
anaconda-ks.cfg
// 文件存在,即可查看
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/abc'
node1:
-rw-r--r-- 1 root root 0 Nov 4 15:37 /root/abc
// 给文件添加内容
[root@master ~]# salt 'node1' file.append /root/abc "hi syb" "hi lyw"
node1:
Wrote 2 lines to "/root/abc"
// 查看效果
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/abc'
node1:
-rw-r--r-- 1 root root 14 Nov 4 15:39 /root/abc
[root@master ~]# salt 'node1' cmd.run 'cat /root/abc'
node1:
hi syb
hi lyw
file.basename
获取指定路径的基名
[root@master ~]# salt 'node1' file.basename '/root/zabbix/abc'
node1:
abc
file.dirname
获取指定路径的目录名
[root@master ~]# salt 'node1' file.dirname '/root/zabbix/abc'
node1:
/root/zabbix
file.check_hash
检查指定的文件与hash字符串是否匹配,匹配则返回 True 否则返回 False
[root@master ~]# salt 'node1' cmd.run 'md5sum /etc/passwd'
node1:
e7ec692e20eb631b8428c3883ab27aa4 /etc/passwd
[root@master ~]# salt 'node1' file.check_hash /etc/passwd e7ec692e20eb631b8428c3883ab27aa4
node1:
True
file.chattr
修改指定文件的属性
属性 | 对文件的意义 | 对目录的意义 |
---|---|---|
a | 只允许在这个文件之后追加数据, 不允许任何进程覆盖或截断这个文件 | 只允许在这个目录下建立和修改文件, 而不允许删除任何文件 |
i | 不允许对这个文件进行任何的修改, 不能删除、更改、移动 | 任何的进程只能修改目录之下的文件, 不允许建立和删除文件 |
给指定文件添加属性
// 查看当前属性
[root@master ~]# salt 'node1' cmd.run 'lsattr /root'
node1:
-------------------- /root/anaconda-ks.cfg
-------------------- /root/abc
// 添加属性operator=add
[root@master ~]# salt 'node1' file.chattr /root/abc operator=add attributes=ai
node1:
True
[root@master ~]# salt 'node1' cmd.run 'lsattr /root'node1:
-------------------- /root/anaconda-ks.cfg
----ia-------------- /root/abc
给指定文件去除属性
[root@master ~]# salt 'node1' file.chattr /root/abc operator=remove attributes=i
node1:
True
[root@master ~]# salt 'node1' cmd.run 'lsattr /root'node1:
-------------------- /root/anaconda-ks.cfg
-----a-------------- /root/abc
file.chown
设置指定文件的属主、属组信息
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 tom tom 6 Nov 4 16:37 ddd
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
[root@master ~]# salt 'node1' file.chown /root/ddd root root
node1:
None
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
file.copy
在远程主机上复制文件或目录
拷贝文件
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 8
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
[root@master ~]# salt 'node1' file.copy /root/abc root/abb
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
覆盖并拷贝目录,将会覆盖同名文件或目录
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
[root@master ~]# salt 'node1' file.copy /tmp/ /root/abd recurse=True
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 16
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt 14 root root 4096 Nov 4 15:51 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
删除目标目录中同名的文件或目录并拷贝新内容至其中
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/abd'
node1:
total 4
drwxr-xr-x 2 root root 20 Nov 3 17:03 hsperfdata_root
-rwx------. 1 root root 1379 Nov 1 17:21 ks-script-ycjz7w70
drwx------ 3 root root 17 Nov 4 15:27 systemd-private-fc7987305264446894ed89562b666584-httpd.service-Rm1Aaf
drwx------ 2 root root 6 Nov 3 09:19 vmware-root_956-2722239132
drwx------ 2 root root 6 Nov 4 15:27 vmware-root_958-2730693406
drwx------. 2 root root 6 Nov 3 09:16 vmware-root_961-4248090753
drwx------. 2 root root 6 Nov 1 17:21 vmware-root_979-4290625299
drwx------ 2 root root 6 Nov 3 13:56 vmware-root_982-2965972296
[root@master ~]# salt 'node1' cmd.run 'ls -l /tmp/'
node1:
total 4
-rwx------. 1 root root 1379 Nov 1 17:21 ks-script-ycjz7w70
drwx------ 2 root root 6 Nov 4 15:27 vmware-root_958-2730693406
drwx------. 2 root root 6 Nov 3 09:16 vmware-root_961-4248090753
[root@master ~]# salt 'node1' file.copy /tmp/ /root/abd recurse=True remove_existing=True
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /tmp/'
node1:
total 4
-rwx------. 1 root root 1379 Nov 1 17:21 ks-script-ycjz7w70
drwx------ 2 root root 6 Nov 4 15:27 vmware-root_958-2730693406
drwx------. 2 root root 6 Nov 3 09:16 vmware-root_961-4248090753
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/abd'
node1:
total 4
-rwx------. 1 root root 1379 Nov 1 17:21 ks-script-ycjz7w70
drwx------ 2 root root 6 Nov 4 15:27 vmware-root_958-2730693406
drwx------. 2 root root 6 Nov 3 09:16 vmware-root_961-4248090753
file.ditectory_exists
判断指定目录是否存在,存在则返回 True ,否则返回 False
[root@master ~]# salt 'node1' cmd.run 'ls -l /tmp/'
node1:
total 4
drwxr-xr-x 2 root root 20 Nov 3 17:03 hsperfdata_root
-rwx------. 1 root root 1379 Nov 1 17:21 ks-script-ycjz7w70
drwx------ 3 root root 17 Nov 4 15:27 systemd-private-fc7987305264446894ed89562b666584-httpd.service-Rm1Aaf
drwx------ 2 root root 6 Nov 3 09:19 vmware-root_956-2722239132
drwx------ 2 root root 6 Nov 4 15:27 vmware-root_958-2730693406
drwx------. 2 root root 6 Nov 3 09:16 vmware-root_961-4248090753
drwx------. 2 root root 6 Nov 1 17:21 vmware-root_979-4290625299
drwx------ 2 root root 6 Nov 3 13:56 vmware-root_982-2965972296
[root@master ~]# salt 'node1' file.directory_exists /tmp/vmware-root_956-2722239132
node1:
True
file.diskusage
递归计算指定路径的磁盘使用情况并以字节为单位返回
[root@master ~]# salt '*' cmd.run 'du -sb /opt'
node1:
6 /opt
master:
6 /opt
[root@master ~]# salt '*' file.diskusage '/opt'
node1:
0
master:
0
file.file_exists
判断指定文件是否存在
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 16
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 14 root root 4096 Nov 4 15:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 Nov 4 16:01 lyw
drwxr-xr-x 2 root root 6 Nov 4 16:01 syb
// abc文件存在,返回True
[root@master ~]# salt 'node1' file.file_exists /root/abc
node1:
True
// abf文件不存在,返回Flase
[root@master ~]# salt 'node1' file.file_exists /root/abf
node1:
False
// syb是目录,不是文件,即使存在,也返回Flase
[root@master ~]# salt 'node1' file.file_exists /root/syb
node1:
False
file.find
类似 find 命令并返回符合指定条件的路径列表
The options include match criteria:
name = path-glob # case sensitive
iname = path-glob # case insensitive
regex = path-regex # case sensitive
iregex = path-regex # case insensitive
type = file-types # match any listed type
user = users # match any listed user
group = groups # match any listed group
size = [+-]number[size-unit] # default unit = byte
mtime = interval # modified since date
grep = regex # search file contents
and/or actions:
delete [= file-types] # default type = 'f'
exec = command [arg ...] # where {} is replaced by pathname
print [= print-opts]
The default action is print=path
path-glob:
* = match zero or more chars
? = match any char
[abc] = match a, b, or c
[!abc] or [^abc] = match anything except a, b, and c
[x-y] = match chars x through y
[!x-y] or [^x-y] = match anything except chars x through y
{a,b,c} = match a or b or c
path-regex
: a Python Regex (regular expression) pattern to match pathnames
file-types
: a string of one or more of the following:
a: all file types
b: block device
c: character device
d: directory
p: FIFO (named pipe)
f: plain file
l: symlink
s: socket
users
: a space and/or comma separated list of user names and/or uids
groups
: a space and/or comma separated list of group names and/or gids
size-unit
:
b: bytes
k: kilobytes
m: megabytes
g: gigabytes
t: terabytes
interval:
[<num>w] [<num>d] [<num>h] [<num>m] [<num>s]
where:
w: week
d: day
h: hour
m: minute
s: second
print-opts: a comma and/or space separated list of one or more of the following:
group: group name
md5: MD5 digest of file contents
mode: file permissions (as integer)
mtime: last modification time (as time_t)
name: file basename
path: file absolute path
size: file size in bytes
type: file type
user: user name
示例:
salt '*' file.find / type=f name=\*.bak size=+10m
salt '*' file.find /var mtime=+30d size=+10m print=path,size,mtime
salt '*' file.find /var/log name=\*.[0-9] mtime=+30d size=+10m delete
file.get_gid
获取指定文件的gid
[root@master ~]# salt '*' cmd.run 'ls -l /root/anaconda-ks.cfg'
node1:
-rw-------. 1 root root 1352 Nov 1 17:21 /root/anaconda-ks.cfg
master:
-rw-------. 1 root root 1352 Nov 1 17:14 /root/anaconda-ks.cfg
[root@master ~]# salt '*' file.get_gid '/root/anaconda-ks.cfg'
node1:
0
master:
0
file.get_group
获取指定文件的组名
// 创建文件
[root@master ~]# salt 'node1' cmd.run 'touch syblyw'
node1:
// 查看属性
[root@master ~]# salt 'node1' cmd.run 'ls -l /root/syblyw'
node1:
-rw-r--r-- 1 root root 0 Nov 4 16:08 /root/syblyw
// 查看文件组名
[root@master ~]# salt 'node1' file.get_group root/syblyw
node1:
root
file.get_hash
获取指定文件的hash值,该值通过 sha256 算法得来
[root@master ~]# salt '*' cmd.run 'sha256sum /root/anaconda-ks.cfg'
node1:
cf7abcbd6cc1ed61cff07a739cd0a76e0a0908b7f97657104772b303d8d86d25 /root/anaconda-ks.cfg
master:
c55207055ffddc7c19833d70bc10c98cabc7ac8ce1b0654dba054af9501926e8 /root/anaconda-ks.cfg
[root@master ~]# salt '*' file.get_hash /root/anaconda-ks.cfg
node1:
cf7abcbd6cc1ed61cff07a739cd0a76e0a0908b7f97657104772b303d8d86d25
master:
c55207055ffddc7c19833d70bc10c98cabc7ac8ce1b0654dba054af9501926e8
file.get_mode
获取指定文件的权限,以数字方式显示
[root@master ~]# salt '*' cmd.run 'ls -l /root/anaconda-ks.cfg'
node1:
-rw-------. 1 root root 1352 Nov 1 17:21 /root/anaconda-ks.cfg
master:
-rw-------. 1 root root 1352 Nov 1 17:14 /root/anaconda-ks.cfg
[root@master ~]# salt '*' file.get_mode /root/anaconda-ks.cfg
node1:
0600
master:
0600
file.get_selinux_context
获取指定文件的 SELINUX 上下文信息
[root@master ~]# salt '*' cmd.run 'ls -Z /root/anaconda-ks.cfg'
node1:
system_u:object_r:admin_home_t:s0 /root/anaconda-ks.cfg
master:
system_u:object_r:admin_home_t:s0 /root/anaconda-ks.cfg
[root@master ~]# salt '*' file.get_selinux_context /root/anaconda-ks.cfg
node1:
system_u:object_r:admin_home_t:s0
master:
system_u:object_r:admin_home_t:s0
file.get_sum
按照指定的算法计算指定文件的特征码并显示,默认使用的sha256算法。
该函数可使用的算法参数有:
- md5
- sha1
- sha224
- sha256 (default)
- sha384
- sha512
// 创建文件
[root@master ~]# salt '*' cmd.run 'touch syb'
node1:
master:
// 查看sha256算法的值
[root@master ~]# salt '*' cmd.run 'sha256sum /root/syb'
node1:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /root/syb
master:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /root/syb
[root@master ~]# salt '*' file.get_sum /root/syb
node1:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
master:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
// 查看md5算法的值
[root@master ~]# salt '*' cmd.run 'md5sum /root/syb'
node1:
d41d8cd98f00b204e9800998ecf8427e /root/syb
master:
d41d8cd98f00b204e9800998ecf8427e /root/syb
[root@master ~]# salt '*' file.get_sum /root/syb md5
node1:
d41d8cd98f00b204e9800998ecf8427e
master:
d41d8cd98f00b204e9800998ecf8427e
file.get_uid与file.get_user
获取指定文件的 uid 或 用户名
// 查看文件属性
[root@master ~]# salt '*' cmd.run 'ls -l /root/syb'
master:
-rw-r--r-- 1 root root 0 Nov 4 16:14 /root/syb
node1:
-rw-r--r-- 1 root root 0 Nov 4 16:14 /root/syb
// 查看文件UID
[root@master ~]# salt '*' file.get_uid /root/syb
node1:
0
master:
0
// 查看文件用户名
[root@master ~]# salt '*' file.get_user /root/syb
master:
root
node1:
root
file.gid_to_group
将指定的 gid 转换为组名并显示
// 创建tom用户
[root@master ~]# salt 'master' user.add tom
master:
True
[root@master ~]# id tom
uid=2002(tom) gid=2002(tom) 组=2002(tom)
// 查看用户组
[root@master ~]# cat /etc/group | tail -2
lyw:x:2001:
tom:x:2002:
[root@master ~]# salt 'master' file.gid_to_group 2001
master:
lyw
[root@master ~]# salt 'master' file.gid_to_group 2002
master:
tom
[root@master ~]# salt 'master' file.gid_to_group 0
master:
root
file.group_to_gid
将指定的组名转换为 gid 并显示
[root@master ~]# salt 'master' file.group_to_gid root
master:
0
[root@master ~]# salt 'master' file.group_to_gid lyw
master:
2001
[root@master ~]# salt 'master' file.group_to_gid tom
master:
2002
file.grep
在指定文件中检索指定内容
该函数支持通配符,若在指定的路径中用通配符则必须用双引号引起来
salt '*' file.grep /etc/passwd nobody
salt '*' file.grep /etc/sysconfig/network-scripts/ifcfg-eth0 ipaddr -- -i
salt '*' file.grep /etc/sysconfig/network-scripts/ifcfg-eth0 ipaddr -- -i -B2
salt '*' file.grep "/etc/sysconfig/network-scripts/*" ipaddr -- -i -l
file.is_blkdev
判断指定的文件是否是块设备文件
[root@master ~]# salt '*' cmd.run 'ls -l /dev/sr0'
node1:
brw-rw---- 1 root cdrom 11, 0 Nov 4 15:27 /dev/sr0
master:
brw-rw---- 1 root cdrom 11, 0 Nov 4 15:27 /dev/sr0
[root@master ~]# salt '*' file.is_blkdev /dev/sr0
node1:
True
master:
True
file.lsattr
检查并显示出指定文件的属性信息
[root@master ~]# salt 'node1' cmd.run 'lsattr /root/abc'
node1:
-----a-------------- /root/abc
[root@master ~]# salt 'node1' cmd.run 'chattr +i /root/abc'
node1:
[root@master ~]# salt 'node1' cmd.run 'lsattr /root/abc'
node1:
----ia-------------- /root/abc
[root@master ~]# salt 'node1' file.lsattr '/root/abc'
node1:
----------
/root/abc:
- i
- a
file.mkdir
创建目录并设置属主、属组及权限
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
// 创建目录lyw
[root@master ~]# salt 'node1' file.mkdir /root/lyw
node1:
True
// 创建目录
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
drwxr-xr-x 2 root root 6 Nov 4 16:41 lyw
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
// 创建lyw用户
[root@master ~]# salt 'node1' user.add lyw
node1:
True
// 创建目录并设置属主、属组及权限
[root@master ~]# salt 'node1' file.mkdir /root/syblyw lyw lyw 400
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
drwxr-xr-x 2 root root 6 Nov 4 16:41 lyw
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
dr-------- 2 lyw lyw 6 Nov 4 16:45 syblyw
file.move
移动或重命名
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 abb
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
drwxr-xr-x 2 root root 6 Nov 4 16:41 lyw
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
dr-------- 2 lyw lyw 6 Nov 4 16:45 syblyw
// 先删除权限
[root@master ~]# salt 'node1' cmd.run 'lsattr /root/abc'
node1:
----ia-------------- /root/abc
[root@master ~]# salt 'node1' cmd.run 'lsattr /root/abb'
node1:
-------------------- /root/abb
[root@master ~]# salt 'node1' cmd.run 'chattr -ai /root/abc'
node1:
[root@master ~]# salt 'node1' cmd.run 'lsattr /root/abc'
node1:
-------------------- /root/abc
// 重命名
[root@master ~]# salt 'node1' file.move /root/abb /root/aaa:
node1:
----------
comment:
'/root/abb' moved to '/root/aaa:'
result:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-r--r-- 1 root root 14 Nov 4 15:50 aaa:
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
drwxr-xr-x 2 root root 6 Nov 4 16:41 lyw
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
dr-------- 2 lyw lyw 6 Nov 4 16:45 syblyw
// 移动
[root@master ~]# salt 'node1' cmd.run 'ls -l /opt'
node1:
total 0
[root@master ~]# salt 'node1' file.move /root/abc /opt
node1:
----------
comment:
'/root/abc' moved to '/opt'
result:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /opt'
node1:
total 4
-rw-r--r-- 1 root root 14 Nov 4 15:39 abc
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 8
-rw-r--r-- 1 root root 14 Nov 4 15:50 aaa:
drwxrwxrwt. 9 root root 187 Nov 4 16:27 abd
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxrwxr-x 2 root root 6 Nov 4 16:37 ddd
drwxr-xr-x 2 root root 6 Nov 4 16:41 lyw
-rw-r--r-- 1 root root 0 Nov 4 16:14 syb
dr-------- 2 lyw lyw 6 Nov 4 16:45 syblyw
file.prepend
把文本插入指定文件的开头
[root@master ~]# salt 'node1' cmd.run 'cat /root/syb'
node1:
hello world
hello lyw
hello syb
[root@master ~]# salt 'node1' file.prepend /root/syb "hehe" "xixi" "haha"
node1:
Prepended 3 lines to "/root/syb"
[root@master ~]# salt 'node1' cmd.run 'cat /root/syb'node1:
hehe
xixi
haha
hello world
hello lyw
hello syb
file.sed
修改文本文件的内容
hehe
xixi
haha
hello world
hello lyw
hello syb
[root@master ~]# salt 'node1' file.sed /root/syb "hello" "hi"
node1:
----------
pid:
13641
retcode:
0
stderr:
stdout:
[root@master ~]# salt 'node1' cmd.run 'cat /root/syb'
node1:
hehe
xixi
haha
hi world
hi lyw
hi syb
file.read
读取文件内容
[root@master ~]# salt 'node1' cmd.run 'cat /root/syb'
node1:
hehe
xixi
haha
hi world
hi lyw
hi syb
[root@master ~]# salt 'node1' file.read /root/syb
node1:
hehe
xixi
haha
hi world
hi lyw
hi syb
file.readdir
列出指定目录下的所有文件或目录,包括隐藏文件
[root@master ~]# salt 'node1' file.readdir /root
node1:
- .
- ..
- .bash_logout
- .bash_profile
- .bashrc
- .cshrc
- .tcshrc
- anaconda-ks.cfg
- .config
- .bash_history
- .viminfo
- syb.bak
- syb
file.remove
删除指定的文件或目录,若给出的是目录,将递归删除
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
-rw-r--r-- 1 root root 38 Nov 7 14:19 syb
-rw-r--r-- 1 root root 47 Nov 7 14:17 syb.bak
drwxr-xr-x 2 root root 6 Nov 7 14:22 syblyw
// 删除文件
[root@master ~]# salt 'node1' file.remove /root/syb
node1:
True
// 删除目录
[root@master ~]# salt 'node1' file.remove /root/syblyw
node1:
True
// 查看结果
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 8
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
-rw-r--r-- 1 root root 47 Nov 7 14:17 syb.bak
file.rename
重命名文件或目录
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 4
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 Nov 7 14:26 lyw
drwxr-xr-x 2 root root 6 Nov 7 14:26 syb
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
[root@master ~]# salt 'node1' file.rename /root/lyw /root/ccy
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 4
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:26 syb
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
file.set_mode
给指定文件设置权限
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 4
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:26 syb
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
[root@master ~]# salt 'node1' file.set_mode /root/ccy 0400
node1:
0400
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 4
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
dr-------- 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:26 syb
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
file.symlink
给指定的文件创建软链接
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 4
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
dr-------- 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:26 syb
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
[root@master ~]# salt 'node1' file.symlink /root/ccy /opt/ccy
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /root ; ls -l /opt/ccy'
node1:
total 4
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
dr-------- 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:26 syb
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
lrwxrwxrwx 1 root root 9 Nov 7 14:29 /opt/ccy -> /root/ccy
file.touch
创建空文件或更新时间戳
[root@master ~]# salt 'node1' cmd.run 'ls -l /opt'
node1:
total 0
lrwxrwxrwx 1 root root 9 Nov 7 14:29 ccy -> /root/ccy
drwxr-xr-x 2 root root 6 Nov 7 14:31 dy
// 创建空文件b、c
[root@master ~]# salt 'node1' file.touch /opt/b
node1:
True
[root@master ~]# salt 'node1' file.touch /opt/c
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /opt'
node1:
total 0
-rw-r--r-- 1 root root 0 Nov 7 14:31 b
-rw-r--r-- 1 root root 0 Nov 7 14:31 c
lrwxrwxrwx 1 root root 9 Nov 7 14:29 ccy -> /root/ccy
drwxr-xr-x 2 root root 6 Nov 7 14:31 dy
// 文件已存在,重复操作,更新时间戳
[root@master ~]# salt 'node1' file.touch /opt/c
node1:
True
[root@master ~]# salt 'node1' cmd.run 'ls -l /opt'
node1:
total 0
-rw-r--r-- 1 root root 0 Nov 7 14:31 b
-rw-r--r-- 1 root root 0 Nov 7 14:32 c
lrwxrwxrwx 1 root root 9 Nov 7 14:29 ccy -> /root/ccy
drwxr-xr-x 2 root root 6 Nov 7 14:31 dy
file.uid_to_user
将指定的 uid 转换成用户名显示出来
[root@master ~]# salt '*' file.uid_to_user 0
node1:
root
master:
root
[root@master ~]# salt 'master' file.uid_to_user 2001
master:
syb
file.user_to_uid
将指定的用户转换成 uid 并显示出来
[root@master ~]# salt '*' file.user_to_uid root
master:
0
node1:
0
[root@master ~]# salt 'master' file.user_to_uid syb
master
2001
// 没有该用户,不显示内容
[root@master ~]# salt 'master' file.user_to_uid aaa
master:
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 8
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
dr-------- 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:37 syb
-rw-r--r-- 1 root root 32 Nov 7 14:37 sybccy
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw
[root@master ~]# salt 'node1' cmd.run 'cat /root/sybccy'
node1:
hello world
hello ccy
hello lyw
// sybccy文件已存在,直接覆盖文件内容
[root@master ~]# salt 'node1' file.write /root/sybccy 'This is test'
node1:
Wrote 1 lines to "/root/sybccy"
[root@master ~]# salt 'node1' cmd.run 'cat /root/sybccy'
node1:
This is test
// b文件不存在,会自动先创建文件,在进行覆盖内容
[root@master ~]# salt 'node1' file.write /root/b 'This is test' 'hhah'
node1:
Wrote 2 lines to "/root/b"
[root@master ~]# salt 'node1' cmd.run 'cat /root/b'
node1:
This is test
hhah
[root@master ~]# salt 'node1' cmd.run 'ls -l /root'
node1:
total 12
-rw-------. 1 root root 1352 Nov 1 17:21 anaconda-ks.cfg
-rw-r--r-- 1 root root 18 Nov 7 14:38 b
dr-------- 2 root root 6 Nov 7 14:26 ccy
drwxr-xr-x 2 root root 6 Nov 7 14:37 syb
-rw-r--r-- 1 root root 13 Nov 7 14:38 sybccy
-rw-r--r-- 1 root root 0 Nov 7 14:26 syblyw