gpt4 book ai didi

bash - 如何使用来自wsl控制台的别名从容器运行terraform?

转载 作者:行者123 更新时间:2023-12-04 19:27:58 27 4
gpt4 key购买 nike

我喜欢使用 terraform 而不将其本地安装到我的系统中。我的问题可能是音量或路径问题。
我有两个结构。 setup托管 php 的所有容器文件, compser , terraform , ETC...
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 中某处有错误文件。
附言:
我的 ~/.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"]
工作正常但是是的,如果没有活跃的 session 并没有真正的帮助🙄
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”,这需要 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 .
对于 Alias,我使用 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”存储帐户时发生用户交互。我使用短暂的 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…"
这很好(特别是对于开发),但刷新和复制/粘贴 token 可能并不有趣。因此,我决定运行一个脚本,旋转访问 key 并生成 SAS token 作为环境变量:
为了获得 SAS token 作为环境变量,我使用 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
最后,我运行我的别名 tf使用常见的 Terraform 参数,就像我在任何管道中一样:
$ 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"

关于bash - 如何使用来自wsl控制台的别名从容器运行terraform?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69221460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com