如何在 Chef 中管理 MySQL 用户

How to manage MySQL users in Chef

在 Chef 中,您如何管理 MySQL 用户?如何根据不同的环境设置不同的权限和密码?您会使用数据包还是有任何其他方式来管理这些?

我们有一个用于开发的 Chef 存储库和一个用于生产的单独存储库。

你的问题基本上可以归结为"write the code you want to write"。您喜欢数据包并且有良好的工作流程来管理它们吗?然后冷静,使用那些。想在食谱代码中存储东西吗?这也很酷。我建议不要使用属性,但如果它适合你,那么当然,我明白了。

就我个人而言,我会在配方代码中这样做,因为它应该与配方中的其他所有内容一起进行版本控制。

In Chef, how do you manage MySQL users?

为了管理 mysql 用户,您可以使用 mysql_database_user 资源或 mysql_database 操作 query 当某些事情未被 mysql_database_user resource 涵盖时。

使用 mysql_database_user 资源管理用户

mysql_database_user 'app-user' do
  connection mysql_connection_info
  password data_bag_item['password']
  host 'localhost'
  privileges [:all]
  action [:create, :grant]
end

其中data_bag_item['password']是存储在特定数据包中的密码。

使用 mysql_database 资源管理用户

mysql_database 'create slave user' do
  connection mysql_connection_info
  sql "GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY   '#{slave_password_data_bag_item['password']}'"
  action :query
end

你需要这本食谱 https://github.com/chef-cookbooks/database。资源属性可能存在差异,因为此示例不是来自最新版本。

How would you set different privileges and passwords based on different environments

为此,您可以在 chef 中使用 env 选项 and/or 将它们与 chef 角色相结合。

要在每个环境中专门执行一个资源,您可以使用应用于资源的 not_ifonly_if 属性:

mysql_database_user 'app-user' do
  not_if { node.environment == 'devel' }
end

并使用助手:

ENV_DEV ||= 'dev'

def dev_env?
        node.environment == ENV_DEV
end

mysql_database_user 'app-user' do
  not_if { dev_env? }
end

您可以将其与 env_roles 结合使用,并为您的环境设置特定的角色。这些角色将包括管理您的凭据的食谱。这样,您将获得 not_if 和 if options.

关于 env 和角色的更多信息 - https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-environments-in-chef-to-control-server-configurations

Would you use data bags or is there any other way to manage these?

是的,我会在库中使用它并进行适当的抽象,以最大程度地减少重复代码以从数据包中调用某些内容。

有一种方法可以在 Chef 日志中隐藏解密的输出,这样您的日志就不会包含敏感信息。

We have a Chef repo for dev and a separate repo for prod.

对我来说可以从一本包含食谱、角色、环境的厨师食谱开始,例如一个代码库来管理您的所有节点。

当您的要求达到基本说明书和将使用基本说明书作为依赖项的更高说明书时,您可以逐步扩展它。通过这种方式,您将克服包含大量食谱和图书馆的大型食谱。