2017-08-03 48 views
1

我有一长串机器,所有这些机器在系统中的功能上有一点不同。我想组织这些机器并自动添加到主机库存文件,以便我可以运行并管理库存。有没有很好的解决方案呢?目前从terraform创建一个完整的库存的最好方法

我觉得应该ansible主机看起来像......

[webservers] 
someip 
someip 
[integration] 
someip 
someip 

等。

问这个问题,我目前研究的输出VAR和使用这些渲染模板从一个文件后。

+1

你可以添加一些细节了解您terraform组织以及您希望您的清单文件来组织?如果从terraform输出机器IP,则可以使用命令'terraform output '返回可以作为您的剧本的一组清单的IP列表。 – RaGe

+0

这很有帮助。其实我在想,也许我应该使用模板和输出变量的组合来渲染。我发现以下代码回购,代码为https://github.com/opencredo/k8s-terraform-ansible-sample/tree/master/terraform其中人员呈现ssh配置。 – DrM

+1

只是让你知道你也可以使用null_configuration资源从terraform内部运行剧本。 – RaGe

回答

3

我想通了。

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" 

} 

} 

然后创建引用例如早期

内容在文件中的模板dev_hosts.cfg

[public] 
${api_public} 


[private] 
${api_internal} 
1

我们的方法略有不同。我们定义了一个Terraform模块(terraform-null-ansible),通过使用动态库存,我们随时可以在主机上运行剧本。

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

这是一个非常terraform为中心的方法,但导致非常干净的集成。另外,通过计算剧本的校验和,我们只在剧本发生变化时才调用可靠的配置者。

用法很简单:

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 
} 

更多的文档都在GitHub上README.md

+0

我得仔细看看,谢谢! – DrM

相关问题