如何在terraform代码中调用ansible playbook?

问题描述 投票:0回答:1

我有一个运行良好的 ansible 剧本,现在我必须使用 terrform 脚本调用该剧本。目前我正在使用如下所示的代码,但它会在 terraform init 期间导致错误:

Error: Unknown root level key: provisioner

我使用的是 Terraform v0.11.7,仅当我运行此特定代码时才会出现错误。 我的 main.tf 仅包含此代码。我使用的目录结构是这样的:

.
├── create-user.yml
├── library
│   └── mkpassword.py
├── main.tf
├── outputs.tf
├── roles
│   └── linux_user_creation
│       └── tasks
│           └── main.yml
└── variables.tf

main.tf 看起来像:

  provisioner "remote-exec" {
  inline = ["sudo dnf -y install python"]

  connection {
    type        = "ssh"
    user        = "ubuntu"
    private_key = "${file(var.ssh_keyname)}"
  }
}

provisioner "remote-exec" {
  command = ["ansible-playbook -u root --private-key ${var.ssh_keyname} -i ${self.ipv4_address} create-user.yml -e 'email_id=${var.email_id}'"]
}

我希望应该从 terraform 脚本调用剧本并显示结果。

ansible terraform provisioning
1个回答
5
投票

代码片段

main.tf
不完整。您能否发布运行
remote-exec
配置程序的完整资源定义?

Ansible 剧本应该做什么?在远程主机本身上创建用户?或者它只是存储 Ansible 脚本的主机,而用户实际上是在另一个远程主机上创建的?

正如@ydaetskcoR提到的,您需要在

null_resource
中运行此代码:

resource null_resource "provisioner" {
  connection {
    ... # set the connection parameters here
  }

  provisioner "remote-exec" {
    command = ["ansible-playbook -u root --private-key ${var.ssh_keyname} -i ${self.ipv4_address} create-user.yml -e 'email_id=${var.email_id}'"]
  }
}

不过,我建议安装 Ansible 配置程序,正如上面的评论中已经提到的。这样,您就可以将 Ansible playbook 直接与 Terraform 代码捆绑在一起,而无需连接到其他实例。

© www.soinside.com 2019 - 2024. All rights reserved.