首页 > 解决方案 > 如何使用来自wsl控制台的别名从容器运行terraform?

问题描述

我喜欢使用 terraform 而不将其本地安装到我的系统中。我的问题可能是音量或路径问题。

我有两个结构。托管, ,等setup的所有容器文件...phpcompserterraform

以及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再次运行,我得到了预期的 terraform 文件。

.                
..               
main.tf          
outputs.tf       
variables.tf     

看来,我的tf.sh文件中某处有错误。

PS:我的~/.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仅使用图像的简单方法。

编辑 2

我构建了一个自定义图像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. 
│                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                                                                          

我想知道我正在尝试做的事情是否有可能以这种方式

标签: bashubuntuterraform

解决方案


原始问题的解决方案已在Edit 2. 但是,它会导致后续问题,通过terraform/azure-cli容器进行身份验证。

这是一个夏天:

目标是拥有terraformlike的别名tf,它在容器中运行 terraform,而不是将其安装在本地环境中。根据provider,这可能有一些依赖关系。就我而言,我需要“azurerm”,这azure-cli需要terraform backend-config.

因此,您不能简单地运行:

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"]

构建映像

docker build -t terraform:azure-cli .

对于别名,我使用docker run命令创建了 bash 文件,包括$@允许传递 terraform 提供的任何参数并为其分配别名:

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”存储帐户时发生用户交互。我使用 short-lived 解决了这个问题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脚本导出它们

后端.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"

推荐阅读