目前从terraform创建ansible库存的最佳方式

DrM*_*DrM 19 ansible terraform

我有很多机器,所有这些机器在系统中的功能都有所不同.我想组织这些机器并自动添加到主机库存文件,以便我可以运行ansible并管理库存.那里有好的解决方案吗?

我认为ansible主机应该看起来像......

[webservers]
someip
someip
[integration]
someip
someip
Run Code Online (Sandbox Code Playgroud)

等等..

在提出问题后,我目前正在研究输出变量并使用它们从文件中渲染模板.

DrM*_*DrM 22

我想到了.

data "template_file" "dev_hosts" {
  template = "${file("${path.module}/templates/dev_hosts.cfg")}"
  depends_on = [
    "aws_instance.dev-api-gateway",
    "aws_instance.dev-api-gateway-internal",
    ....
  ]
  vars {
    api_public = "${aws_instance.dev-api-gateway.private_ip}"
    api_internal = "${aws_instance.dev-api-gateway-internal.private_ip}"
  }
}

resource "null_resource" "dev-hosts" {
  triggers {
    template_rendered = "${data.template_file.dev_hosts.rendered}"
  }
  provisioner "local-exec" {
    command = "echo '${data.template_file.dev_hosts.rendered}' > dev_hosts"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在前面引用的文件中创建一个模板

示例dev_hosts.cfg的内容

[public]
${api_public}


[private]
${api_internal}
Run Code Online (Sandbox Code Playgroud)

  • 另一个提示:如果您有一个列表(例如,如果使用`count`)而不是一个IP,则需要将其内插为简单值-“ vars”部分中的字符串。这是这样做的方法:`servers =“ $ {join(” \ n“,module.servers.server_ip)}”`` (2认同)

And*_*kov 15

从 Terraform 0.12+ 开始,有templatefile一个很方便的功能,特别是如果您需要填充主机组:

# generate inventory file for Ansible
resource "local_file" "hosts_cfg" {
  content = templatefile("${path.module}/templates/hosts.tpl",
    {
      kafka_processors = aws_instance.kafka_processor.*.public_ip
      test_clients = aws_instance.test_client.*.public_ip
    }
  )
  filename = "../ansible/inventory/hosts.cfg"
}
Run Code Online (Sandbox Code Playgroud)

其中 hosts.tpl 模板文件(未来的 Ansible 清单)可能如下所示:

[kafka_broker_hosts]
%{ for ip in kafka_processors ~}
${ip}
%{ endfor ~}

[test_client_hosts]
%{ for ip in test_clients ~}
${ip}
%{ endfor ~}
Run Code Online (Sandbox Code Playgroud)

最终结果:

[kafka_broker_hosts]
18.224.140.239
18.224.140.234

[test_client_hosts]
3.21.134.83
Run Code Online (Sandbox Code Playgroud)


Eri*_*man 11

我们的方法略有不同.我们定义一个Terraform Module(terraform-null-ansible),它可以在我们想要使用动态库存在主机上运行playbook的时候调用ansible.

https://github.com/cloudposse/terraform-null-ansible

这是一种非常以terraform为中心的方法,但可以实现非常干净的集成.另外,通过计算剧本的校验和,我们只在剧本改变时调用ansible供应者.

用法很简单:

module "web_provisioner" {
   source    = "git::https://github.com/cloudposse/terraform-null-ansible.git?ref=tags/0.3.8"

   arguments = ["--user=ubuntu"]
   envs      = ["host=${aws_instance.web.public_ip}"]
   playbook  = "../ansible/playbooks/test.yml"
   dry_run   = false
}
Run Code Online (Sandbox Code Playgroud)

GitHub上有更多的文档 README.md


小智 5

对于多服务器:

文件清单.tf

data  "template_file" "k8s" {
    template = "${file("./templates/k8s.tpl")}"
    vars {
        k8s_master_name = "${join("\n", azurerm_virtual_machine.k8s-master.*.name)}"
    }
}

resource "local_file" "k8s_file" {
  content  = "${data.template_file.k8s.rendered}"
  filename = "./inventory/k8s-host"
}
Run Code Online (Sandbox Code Playgroud)

文件 k8s.tpl

[kube-master]
${k8s_master_name}
Run Code Online (Sandbox Code Playgroud)

最后结果

[kube-master]
k8s-master-01
k8s-master-02
k8s-master-03
Run Code Online (Sandbox Code Playgroud)