如何运行terraform从容器与别名从wsdl控制台?



我喜欢使用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,我得到了预期的地形文件。

.                
..               
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图像单独。

<标题>编辑2 h1> 用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-configazure-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"

相关内容

  • 没有找到相关文章

最新更新