问题:我想从另一台主机连接到 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
对于重复部分我能想到两种方法:
- puppetDB
- 希拉
金宝博官方网站
每当你想要一个节点在第二个节点上执行某项操作时,请使用 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,然后为找到的每个数据库创建一个授权。