return组件可以理解为SaltStack系统对执行Minion返回后的数据进行存储或者返回给其他程序,它支持多种存储方式,比如用MySQL、MongoDB、Redis、Memcache等,通过return我们可以对SaltStack的每次操作进行记录,对以后日志审计提供了数据来源。目前官方已经支持30种return数据存储与接口,我们可以很方便的配置与使用它。当然也支持自己定义的return,自定义的return需由python来编写。在选择和配置好要使用的return后,只需在salt命令后面指定return即可。
[root@master ~]# salt 'minion' sys.list_returners minion: - carbon - couchdb - etcd - highstate - local - local_cache - mattermost - multi_returner - pushover - rawfile_json - slack - slack_webhook - smtp - splunk - sqlite3 - syslog - telegram
1.1 return流程
return是在Master端触发任务,然后Minion接受处理任务后直接与return存储服务器建立连接,然后把数据return存到存储服务器。关于这点一定要注意,因为此过程都是Minion端操作存储服务器,所以要确保Minion端的配置跟依赖包是正确的,这意味着我们将必须在每个Minion上安装指定的return方式依赖包,假如使用Mysql作为return存储方式,那么我们将在每台Minion上安装python-mysql模块。
master上安装服务
# 下载仓库 [root@master ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub [root@master ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo [salt-latest-repo] name=Salt repo for RHEL/CentOS 8 PY3 baseurl=https://repo.saltproject.io/py3/redhat/8/x86_64/latest skip_if_unavailable=True failovermethod=priority enabled=1 enabled_metadata=1 gpgcheck=1 gpgkey=https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub [root@master ~]# ls /etc/yum.repos.d/ CentOS-Stream-AppStream.repo CentOS-Stream-Media.repo CentOS-Stream-BaseOS.repo CentOS-Stream-PowerTools.repo CentOS-Stream-Debuginfo.repo CentOS-Stream-RealTime.repo CentOS-Stream-Extras.repo salt.repo CentOS-Stream-HighAvailability.repo # 安装服务salt-master [root@master ~]# yum -y install salt-master # 启动 [root@master ~]# systemctl start salt-master
minion上安装服务
[root@minion ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub [root@minion ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo [salt-latest-repo] name=Salt repo for RHEL/CentOS 8 PY3 baseurl=https://repo.saltproject.io/py3/redhat/8/x86_64/latest skip_if_unavailable=True failovermethod=priority enabled=1 enabled_metadata=1 gpgcheck=1 gpgkey=https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub [root@minion ~]# ls /etc/yum.repos.d/ CentOS-Stream-AppStream.repo CentOS-Stream-Media.repo CentOS-Stream-BaseOS.repo CentOS-Stream-PowerTools.repo CentOS-Stream-Debuginfo.repo CentOS-Stream-RealTime.repo CentOS-Stream-Extras.repo salt.repo CentOS-Stream-HighAvailability.repo # 安装服务salt-minion, python3-PyMySQL mariadb [root@minion ~]# yum -y install salt-minion .... [root@minion ~]# yum -y install python3-PyMySQL ...... # 修改配置文件 [root@minion ~]# vim /etc/salt/minion ...... 15 # resolved, then the minion will fail to start. 16 #master: salt 17 master: 192.168.197.131 # IP是master的,前面有一个空格 ....... # 启动salt-minion [root@minion ~]# systemctl start salt-minion mariadb安装服务并配置 [root@mariadb ~]# yum -y install mariadb-server mariadb ....... # 启动 [root@mariadb ~]# systemctl start mariadb [root@mariadb ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 80 *:3306 *:* [root@mariadb ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 10.3.28-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> set password = password('123456'); Query OK, 0 rows affected (0.000 sec) MariaDB [(none)]> exit Bye [root@mariadb ~]# mysql -uroot -p123456 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.3.28-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE `salt` -> DEFAULT CHARACTER SET utf8 -> DEFAULT COLLATE utf8_general_ci; Query OK, 1 row affected (0.000 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | salt | +--------------------+ 4 rows in set (0.000 sec) MariaDB [(none)]> USE `salt`; Database changed MariaDB [salt]> DROP TABLE IF EXISTS `jids`; Query OK, 0 rows affected, 1 warning (0.001 sec) MariaDB [salt]> CREATE TABLE `jids` ( -> `jid` varchar(255) NOT NULL, -> `load` mediumtext NOT NULL, -> UNIQUE KEY `jid` (`jid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.003 sec) MariaDB [salt]> DROP TABLE IF EXISTS `salt_returns`; Query OK, 0 rows affected, 1 warning (0.000 sec) MariaDB [salt]> 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; Query OK, 0 rows affected (0.003 sec) MariaDB [salt]> DROP TABLE IF EXISTS `salt_events`; Query OK, 0 rows affected, 1 warning (0.000 sec) MariaDB [salt]> 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; Query OK, 0 rows affected (0.002 sec) # 授权访问 MariaDB [salt]> grant all on salt.* to salt@'%' identified by 'salt'; Query OK, 0 rows affected (0.000 sec) MariaDB [salt]> flush privileges; Query OK, 0 rows affected (0.000 sec) minion上安装mariadb [root@minion ~]# yum -y install mariadb [root@minion ~]# mysql -usalt -psalt -h192.168.101.210 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.3.28-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> # 修改配置文件 [root@minion ~]# vim /etc/salt/minion #return: mysql # #return: mysql,slack,redis # #return: # - mysql # - hipchat # - slack mysql.host: '192.168.197.128' mysql.user: 'salt' mysql.pass: 'salt' mysql.db: 'salt' mysql.port: 3306 [root@minion ~]# systemctl restart salt-minion master上ping 测试连通性 [root@master ~]# salt 'minion' test.ping minion: True mariadb上查看是否有数据 [root@mariadb ~]# mysql -uroot -p123456 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 11 Server version: 10.3.28-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> select * from salt.salt_returns; Empty set (0.000 sec) master上测试存储到mariadb中 [root@master ~]# salt 'minion' test.ping --return mysql minion: True mariadb查看 MariaDB [(none)]> select * from salt.salt_returns\G *************************** 1. row *************************** fun: test.ping jid: 20211107111209404569 return: true id: minion success: 1 full_ret: {"success": true, "return": true, "retcode": 0, "jid": "20211107111209404569", "fun": "test.ping", "fun_args": [], "id": "minion"} alter_time: 2021-11-07 22:12:09 1 row in set (0.000 sec)
2.1 job cache流程
return时是由Minion直接与存储服务器进行交互,因此需要在每台Minion上安装指定的存储方式的模块,比如python-mysql,那么我们能否直接在Master上就把返回的结果给存储到存储服务器呢?
答案是肯定的,这种方式被称作 job cache 。意思是当Minion将结果返回给Master后,由Master将结果给缓存在本地,然后将缓存的结果给存储到指定的存储服务器,比如存储到mysql中。
master默认的存储位置
[root@master ~]# cd /var/cache/salt/master/jobs/ [root@master jobs]# ls 0a 16 24 32 39 43 49 51 5e 69 72 7f 94 9e ae bb c4 d0 e0 ea f2 fa 0c 17 27 33 3a 44 4a 55 60 6b 74 82 95 a0 af bc c6 d3 e1 eb f3 fb 0e 1d 29 34 3f 45 4b 56 61 6c 75 88 96 a1 b1 be c7 d4 e2 ec f4 ff 之前改的minion上的配置文件还原 [root@minion ~]# vim /etc/salt/minion ...... 931 mysql.host: '192.168.101.210' # 删除添加的五行 932 mysql.user: 'salt' 933 mysql.pass: 'salt' 934 mysql.db: 'salt' 935 mysql.port: 3306 ...... # 重启salt-minion服务 [root@minion ~]# systemctl restart salt-minion
开启master端的master_job_cache
[root@master ~]# yum -y install python3-PyMySQL # 安装 python3-PyMySQL [root@master jobs]# cd [root@master ~]# yum -y install python3-PyMySQL ...... # 修改master的配置文件 [root@master ~]# vim /etc/salt/master ...... 137 #job_cache: True 138 master_job_cache: mysql 139 mysql.host: '192.168.101.210' # mariadb主机的IP 140 mysql.user: 'salt' 141 mysql.pass: 'salt' 142 mysql.db: 'salt' 143 mysql.port: 3306 ...... # 重启salt-master [root@master ~]# systemctl restart salt-master
master安装mariadb服务 [root@master ~]# yum -y install mariadb [root@master ~]# mysql -usalt -psalt -h192.168.101.210 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 25 Server version: 10.3.28-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 删除mariadb上之前的数据 MariaDB [(none)]> delete from salt.salt_returns; Query OK, 4 rows affected (0.001 sec) MariaDB [(none)]> select * from salt.salt_returns; Empty set (0.000 sec) [root@master ~]# salt 'minion' cmd.run 'df -h' minion: Filesystem Size Used Avail Use% Mounted on devtmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.8G 80K 3.8G 1% /dev/shm tmpfs 3.8G 9.7M 3.8G 1% /run tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup /dev/mapper/cs-root 62G 5.9G 56G 10% / /dev/mapper/cs-home 30G 251M 30G 1% /home /dev/sda1 1014M 243M 772M 24% /boot tmpfs 775M 1.2M 773M 1% /run/user/42 tmpfs 775M 0 775M 0% /run/user/0 MariaDB [(none)]> select * from salt.salt_returns\G *************************** 1. row *************************** fun: cmd.run jid: 20211107130618362431 return: "Filesystem Size Used Avail Use% Mounted on\ndevtmpfs 3.8G 0 3.8G 0% /dev\ntmpfs 3.8G 80K 3.8G 1% /dev/shm\ntmpfs 3.8G 9.7M 3.8G 1% /run\ntmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup\n/dev/mapper/cs-root 62G 5.9G 56G 10% /\n/dev/mapper/cs-home 30G 251M 30G 1% /home\n/dev/sda1 1014M 243M 772M 24% /boot\ntmpfs 775M 1.2M 773M 1% /run/user/42\ntmpfs 775M 0 775M 0% /run/user/0" id: minion success: 1 full_ret: {"cmd": "_return", "id": "minion", "success": true, "return": "Filesystem Size Used Avail Use% Mounted on\ndevtmpfs 3.8G 0 3.8G 0% /dev\ntmpfs 3.8G 80K 3.8G 1% /dev/shm\ntmpfs 3.8G 9.7M 3.8G 1% /run\ntmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup\n/dev/mapper/cs-root 62G 5.9G 56G 10% /\n/dev/mapper/cs-home 30G 251M 30G 1% /home\n/dev/sda1 1014M 243M 772M 24% /boot\ntmpfs 775M 1.2M 773M 1% /run/user/42\ntmpfs 775M 0 775M 0% /run/user/0", "retcode": 0, "jid": "20211107130618362431", "fun": "cmd.run", "fun_args": ["df -h"], "_stamp": "2021-11-07T13:06:18.558653"} alter_time: 2021-11-07 21:06:18 1 row in set (0.000 sec)
Salt 0.9.7 为管理作业的saltutil引入了一些新功能。这些功能是: running返回在proc目录中找到的所有运行作业的数据。 find_job根据工作 ID 返回有关某项工作的具体数据。 signal_job允许向给定夹具发送信号。 term_job向控制指定作业的流程发送终止信号(SIGTERM,15)。 kill_job向控制指定作业的流程发送杀伤信号(SIGKILL,9)
。
获取任务的jid
[root@master ~]# salt 'minion' cmd.run 'date' -v Executing job with jid 20211107130853049269 ------------------------------------------- minion: Sun Nov 7 21:08:53 CST 2021 通过jid获取任务的返回结果 [root@master ~]# salt-run jobs.lookup_jid 20211107130853049269 minion: Sun Nov 7 23:08:53 CST 2021 列出正在执行的任务,可以通过上面的 kill_job jid 杀死一个正在执行的任务 salt-run jobs.active 列出执行过的任务 salt-run jobs.list_jobs