web-dev-qa-db-ja.com

現在、terraformからansibleインベントリを作成する最良の方法

マシンの長いリストがありますが、それらはすべてシステムの機能が少し異なります。これらのマシンを整理し、ホストのインベントリファイルに自動的に追加して、ansibleを実行してインベントリを管理できるようにします。これには良い解決策がありますか?

Ansibleホストは次のように見えるはずです...

[webservers]
someip
someip
[integration]
someip
someip

等..

質問をした後、現在、出力変数を調査し、それらを使用してファイルからテンプレートをレンダリングしています。

16
DrM

私はそれを考え出した。

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}
19
DrM

私たちのアプローチは少し異なります。 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

10
Erik Osterman

マルチサーバーの場合:

Inventory.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"
}

ファイルk8s.tpl

[kube-master]
${k8s_master_name}

最終結果

[kube-master]
k8s-master-01
k8s-master-02
k8s-master-03
1
Roy Zeng

私のアプローチ:テンプレートからインベントリファイルまで、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"
}

単一のサーバーで機能します。リストがある場合、適切な方法が見つかりません。

1
Roy Zeng