问题:我想从另一台主机连接到 mysql

问题:我想从另一台主机连接到 mysql

问题:我想从另一台主机连接到 mysql

我有一个使用 puppet 配置的 mysql 实例。我希望能够从主机 1.2.3.4 访问该实例。

第 1 部分:我从手工开始

在“/etc/mysql/my.cnf”中,我有

[mysqld]
bind-address = 0.0.0.0

[mine]
database = my-database-name
host = localhost

我重新启动mysqld,然后授予权限

GRANT select,insert,delete,update \
  ON my-database-name.* \
  TO 'my-user-name'@'1.2.3.4'     \
  IDENTIFIED BY 'user-password';

而且这有效。

第 2 部分:尽管我真的很想用木偶来做这件事……

我有以下傀儡代码:

mysql_grant {'[email protected]/my-database-name.*':
  ensure     => 'ensure',
  options    => ['GRANT'],
  privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
  table      => 'my-database-name.*',
  user       => '[email protected]',
}

这确实授予了我期望的权限,但如果我改变主意并这样说

mysql_grant {'[email protected]/my-database-name.*':
  ensure     => 'absent',
  options    => ['GRANT'],
  privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
  table      => 'my-database-name.*',
  user       => '[email protected]',
}

我注意到它不会取消授予权限。将 GRANT 更改为 REVOKE 也没有达到预期的效果。任何指点都非常感谢。

(相关的傀儡问题:假设我想允许来自多个主机的访问。我的傀儡功能让我无法不重复阻止。)

答案1

对于重复部分我能想到两种方法:

  1. puppetDB
  2. 希拉

金宝博官方网站

每当你想要一个节点在第二个节点上执行某项操作时,请使用 puppetDB。这称为导出资源。这也在puppet-mysql 文档

示例1:将所有机器的 SSH Hostkeys 添加到其他所有机器的 known_keys 中。

示例2:将所有机器添加到监控中,并创建它们自己的主机定义。

例3:在某一类机器上,允许它们连接MySQL。

在每种情况下,您首先通过 puppet-puppetdb 模块安装 puppetDB。您需要 puppet4。只有当您拥有 8+ GB 内存时,PuppetDB 才会启动。

然后,您必须编写资源导出和资源导入。在所有具有所需事实(如 ip / fqdn)的节点上,编写导出:

@@mysql_grant {"my-user-name@${::ipaddress}/**my-database-name.*":
  ensure     => 'absent',
  options    => ['GRANT'],
  privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
  table      => 'my-database-name.*',
  user       => "my-user-name@${::ipaddress}",
}

“@@”创建导出。请注意,导出的资源是小写。还请注意,每当使用变量时,都要用双引号而不是单引号。

每当节点看到此信息时,它都会用其事实(在本例中为 ::ipaddress)填充此导出的资源,并将其发送到 puppetDB。您可以将此部分添加到要授予访问权限的所有节点,部分违背其目的,或者您可以拥有一个应用于全部节点并执行以下操作:

if $::fqdn include? 'app'{
  @@mysql_grant {"my-user-name@${::ipaddress}/**my-database-name.*":
    ensure     => 'absent',
    options    => ['GRANT'],
    privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
    table      => 'my-database-name.*',
    user       => "my-user-name@${::ipaddress}",
  }
}

然后你需要写一个进口应该应用此操作的节点上的语句。

Mysql_grant <<| |>>

请注意大写

另一个简单的例子,我们将其应用于所有的 Linux 节点:

  # collect all the public host RSA keys for known hosts
  @@sshkey { $hostname:
    ensure       => present,
    type         => 'rsa',
    host_aliases => [$::ipaddress, $::fqdn],
    key          => $sshrsakey,
  }
  # and populate known_hosts
  Sshkey <<| |>>
  #https://projects.puppetlabs.com/issues/21811
  file { '/etc/ssh/ssh_known_hosts':
    ensure => present,
    path   => '/etc/ssh/ssh_known_hosts',
    mode   => '0644',
  }

希拉

Hiera 就是为此目的而构建的,将代码与数据分开。请参阅 hiera 文档以了解如何设置。

你最终要做的是创建一个包含所有数据的 yaml 文件:

mysql::grants:
  db1:
    username: my-user-name
    database: my-database-name
    ip: 1.2.3.4
    ensure: present
    options:
      - GRANT
    privileges:
      - SELECT
      - INSERT
      - DELETE
      - UPDATE
    table: my-database-name.*
  db2:
    username: my-user-name
    database: my-database-name
    ip: 1.2.3.5
    ensure: present
    options:
      - GRANT
    privileges:
      - SELECT
      - INSERT
      - DELETE
      - UPDATE
    table: my-database-name.*

然后你只需将其放入你的 mysql 节点(尽管创建一个小模块会更简洁):

$grants = hiera('mysql::grants', undef)
create_resources('mysql::grant', $grants) 

Puppet 将解析所有 hiera,然后为找到的每个数据库创建一个授权。

相关内容