黑帽联盟

 找回密码
 会员注册
查看: 856|回复: 0

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

[复制链接]

852

主题

38

听众

3172

积分

白金VIP

Rank: 8Rank: 8

  • TA的每日心情
    开心
    2024-3-7 12:52
  • 签到天数: 1538 天

    [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数据库中。表示配置成功。

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

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