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)
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
对于多服务器:
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)
[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)
| 归档时间: |
|
| 查看次数: |
10391 次 |
| 最近记录: |