bash - 如何使用来自wsl控制台的别名从容器运行terraform?
问题描述
我喜欢使用 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
再次运行,我得到了预期的 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.
│
我想知道我正在尝试做的事情是否有可能以这种方式
解决方案
原始问题的解决方案已在Edit 2
. 但是,它会导致后续问题,通过terraform/azure-cli
容器进行身份验证。
这是一个夏天:
目标是拥有terraform
like的别名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"
推荐阅读
- c - 为什么编译汇编C程序成这个?
- autodesk-forge - 如何按材料过滤,例如混凝土或钢墙
- apache-spark - Spark 结构化流 Kafka Avro 到 Hbase
- r - ggplot2 地图出现空白,只有标题和图例 R
- c# - 将文件从控制台应用程序上传到 WebAPI
- java - 使用 Dao 和 Bean 类通过 MVC 模型将数据插入数据库
- ms-word - 在线办公室中的 word 加载项调试任务窗格应用程序
- python - Python 多处理绘图到 Tkinter 画布
- node.js - 为什么我的代码中有符号?
- excel - 如何根据输入的数字复制一组单元格