我喜欢使用terraform而不将其本地安装到我的系统中。我的问题可能是卷或路径问题。
我有两个结构。setup
承载php
、compser
、terraform
等的所有容器文件
和project
文件夹,我在其中运行别名
└───setup
├───composer
│ Dockerfile
│ composer.sh
│
├───php
│ Dockerfile
│
└───terraform
tf.sh
└───projectA
├───modules
│ ├───moduleA
│ ├───moduleb
│ └───module..
│
├───env
│ terraform.tfvars
│
│ main.tf
│ variables.tf
│ output.tf
我使用setup/terraform/tf.sh
的别名从projectA
目录
我的tf.sh
文件内容:
#!/bin/bash
docker run --rm -it --name terraform
-v $pwd:/workspace
-w /workspace hashicorp/terraform:light $@
当我运行tf init
时,terraform说,我在一个空目录上运行它:
Terraform initialized in an empty directory!
The directory has no Terraform configuration files. You may begin working
with Terraform immediately by creating Terraform configuration files.
如果我将' tf.sh'中的代码从上面更改为:
#!/bin/bash
ls $pwd $@
并再次运行tf -lsah
,我得到了预期的地形文件。
.
..
main.tf
outputs.tf
variables.tf
看来,我有一个错误的地方在我的tf.sh
文件。
p。my~/.bash_aliases
:
alias tf='/setup/terraform/tf.sh'
<标题>编辑我通过更改卷挂载取得了一些进展
docker run --rm -it -v "$(PWD):/data" /
-w /data hashicorp/terraform:light init /
-backend-config="env/backend.tfvars"
即使我没有在我的煤,下面的错误告诉我,我在正确的道路上:
Initializing the backend...
╷
│ Error: Error building ARM Config: Please ensure you have installed Azure CLI version 2.0.79 or newer. Error parsing json result from the Azure CLI: Error launching Azure CLI: exec: "az": executable file not found in $PATH.
我的猜测是,我需要用terraform和azure-cli构建一个多级容器映像。如果我说错了,请纠正我!我希望找到一个简单的方法与hashicorp/terraform:light
图像单独。
terraform:light
构建了一个自定义图像,并添加了azure-cli
FROM mcr.microsoft.com/azure-cli
COPY --from=hashicorp/terraform:light /bin/terraform /bin/
ENTRYPOINT ["/bin/terraform"]
工作得很好,但是,如果没有一个活动的会话就没有真正的帮助🙄
Initializing the backend...
╷
│ Error: Error building ARM Config: obtain subscription() from Azure CLI: Error parsing json result from the Azure CLI: Error waiting for the Azure CLI: exit status 1: ERROR: Please run 'az login' to setup account.
│
我想知道我想做的事情是否可能那样做
标题>标题>原始问题的解决方案已经在Edit 2
中给出。但是,这会导致一个后续问题,即通过terraform/azure-cli
容器进行身份验证。
这是一个总结:
我们的目标是为terraform
提供一个像tf
一样的别名,使其在容器中运行terraform,而不是将其安装在本地环境中。根据provider
,这可能有一些依赖关系。在我的情况下,我需要'azurerm',这需要terraform backend-config
的azure-cli
。
因此,您不能简单地运行:
docker run --rm -it -v "$(pwd):/data" -w /data hashicorp/terraform:light $@
因为azure-cli
会丢失。
azure-cli
开始构建一个映像,并添加terraform
二进制文件:
Dockerfile
FROM mcr.microsoft.com/azure-cli
COPY --from=hashicorp/terraform:light /bin/terraform /bin/
ENTRYPOINT ["/bin/terraform"]
<<p>构建图像/strong>docker build -t terraform:azure-cli .
对于Alias,我使用docker run
命令创建了bash文件,包括$@
,允许传递terraform提供的任何参数,并为其分配了一个Alias:
tf.sh
#!/bin/bash
docker run --rm -it
-v "$PWD:/data"
-w /data terraform:azure-cli $@
~/.bash_aliases
alias tf='/mnt/c/Users/***/localGit/setup/terraform/tf.sh'
为了使用这个,需要切换可验证的后端配置数据,以避免在azure-cli查询'tfstate'存储帐户时用户交互。我用短寿命的Shared Access Signature (SAS) Tokens
解决了这个问题。所以我创建了一个本地azure.conf
文件,看起来像这样:
# azure.conf, must be in .gitignore
storage_account_name="azurestorageaccountname"
container_name="storagecontainername"
key="prod.tfstate"
sas_token="?sv=2021-09-17…"
这很好(特别是对于开发),但刷新和复制/粘贴令牌可能并不有趣。因此,我决定运行一个脚本,该脚本旋转访问键并生成SAS令牌作为环境变量:
为了获得SAS令牌作为环境变量,我使用backend.sh
脚本导出它们
backend.sh
#!/bin/bash
storage_account_name=$TF_STATE_BLOB_ACCOUNT_NAME
container_name=$TF_STATE_BLOB_CONTAINER_NAME
resource_group=$TF_RESOURCE_GROUP
# Rotate and retrieve Storage Account Access Key
account_key=$(az storage account keys renew -g $resource_group -n $storage_account_name --key primary --query '[0].value' -o tsv)
# Generate SAS Token
end=$(date -u -d "1 hour" '+%Y-%m-%dT%H:%MZ')
sas=$(az storage container generate-sas --name $container_name
--expiry $end
--permissions dlrw
--account-name $storage_account_name
--account-key $account_key)
sas="${sas%"}" && sas="${sas#"}"
# Export Environment Variables
export ARM_ACCESS_KEY=$account_key
export ARM_SAS_TOKEN=$sas
最后,我用常见的Terraform参数运行别名tf
,就像我在任何管道中做的那样:
$ tf init
-backend-config="storage_account_name=$TF_STATE_BLOB_ACCOUNT_NAME"
-backend-config="container_name=$TF_STATE_BLOB_CONTAINER_NAME"
-backend-config="key=$TF_STATE_BLOB_FILE"
-backend-config="sas_token=$ARM_SAS_TOKEN"