【问题标题】:How to call ansible playbook in terraform code?如何在 terraform 代码中调用 ansible playbook?
【发布时间】:2019-10-12 10:22:58
【问题描述】:

我有一个运行良好的 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 脚本中调用 playbook 并显示结果。

【问题讨论】:

  • provisioner 必须是另一个资源的一部分,例如 aws_instance 资源,如果没有有意义的话,甚至是 null_resource 资源。如果您展示了完整的 Terraform 代码,将对回答者有所帮助,以便他们更全面地解释这应该如何工作。
  • 你好 @ydaetskcoR 我已经更新了 main.tf 并且我没有添加任何资源,因为我正在使用其他 tf 创建资源。
  • 您可能需要查看 Terraform 的 Ansible 供应器插件。 github.com/radekg/terraform-provisioner-ansible另外,我写了一篇关于使用它的文章,希望对你有所帮助medium.com/@robinflume/…
  • @rflume 非常感谢,但是您认为上面的代码看起来不错吗?不知道为什么,但一切都在运行 provisioner "remote-exec" 模块,它返回错误为:Unknown root level key: provisioner
  • 如果这就是你的全部 Terraform 而你实际上并没有使用 Terraform 在某处创建资源你连接到什么,为什么你需要 Terraform 而不是直接运行 Ansible?

标签: ansible terraform provisioning


【解决方案1】:

main.tf 截取的代码不完整。您能否发布运行remote-exec 供应商的完整资源定义?

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

正如@ydaetskcoR 提到的,您需要在null_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 代码捆绑在一起,而无需连接到其他实例。

【讨论】:

  • 感谢@rflume 的回答。基本上 ansible playbook 是在远程机器上创建用户。如果我使用 remote-exec 它不起作用并给我错误,例如“命令不是有效的键属性”,但在 local-exec 上运行时它没有给出任何此类错误,但没有给我所需的输出。
  • 您是否尝试按照文档 (terraform.io/docs/provisioners/remote-exec.html) 中的说明将 command 更改为 inline
猜你喜欢
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多