web-dev-qa-db-ja.com

Terraformでシェルスクリプトを実行できない

Terraformでlocal-execコマンドを使用してシェルスクリプトを実行しようとしています。これを実行すると、エラー"Can't open appsettings.sh"が発生し続けます。このスクリプトは、手動で実行すると正常に実行されます。私が見逃しているアイデアはありますか?

resource "null_resource" "sp" {

  triggers = {
    Shell_hash = "${sha256(file("${path.module}/appsettings.sh"))}"
  }
  provisioner "local-exec" {
      command = "appsettings.sh ${azuread_application.rbac-server-principal.application_id} ${azuread_application.rbac-client-principal.application_id}"
      interpreter = ["sh"]
      working_dir = "${path.module}"
  }
}

エラーメッセージ:

Error: Error running command 'appsettings.sh 59942507-xxxx-xxxx-xxxxx 4c64-xxxx-xxxx-xxxxx': exit status 127. Output: sh: 0: Can't open appsettings.sh 59942507-xxxx-xxxx-xxxxx 4c64-xxxx-xxxx-xxxxx'
2
Sam Cogan

ここでの問題は、terraformが次のようにコマンドを実行することです。

["/bin/sh" "-c" "appsettings.sh arg1 arg2"]

したがって、コマンドインタープリターはappsettings.shをコマンド名として受け取ります。これは、以下のように実行するのと非常に似ています。

$appsettings.sh arg1 arg2

このようなコマンドがないため、これは実行できません。そのため、そのシェルスクリプトを実行するには、以下に示すように、シェルスクリプトの絶対パスまたは相対パスを指定する必要があります。

$ ./appsettings.h
$ /home/user/appsettings.sh # Example

これを達成するには、コマンド属性を次のように再配置します

command = "./appsettings.sh ${azuread_application.rbac-server-principal.application_id} ${azuread_application.rbac-client-principal.application_id}"

 OR

command = "${path.module}/appsettings.sh ${azuread_application.rbac-server-principal.application_id} ${azuread_application.rbac-client-principal.application_id}"

つまり、追加./ appsettings

0

エラーメッセージは、スクリプトファイルを「開けない」ことを示しています。その理由は次のとおりです。

  1. スクリプトファイルが存在しません(まだマシン上に作成されていない可能性があります)
  2. 許可の問題

プログラム(Teraformやスクリプトなど)を介してコマンドを実行している場合は、シェルまたは適切なパスを指定する必要があります。例:

/bin/sh /path/to/script/myscript.sh
or
/bin/bash /path/to/script/myscript.sh

よくわかりませんが、local-execは、ls、echo、mkdirなどのローカルコマンドを実行するために使用され、remote-execはスクリプトの実行に使用されます。私はまだこれを使用していませんprovisionerが、これを試してみることができます。

参考文献: https://www.terraform.io/docs/provisioners/local-exec.html

https://www.terraform.io/docs/provisioners/remote-exec.html

0
Khalid Waseem