マシンの長いリストがありますが、それらはすべてシステムの機能が少し異なります。これらのマシンを整理し、ホストのインベントリファイルに自動的に追加して、ansibleを実行してインベントリを管理できるようにします。これには良い解決策がありますか?
Ansibleホストは次のように見えるはずです...
[webservers]
someip
someip
[integration]
someip
someip
等..
質問をした後、現在、出力変数を調査し、それらを使用してファイルからテンプレートをレンダリングしています。
私はそれを考え出した。
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}
私たちのアプローチは少し異なります。 Terraformモジュール(terraform-null-ansible
)これは、動的インベントリを使用してホスト上でプレイブックを実行するときにansibleを呼び出します。
https://github.com/cloudposse/terraform-null-ansible
これは、テラフォーム中心のアプローチですが、非常にクリーンな統合につながります。さらに、プレイブックのチェックサムを計算することにより、プレイブックが変更された場合にのみ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
}
さらに多くのドキュメントがGitHubにありますREADME.md
マルチサーバーの場合:
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"
}
[kube-master]
${k8s_master_name}
最終結果
[kube-master]
k8s-master-01
k8s-master-02
k8s-master-03
私のアプローチ:テンプレートからインベントリファイルまで、template_fileを使用してコンテンツをレンダリングし、local_fileを使用してファイルを出力します。
テンプレートファイル:
## file inventory.tpl
[frontend]
${bastion_pub_ip}
[all:vars]
ansible_ssh_private_key_file = ${key_path}
ansible_ssh_user = ubuntu
レンダリングと出力:
## file inventory.tf
data "template_file" "inventory" {
template = "${file("./test/inventory.tpl")}"
vars {
bastion_pub_ip = "${element(azurerm_public_ip.bastion.*.ip_address, count.index)}"
key_path = "~/.ssh/id_rsa"
}
}
resource "local_file" "save_inventory" {
content = "${data.template_file.inventory.rendered}"
filename = "./myhost"
}
単一のサーバーで機能します。リストがある場合、適切な方法が見つかりません。