黑帽联盟

 找回密码
 会员注册
查看: 1169|回复: 0
打印 上一主题 下一主题

[集群服务] Linux下SaltStack把数据返回到mysql数据库

[复制链接]

895

主题

38

听众

3322

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情

    前天 13:01
  • 签到天数: 1643 天

    [LV.Master]伴坛终老

    官方帮助文档:http://docs.saltstack.cn/topics/jobs/external_cache.html
    mysql模块相关文档介绍:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql

    一、Job基本管理
    在master下发指令消息时,会附带上产生的jid.minion在接收到指令开始执行时,会在本地的cachedir(默认是/var/cache/salt/minion/)下的proc目录下产生以该jid命名的文件,用于在执行过程中master查看当前任务的执行情况,指令执行完毕,将结果传送给master后,删除该临时文件。

    master将minion的执行结果存放在本地/var/cache/salt/master/jobs目录,默认缓存24小时(可以通过修改master配置文件keepjobs选项调整)
    20190403163353106.png


    二、SaltStack把数据返回到mysql数据库的两种配置方法对应的图解
    第一种配置方法:
    当配置外部作业缓存时,数据像往常一样返回salt master上的缺省作业缓存,然后使用在salt minion上运行的 Salt returne模块将结果发送到外部作业缓存。

    external-job-cache.png


    第二种配置方法:

    master-job-cache.png

    在这种配置中,salt minions 像往常一样将数据发送到默认作业缓存,然后salt master使用运行在盐主机上的盐返回器模块将数据发送到外部系统。



    三、实验环境(rhel7.3版本)

    1、selinux和firewalld状态为disabled

    2、各主机信息如下:


    主机        ip
    server1(master)        172.25.83.1
    server2(minion)        172.25.83.2
    server3(minion)        172.25.83.3
    server4(minion)        172.25.83.4


    四、SaltStack把数据返回到mysql数据库的两种配置方法
    第一种配置方法:

    提前编写test.sql文件:

    [root@server1 ~]# vim test.sql
      1 CREATE DATABASE  `salt`
      2   DEFAULT CHARACTER SET utf8
      3   DEFAULT COLLATE utf8_general_ci;
      4
      5 USE `salt`;
      6
      7 --
      8 -- Table structure for table `jids`
      9 --
    10
    11 DROP TABLE IF EXISTS `jids`;
    12 CREATE TABLE `jids` (
    13   `jid` varchar(255) NOT NULL,
    14   `load` mediumtext NOT NULL,
    15   UNIQUE KEY `jid` (`jid`)
    16 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    17 #CREATE INDEX jid ON jids(jid) USING BTREE;
    18
    19 --
    20 -- Table structure for table `salt_returns`
    21 --
    22
    23 DROP TABLE IF EXISTS `salt_returns`;
    24 CREATE TABLE `salt_returns` (
    25   `fun` varchar(50) NOT NULL,
    26   `jid` varchar(255) NOT NULL,
    27   `return` mediumtext NOT NULL,
    28   `id` varchar(255) NOT NULL,
    29   `success` varchar(10) NOT NULL,
    30   `full_ret` mediumtext NOT NULL,
    31   `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    32   KEY `id` (`id`),
    33   KEY `jid` (`jid`),
    34   KEY `fun` (`fun`)
    35 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    36
    37 --
    38 -- Table structure for table `salt_events`
    39 --
    40
    41 DROP TABLE IF EXISTS `salt_events`;
    42 CREATE TABLE `salt_events` (
    43 `id` BIGINT NOT NULL AUTO_INCREMENT,
    44 `tag` varchar(255) NOT NULL,
    45 `data` mediumtext NOT NULL,
    46 `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    47 `master_id` varchar(255) NOT NULL,
    48 PRIMARY KEY (`id`),
    49 KEY `tag` (`tag`)
    50 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    1、配置master端(server1)

    [root@server1 ~]# yum install mariadb-server -y   #安装mariadb-server
    [root@server1 ~]# systemctl start mariadb   #开启mariadb服务
    [root@server1 ~]# mysql -uroot -proot
    MariaDB [(none)]> grant all on salt.* to salt@'%' identified by 'salt';  #创建用户并授权。值的一提的是:这里还没有创建好salt数据库,但是并不会报错
    MariaDB [salt]> Bye   #按住Ctrl+d退出。
    [root@server1 ~]# mysql < test.sql   #导入数据库和表的相关信息
    [root@server1 ~]# mysql   #登录数据库,查看数据库salt及数据库中相应的表是否导入成功
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | salt               |            |
    +--------------------+
    MariaDB [(none)]> use salt;
    MariaDB [salt]> show tables;
    +----------------+
    | Tables_in_salt |
    +----------------+
    | jids           |
    | salt_events    |
    | salt_returns   |
    +----------------+
    MariaDB [salt]> Bye   #按住Ctrl+d退出。


    2、配置minion端(server2)

    [root@server2 ~]# yum install MySQL-python -y
    [root@server2 ~]# vim /etc/salt/minion   #在874-879行田间如下的内容
    874 return: mysql
    875 mysql.host: '172.25.83.1'
    876 mysql.user: 'salt'
    877 mysql.pass: 'salt'
    878 mysql.db: 'salt'
    879 mysql.port: 3306
    [root@server2 ~]# systemctl restart salt-minion   #修改完配置文件后,重启服务


    3、测试:

    [root@server1 ~]# salt server4 cmd.run hostname   #master端(server1)将任意的命令推送到minion端(server2)
    server2:
        server2
    [root@server1 ~]# salt server3 cmd.run hostname
    server3:
        server3
    [root@server1 ~]# salt server4 cmd.run hostname
    server4:
        server4
    [root@server1 ~]# mysql
    MariaDB [(none)]> select * from salt.salt_returns;   #登录数据库查看,是否有上面执行的命令的内容
    +---------+----------------------+-----------+---------+---------+--------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
    | fun     | jid                  | return    | id      | success | full_ret                                                                                                                                         | alter_time          |
    +---------+----------------------+-----------+---------+---------+--------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
    | cmd.run | 20190813175201740132 | "server2" | server2 | 1       | {"fun_args": ["hostname"], "jid": "20190813175201740132", "return": "server2", "retcode": 0, "success": true, "fun": "cmd.run", "id": "server2"} | 2019-08-13 17:52:01 |
    +---------+----------------------+-----------+---------+---------+--------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
    1 row in set (0.00 sec)


    从上面的实验结果,我们可以看到,只有master端将命令推送到minion端(server2)执行的命令才能存储到master端(server1)的mysql数据库中,master端将命令推送到其他minion端(如server3)执行的命令并不会存储到master端(server1)的mysql数据库中。这是因为只有server2端的配置文件中(/etc/salt/minion)指定了存储到master端的mysql数据库。那么,如果minion端比较多,并且都想存储到master端的mysql数据库中,要在每一个minion端都进行设置,这未免也太复杂了,因而引入了下面的第二种配置方法,只需在master端进行配置即可。



    第二种配置方法:

    1、配置minion端(server2):删除之前的配置

    [root@server2 ~]# vim /etc/salt/minion   #删除之前编写的874-879行的内容
    [root@server2 ~]# systemctl restart salt-minion   #修改完配置文件之后,重启服务


    2、配置master端(server1)

    [root@server1 ~]# vim /etc/salt/master   #在master端的1261-1266行编写下面的美容
    1261 mysql.host: '172.25.83.1'   #也可以将172.25.83.1,换为localhost
    1262 mysql.user: 'salt'
    1263 mysql.pass: 'salt'
    1264 mysql.db: 'salt'
    1265 mysql.port: 3306
    1266
    1267 master_job_cache: mysql

    切记:开启master端的master_job_cache,该方法就不需要再minion端配置数据库相关信息了,如果也配置了minion端数据库相关信息,那么执行结果将会在数据库中保存两份

    [root@server1 ~]# systemctl restart salt-master   #修改完配置文件之后,重启服务
    [root@server1 ~]# mysql
    MariaDB [(none)]> grant all on salt.* to salt@localhost identified by 'salt';   #重新授权(之前授的权是:在所有主机都可以对salt数据库进行操作,这里授权:只有本及才能对salt数据库进行操作)
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> Bye   #按Ctrl+d退出

    [root@server1 ~]# mysql -usalt -psalt salt   #验证是否授权成功
    MariaDB [salt]> Bye   #按Ctrl+d退出

    [root@server1 ~]# yum install MySQL-python -y


    3、测试:

    [root@server1 ~]# salt server2 test.ping
    server2:
        True
    [root@server1 ~]# salt server3 test.ping
    server3:
        True
    [root@server1 ~]# salt server4 test.ping
    server4:
        True
    [root@server1 ~]# mysql
    MariaDB [(none)]> select * from salt.salt_returns;
    +-----------+----------------------+-----------+---------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
    | fun       | jid                  | return    | id      | success | full_ret                                                                                                                                                                                      | alter_time          |
    +-----------+----------------------+-----------+---------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
    | cmd.run   | 20190813175301740132 | "server2" | server2 | 1       | {"fun_args": ["hostname"], "jid": "20190813172301740132", "return": "server2", "retcode": 0, "success": true, "fun": "cmd.run", "id": "server2"}                                              | 2019-08-13 17:53:01 |
    | test.ping | 20190813175656352624 | true      | server2 | 1       | {"fun_args": [], "jid": "20190813175656352624", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2019-04-03T09:46:56.644733", "fun": "test.ping", "id": "server2"} | 2019-08-13 17:56:56 |
    | test.ping | 20190813175714004299 | true      | server3 | 1       | {"fun_args": [], "jid": "220190813175714004299", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2019-04-03T09:47:14.087166", "fun": "test.ping", "id": "server3"} | 2019-08-13 17:57:14 |
    | test.ping | 20190813175721089451 | true      | server4 | 1       | {"fun_args": [], "jid": "20190813175721089451", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2019-04-03T09:47:21.170593", "fun": "test.ping", "id": "server4"} | 2019-08-13 17:57:21 |
    +-----------+----------------------+-----------+---------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
    MariaDB [(none)]> Bye   #按Ctrl+d退出


    我们可以看到,master端将命令推送到任意的minion端执行的命令,都会保存在master端的mysql数据库中。表示配置成功。

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部