saltstsck 远程执行详解

作者: print("") 分类: linux 发布时间: 2017-12-27 23:16


saltstsck 远程执行详解

word文档远程执行详解 远程执行详解
远程执行的三大模块

  1. 目标
  2. 模块
  3. 返回

一、目标
执行一条命令
[root@agent ~]# salt ‘*’ cmd.run ‘w’
liang:
18:47:14 up 23:59,  3 users,  load average: 0.04, 0.01, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     :0               12Nov17 25days 47.94s 47.94s /usr/bin/Xorg :
root     pts/0    :0.0             12Nov17  1:08m  0.30s  0.30s /bin/bash
root     pts/2    192.168.57.1     17:39   19:47   0.10s  0.10s -bash
dome_1:
04:58:02 up 1 day, 21 min,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     :0               Thu05   24:21m 26.75s 26.75s /usr/bin/Xorg :
root     pts/0    :0.0             Thu06    5:44m  0.06s  0.06s /bin/bash
root     pts/2    192.168.57.1     04:05   51:06   0.03s  0.03s -bash
[root@agent ~]#
############注释###################
Salt 的命令
‘*’  是执行的主机
Cmd 是模块
Run  是cmd模块的方法
‘w’ 是执行的命令
通配符的使用
salt ‘*’ test.ping
前面的通配符的使用
salt ‘*.example.net’ test.ping
salt ‘*.example.*’ test.ping
单一的通配符的使用
salt ‘web?.example.net’ test.ping
通过[] 中括号的配置
salt ‘web[1-5]’ test.ping
也可以[1,3]这样的匹配
salt ‘web[1,3]’ test.ping
也可以配置字母
salt ‘web-[x-z]’ test.ping
通过正则表达式
Web1-prod and web1-devel 匹配
salt -E ‘web1-(prod|devel)’ test.ping
在top 中使用正则表达式
base:  ‘web1-(prod|devel)’:  – match: pcre  – webserver
测试ID的可用性
salt -L ‘web1,web2,web3’ test.ping
 
grains的使用方式
salt -G ‘os:CentOS’ test.pingsalt -G ‘cpuarch:x86_64’ grains.item num_cpus
pilar 的使用方式
salt -I ‘somekey:specialvalue’ test.pingsalt -I ‘foo:bar:baz*’ test.ping
-S的使用方式 后面跟着是ip地址 或者网段
salt -S 192.168.40.20 test.pingsalt -S 2001:db8::/64 test.ping
也可以使用子网的方式-C 来列出主机 混合模式
salt -C ‘S@192.168.57.0/24 and G@os:CentOs’ test.ping
 
混合有那些选项

Letter Match Type Example Alt Delimiter?
G Grains glob G@os:Ubuntu Yes
E PCRE Minion ID E@web\d+\.(dev|qa|prod)\.loc No
P Grains PCRE P@os:(RedHat|Fedora|CentOS) Yes
L List of minions L@minion1.example.com,minion3.domain.com or bl*.domain.com No
I Pillar glob I@pdata:foobar Yes
J Pillar PCRE J@pdata:^(foo|bar)$ Yes
S Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100 No
R Range cluster R@%foo.bar No

Matchers can be joined using boolean and, or, and not operators.
这些东西可以可以混合使用 and or not
举个例子
salt -C ‘webserv* and G@os:Debian or E@web-dc1-srv.*’ test.ping
 
节点组
The nodegroups master config file parameter is used to define nodegroups. Here’s an example nodegroup configuration within /etc/salt/master:
nodegroups:  group1: ‘L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com’  group2: ‘G@os:Debian and foo.domain.com’  group3: ‘G@os:Debian and N@group1’  group4:    – ‘G@foo:bar’    – ‘or’    – ‘G@foo:baz’
测试组的就用-N
salt -N group1 test.ping
 
 
 
 
二、模块
官方文档里面注明了所有模块的用法 https://docs.saltstack.com/en/latest/ref/modules/all/ 就挑几个模块去尝试一下
 
Service 模块
判断当前服务是否在运行
salt ‘*’ service.available sshd
返回所有可用服务的列表
salt ‘*’ service.get_all salt.modules.service.missing名字 service.available的反面。返回True如果指定的服务不可用,否则返回 False。
CLI示例:
salt ‘*’ service.missing sshd salt.modules.service.reload名字 通过调用服务重载刷新配置文件。不执行完全重新启动。
CLI示例:
salt ‘*’ service.reload <服务名称> salt.modules.service.restart名字 重新启动指定的服务
CLI示例:
salt ‘*’ service.restart <服务名称> salt.modules.service.status名字 重新启动指定的服务
CLI示例:
salt ‘*’ service.status <服务名称> salt.modules.service.stop名字 重新启动指定的服务
CLI示例:
salt ‘*’ service.stop <服务名称> salt.modules.service.start名字 重新启动指定的服务
CLI示例:
salt ‘*’ service.start <服务名称>
 
network 模块 salt.modules.network.active_tcp() 返回一个包含所有正在运行的TCP连接信息的字典(目前只有linux和solaris)
CLI示例:
salt ‘*’ network.active_tcp salt.modules.network.arp() 从仆从中返回ARP表
CLI示例:
salt ‘*’ network.arp
  salt.modules.network.connect主机端口=** kwargs 测试使用特定端口的主机与主机的连接。
CLI示例:
salt ‘*’ network.connect archlinux.org 80
 
salt ‘*’ network.connect archlinux.org 80  timeout = 3
 
salt ‘*’ network.connect archlinux.org 80  timeout = 3  family = ipv4
salt ‘*’ network.connect google -public-dns-a.google.com port = 53  proto = udp timeout = 3 salt.modules.network.convert_cidrcidr 返回一个cidr地址的网络和子网掩码
CLI示例:
salt ‘*’ network.convert_cidr 172.31.0.0/16
  salt.modules.network.default_route家庭= 从路由表中返回默认路由 2015.8.0版中进行了更改:增加了对SunOS(Solaris 10,Illumos,SmartOS)
CLI示例:
salt ‘*’ network.default_route salt.modules.network.dig主机 用dig执行DNS查询
CLI示例:
salt ‘*’ network.dig archlinux.org salt.modules.network.get_bufsizeiface 返回网络缓冲区大小为一个字典(目前只有Linux)
CLI示例:
salt ‘*’ network.get_bufsize eth0 salt.modules.network.get_fqdn() 获取完全合格的域名
CLI示例:
salt ‘*’ network.get_fqdn
  salt.modules.network.get_hostname() 获取主机名
CLI示例:
salt ‘*’ network.get_hostname salt.modules.network.get_route(ip) 返回给定目标IP的路由信息支持
CLI示例:
salt ‘*’ network.get_route 10.10.10.10 salt.modules.network.hw_addriface 返回给定接口的硬件地址(又名MAC地址)
CLI示例:
salt ‘*’ network.hw_addr eth0 salt.modules.network.hwaddriface 这个函数是一个别名hw_addr。
返回给定接口的硬件地址(又名MAC地址)
CLI示例:
salt ‘*’ network.hw_addr eth0 salt.modules.network.ifacestartswithcidr 从特定的CIDR中检索接口名称 2016.11.0版新增功能 CLI示例:
salt ‘*’ network.ifacestartswith 10.0 salt.modules.network.in_subnetcidr 如果主机位于指定的子网内,则返回True,否则返回False。
CLI示例:
salt ‘*’ network.in_subnet 10.0.0.0/16 salt.modules.network.interfaceiface 返回给定接口的inet地址 新版本2014.7.0 CLI示例:
salt ‘*’ network.interface eth0 salt.modules.network.interface_ipiface 返回给定接口的inet地址
CLI示例:
salt ‘*’ network.interface_ip eth0
  salt.modules.network.interfaces() 返回有关所有接口的信息字典
CLI示例:
salt ‘*’ network.interfaces
  salt.modules.network.ip_addrsinterface = Noneinclude_loopback = Falsecidr = Nonetype = None 返回分配给主机的IPv4地址列表。除非指定“include_loopback = True”,否则将忽略127.0.0.1。如果提供了“接口”,则只返回来自该接口的IP地址。通过’cidr =“10.0.0.0/8”’提供CIDR将只返回该子网内的地址。如果“类型”是“公共”,那么只有公共地址将被返回。同上’类型’=’私人’。
CLI示例:
salt ‘*’ network.ip_addrs salt.modules.network.mod_hostname主机名 修改主机名 2015.8.0版中进行了更改:增加了对SunOS(Solaris 10,Illumos,SmartOS)
CLI示例:
salt ‘*’ network.mod_hostname master.saltstack.com salt.modules.network.netstat() 返回有关打开的端口和状态的信息 注意 在BSD minions上,输出包含从sockstat / fstat输出中获取的每个netstat条目的PID信息(如果可用)。 2014.1.4版本中进行了更改:增加了对OpenBSD,FreeBSD和NetBSD的支持 在版本2015.8.0中更改:添加了对SunOS的支持 2016.11.4版中进行了更改:添加了对AIX的支持
CLI示例:
salt ‘*’ network.netstat salt.modules.network.pinghosttimeout = Falsereturn_boolean = False 对主机执行ICMP ping 在版本2015.8.0中更改:添加了对SunOS的支持
CLI示例:
salt’*’ network.ping archlinux.org 2015.5.0版新增功能 返回True或False而不是Ping输出。
salt ‘*’ network.ping archlinux.org return_boolean = True
设置在几秒钟内等待响应的时间。
salt ‘*’ network.ping archlinux.org timeout = 3 salt.modules.network.reverse_ipip_addr 返回反向的IP地址 在版本2015.8.0中更改: IPv6支持
CLI示例:
salt ‘*’ network.reverse_ip 172.17.0.4 salt.modules.network.routes家庭= 从路由表中返回当前配置的路由
CLI示例:
salt ‘*’ network.routes salt.modules.network.traceroute主机 对第三方主机执行traceroute
CLI示例:
salt ‘*’ network.traceroute archlinux.org
 
salt 的acl
在vim /etc/salt/master 中修改
client_acl:
liang:          ###这里代表的是用户
– test.ping
– network.*      ##这里是模块
重启一下
[root@agent ~]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [确定]
Starting salt-master daemon: [确定]
#新建一个用户
[root@agent ~]# useradd liang
给用户权限
[root@agent ~]# chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master
切换到liang用户测试一下
[liang@agent root]$ salt ‘*’ test.ping
liang:
True
dome_1:
True
# 当用到cmd模块的时候发现没有权限
[liang@agent root]$ salt ‘*’ cmd.run ‘w’
Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).
设置user01 用户只能在liang这台主机上执行test.ping这个
client_acl:
liang:
– test.ping
– network.*
user01:
– liang:
– test.ping
测试一下, 已经成功限制了
[user01@agent root]$ salt ‘liang’ test.ping
[WARNING ] Failed to open log file, do you have permission to write to /var/log/salt/master?
liang:
True
[user01@agent root]$ salt ‘liang’ cmd.run ‘w’
[WARNING ] Failed to open log file, do you have permission to write to /var/log/salt/master?
Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).
[user01@agent root]$
还有一个黑名单的设置
在主配置文件中
#client_acl_blacklist:
#  users:
#    – root        #### 禁止root 使用
#    – ‘^(?!sudo_).*$’   #  all non sudo users       ###禁止非sudo的用户使用
#  modules:
#    – cmd     ##禁止使用的模块
 
 
三、返回
官方的地址: https://docs.saltstack.com/en/latest/ref/returners/all/

carbon_return 从salt中获取数据并将其“返回”到碳接收器中
cassandra_cql_return 将数据返回到cassandra服务器
cassandra_return 将数据返回给Cassandra ColumnFamily
couchbase_return Couchbase简单的返回者。
couchdb_return CouchDB简单的返回者。
django_return 返回者将通知Django系统使用Django的信号系统返回返回。
elasticsearch_return 将数据返回给elasticsearch服务器进行索引。
etcd_return 将数据返回到一个etcd服务器或群集
highstate_return 通过HTML电子邮件或HTML文件返回一个高状态(或其他任何以兼容格式返回数据的状态函数)的结果。
hipchat_return 通过hipchat返回盐的数据。
influxdb_return 将数据返回到influxdb服务器。
kafka_return 将数据返回到Kafka主题
librato_return 盐回归者返回国家最高统计资料到Librato
local 本地返回者用于测试返回者接口,它只是打印
local_cache 将数据返回到本地作业缓存
mattermost_returner 通过mattermost返回盐的数据
memcache_return 将数据返回到一个memcache服务器
mongo_future_return 将数据返回给mongodb服务器
mongo_return 将数据返回给mongodb服务器
multi_returner 读/写多个返回者
mysql 返回数据到一个MySQL服务器
nagios_return 将盐数据返回到Nagios
odbc 将数据返回到符合ODBC的服务器。
pgjsonb 用Pg的jsonb数据类型存储json数据,将数据返回到PostgreSQL服务器
postgres 将数据返回到postgresql服务器
postgres_local_cache 使用postgresql服务器作为主作业缓存。
pushover_returner 通过pushover返回盐数据(http://www.pushover.net
rawfile_json 从盐中获取数据并将其“返回”到包含json的原始文件中,每个事件一行。
redis_return 将数据返回到Redis服务器
sentry_return 将执行结果报告给哨兵的盐回归者。
slack_returner 通过松弛返回盐数据
sms_return 通过短信返回数据。
smtp_return 通过电子邮件返回盐数据
splunk 通过HTTP事件收集器发送json响应数据到Splunk
sqlite3_return 将minion返回数据插入sqlite3数据库
syslog_return 将数据返回到主机操作系统的syslog工具
xmpp_return 通过xmpp返回盐数据
zabbix_return 将salt数据返回到Zabbix

返回给mysql 测试 https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql  
首先在mysql中创建表结构 CREATE DATABASE `salt` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; USE `salt`; — Table structure for table `jids` DROP TABLE IF EXISTS `jids`;CREATE TABLE `jids` (  `jid` varchar(255) NOT NULL,  `load` mediumtext NOT NULL, UNIQUE KEY `jid` (`jid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE INDEX jid ON jids(jid) USING BTREE; — Table structure for table `salt_returns` DROP TABLE IF EXISTS `salt_returns`;CREATE TABLE `salt_returns` (  `fun` varchar(50) NOT NULL,  `jid` varchar(255) NOT NULL,  `return` mediumtext NOT NULL,  `id` varchar(255) NOT NULL,  `success` varchar(10) NOT NULL,  `full_ret` mediumtext NOT NULL,  `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY `id` (`id`), KEY `jid` (`jid`), KEY `fun` (`fun`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; — Table structure for table `salt_events` DROP TABLE IF EXISTS `salt_events`;CREATE TABLE `salt_events` (`id` BIGINT NOT NULL AUTO_INCREMENT,`tag` varchar(255) NOT NULL,`data` mediumtext NOT NULL,`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,`master_id` varchar(255) NOT NULL,PRIMARY KEY (`id`),KEY `tag` (`tag`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
新建一个连接的用户
grant all on salt.* to  salt@’%’ identified by ‘salt’;
返回是从minion 中返回的,所以所有的minion都需要安装依赖包
[root@agent ~]# yum install MySQL-python -y
设置mysql连接 可以写在master 或者minion中
写在配置文件最后面
vim /etc/salt/master#return: mysqlmysql.host: ‘192.168.57.132’mysql.user: ‘salt’mysql.pass: ‘salt’mysql.db: ‘salt’
重启master
[root@agent ~]# /etc/init.d/salt-master restartStopping salt-master daemon: [确定]Starting salt-master daemon: [确定]
测试一下
[root@agent ~]# salt ‘*’ test.ping –return mysqlliang:    Truedome_1:True
查看一下数据库
mysql> select * from salt_returns;Empty set (0.00 sec)
发现什么数据都没有。查看一个minion 的日志
日志中发现连不进去数据库,
2017-12-08 10:15:07,155 [salt.loaded.int.module.tls                 ][ERROR   ][27289] You should upgrade pyOpenSSL to at least 0.14.1 to enable the use of X509 extensions2017-12-08 10:16:09,418 [salt.loaded.int.returner.mysql           ][CRITICAL][27306] MySQL returner could not connect to database: (2005, “Unknown MySQL server host ‘salt’ (2)”)2017-12-08 10:16:09,419 [salt.loaded.int.returner.mysql           ][CRITICAL][27306] Could not store return with MySQL returner. MySQL server unavailable.2017-12-08 10:22:54,672 [salt.loaded.int.returner.mysql           ][CRITICAL][27406] MySQL returner could not connect to database: (2005, “Unknown MySQL server host ‘salt’ (2)”)2017-12-08 10:22:54,673 [salt.loaded.int.returner.mysql           ][CRITICAL][27406] Could not store return with MySQL returner. MySQL server unavailable.2017-12-08 10:22:56,086 [salt.loaded.int.returner.mysql           ][CRITICAL][27412] MySQL returner could not connect to database: (2005, “Unknown MySQL server host ‘salt’ (2)”)2017-12-08 10:22:56,086 [salt.loaded.int.returner.mysql           ][CRITICAL][27412] Could not store return with MySQL returner. MySQL server unavailable.
那么就在minion中写入数据库信息
vim /etc/salt/minionreturn: mysqlmysql.host: ‘192.168.57.132’mysql.user: ‘salt’mysql.pass: ‘salt’mysql.db: ‘salt’mysql.port: 3306
重启minion
[root@liang ~]# /etc/init.d/salt-minion restartStopping salt-minion daemon: [确定]Starting salt-minion daemon: [确定]
后面再次测试一下
[root@agent ~]# salt ‘*’ test.ping –return mysqlliang:    Truedome_1:    True
查看数据库已经有了数据了
mysql> select * from salt_returns;+———–+———————-+——–+——–+———+————————————————————————————————————————————+———————+| fun       | jid                  | return | id     | success | full_ret                                                                                                                           | alter_time          |+———–+———————-+——–+——–+———+————————————————————————————————————————————+———————+| test.ping | 20171208061402223850 | true   | dome_1 | 1       | {“fun_args”: [], “jid”: “20171208061402223850”, “return”: true, “retcode”: 0, “success”: true, “fun”: “test.ping”, “id”: “dome_1”} | 2017-12-08 06:14:02 || test.ping | 20171208061402223850 | true   | liang  | 1       | {“fun_args”: [], “jid”: “20171208061402223850”, “return”: true, “retcode”: 0, “success”: true, “fun”: “test.ping”, “id”: “liang”}  | 2017-12-08 06:14:02 |+———–+———————-+——–+——–+———+————————————————————————————————————————————+———————+2 rows in set (0.00 sec)
如果master 想把执行的所有信息放入mysql中,应该设置master
#return: mysqlmaster_job_cache: mysqlmysql.host: ‘127.0.0.1’mysql.user: ‘root’mysql.pass: ‘123456’mysql.db: ‘salt’mysql.port: 3306
测试
[root@agent ~]# salt ‘*’ cmd.run ‘w’ liang:     00:34:44 up 1 day,  5:47,  3 users,  load average: 0.00, 0.00, 0.00    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT    root     tty1     :0               12Nov17 25days 48.28s 48.28s /usr/bin/Xorg :    root     pts/0    :0.0             12Nov17  6:55m  0.30s  0.30s /bin/bash    root     pts/2    192.168.57.1     00:12   17:24   0.04s  0.04s -bashdome_1:     10:45:32 up 1 day,  6:09,  3 users,  load average: 0.00, 0.00, 0.00    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT    root     tty1     :0               Thu05   30:09m 27.50s 27.50s /usr/bin/Xorg :    root     pts/0    :0.0             Thu06   11:32m  0.06s  0.06s /bin/bashroot     pts/2    192.168.57.1     09:57   15.00s  0.10s  0.10s –bash
查看数据库 , 已经有数据了
*************************** 11. row ***************************       fun: cmd.run       jid: 20171208063424148192    return: ” 00:34:44 up 1 day,  5:47,  3 users,  load average: 0.00, 0.00, 0.00\nUSER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT\nroot     tty1     :0               12Nov17 25days 48.28s 48.28s /usr/bin/Xorg :\nroot     pts/0    :0.0             12Nov17  6:55m  0.30s  0.30s /bin/bash\nroot     pts/2    192.168.57.1     00:12   17:24   0.04s  0.04s -bash”        id: liang   success: 1  full_ret: {“fun_args”: [“w”], “jid”: “20171208063424148192”, “return”: ” 00:34:44 up 1 day,  5:47,  3 users,  load average: 0.00, 0.00, 0.00\nUSER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT\nroot     tty1     :0               12Nov17 25days 48.28s 48.28s /usr/bin/Xorg :\nroot     pts/0    :0.0             12Nov17  6:55m  0.30s  0.30s /bin/bash\nroot     pts/2    192.168.57.1     00:12   17:24   0.04s  0.04s -bash”, “retcode”: 0, “success”: true, “cmd”: “_return”, “_stamp”: “2017-12-07T22:34:24.194535”, “fun”: “cmd.run”, “id”: “liang”}alter_time: 2017-12-08 06:34:24*************************** 12. row ***************************       fun: cmd.run       jid: 20171208063424148192    return: ” 10:45:32 up 1 day,  6:09,  3 users,  load average: 0.00, 0.00, 0.00\nUSER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT\nroot     tty1     :0               Thu05   30:09m 27.50s 27.50s /usr/bin/Xorg :\nroot     pts/0    :0.0             Thu06   11:32m  0.06s  0.06s /bin/bash\nroot     pts/2    192.168.57.1     09:57   15.00s  0.10s  0.10s -bash”        id: dome_1   success: 1  full_ret: {“fun_args”: [“w”], “jid”: “20171208063424148192”, “return”: ” 10:45:32 up 1 day,  6:09,  3 users,  load average: 0.00, 0.00, 0.00\nUSER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT\nroot     tty1     :0               Thu05   30:09m 27.50s 27.50s /usr/bin/Xorg :\nroot     pts/0    :0.0             Thu06   11:32m  0.06s  0.06s /bin/bash\nroot     pts/2    192.168.57.1     09:57   15.00s  0.10s  0.10s -bash”, “retcode”: 0, “success”: true, “cmd”: “_return”, “_stamp”: “2017-12-07T22:34:24.206345”, “fun”: “cmd.run”, “id”: “dome_1”}alter_time: 2017-12-08 06:34:2412 rows in set (0.00 sec)
就是稍微慢了点,因为master 需要写入数据库

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

说点什么

avatar
  Subscribe  
提醒