【问题标题】:Dynamically create a configuration file and add it as a configmap in k8s using terraform使用terraform动态创建配置文件并在k8s中将其添加为configmap
【发布时间】:2021-11-23 01:39:44
【问题描述】:

我想使用 terraform 动态生成一个 sudoers 文件,这里的用户名将根据要求进行更改。

所以我的最终 sudoers 文件应该如下所示。

Sudoers 文件:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias USRCMDS = /usr/sbin/service ssh restart, /usr/bin/passwd
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
**<username1>** ALL=(root) NOPASSWD: /usr/sbin/service ssh restart, /usr/bin/passwd **<username1>**
**<username2>** ALL=(root) NOPASSWD: /usr/sbin/service ssh restart, /usr/bin/passwd **<username2>**
**<username3>** ALL=(root) NOPASSWD: /usr/sbin/service ssh restart, /usr/bin/passwd **<username3>**

正如您在上面的文件中看到的,username1、2、3 等作为变量传递(这些用户名是字符串列表,这些用户从外部传递给 tf)到 terraform 脚本。

我厌倦了使用 tpl 来生成这个 sudoers 文件并使用 terraform 创建一个 k8s 配置映射。

我尝试了以下代码 sn-p 来实现这一点,但它不起作用。

.tf 文件:


    data "template_file" "sudoers" {
        count = "${length(var.members_new)}"
        template = "${file("${path.module}/tpl/sudoers.tpl")}"
        vars = {
            members  = "${var.members_new[count.index % length(var.members_new)]}"
        }
    }
    
    resource "kubernetes_config_map" "f1ai_sudoers" {
        count = "${length(var.members_new)}"
        depends_on = [ helm_release.project ]
        metadata {
            name = "sudoers-cm"
            namespace = kubernetes_namespace.project.metadata.0.name
        }
    
        data = {
            "sudoers" = data.template_file.sudoers.rendered
        }
    }

Values.tf:


    variable "members_new" {
        type = list
        default = ["username1", "username2", "username3"]
    }

请帮助提出最佳的实施方式。

【问题讨论】:

  • " 但它不起作用" - 不具体。 究竟发生了什么?任何错误信息?错误究竟发生在哪里。

标签: terraform


【解决方案1】:

我找到了解决方案。这可以通过使用kubernetes_config_map tf 资源和EOF 的组合来实现。

请在下面找到工作代码 sn-p。

resource "kubernetes_config_map" "f1ai_sudoers" {
  depends_on = [ helm_release.project ]
  metadata {
    name = "sudoers-cm"
    namespace = kubernetes_namespace.project.metadata.0.name
  }
  data = {
  "sudoers" = <<EOF
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

Cmnd_Alias USRCMDS = /usr/sbin/service ssh restart, /usr/bin/passwd
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d
%{ for username in var.members_new ~}
${username} ALL=(root) NOPASSWD: /usr/sbin/service ssh restart, /usr/bin/passwd ${username}
%{ endfor ~}
   EOF
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多