У меня есть ansible playbook, который хорошо работает, теперь мне нужно вызвать этот playbook с помощью скриптов terrform. В настоящее время я использую код, показанный ниже, но он приводит к ошибке во время инициализации terraform:
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}'"]
}
Я ожидаю, что playbook должен быть вызван из сценариев terraform и должен отображать результаты.
Здравствуйте, @ydaetskcoR. Я обновил main.tf и не добавил никаких ресурсов, потому что создаю ресурсы с другими tf.
Вы можете проверить подключаемый модуль Ansible Provisioner для Terraform. github.com/radekg/terraform-provisioner-ansible Кроме того, я написал статью об использовании, которая может быть вам полезна medium.com/@robinflume/…
@rflume Большое спасибо, но как вы думаете, приведенный выше код выглядит нормально? Не знаю почему, но все запускается provisioner "remote-exec" модуль, он возвращает мне ошибку как: Неизвестный ключ корневого уровня: поставщик
Если это все, что у вас есть в Terraform, и вы на самом деле не используете Terraform для создания ресурса где-то, к чему вы подключаетесь и зачем вам вообще нужен Terraform вместо того, чтобы просто запускать Ansible напрямую?

Форма с вырезанным кодом 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 напрямую с кодом Terraform, и вам не нужно будет подключаться к какому-либо другому экземпляру.
Спасибо за ответ @rflume. В основном ansible playbook создает пользователей на удаленной машине. Если я использую remote-exec, он не работает и выдает мне ошибку типа «команда не является допустимым атрибутом ключа», но он не дает такой ошибки при работе на local-exec, но не дает мне желаемого результата.
Вы пытались изменить command на inline, как указано в Документах (terraform.io/docs/provisioners/remote-exec.html)?
Поставщик должен быть частью другого ресурса, такого как ресурс
aws_instanceили даже ресурсnull_resource, если он не имеет смысла. Ответчикам было бы полезно, если бы вы показали свой полный код Terraform, чтобы они могли более подробно объяснить, как это должно работать.