【问题标题】:Terraform and Github ActionsTerraform 和 Github 操作
【发布时间】:2021-05-05 15:54:32
【问题描述】:

我有一个 Makefile 来编译 Terraform 代码。当我在本地运行Makefile up 时,一切正常。

生成文件

BACKEND_CONFIG =    -backend-config=resource_group_name=${AZURE_TERRAFORM_RESOURCE_GROUP_NAME} \
                    -backend-config=storage_account_name=${AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME} \
                    -backend-config=container_name=${AZURE_TERRAFORM_STORAGE_CONTAINER_NAME} \
                    -backend-config=key=${AZURE_TERRAFORM_RESOURCE_GROUP_NAME}.tfstate \

VARIABLES = -var=path=${PWD}/config/resource-groups \

all:

up: init plan apply

down: init destroy

init:
    terraform init -reconfigure ${BACKEND_CONFIG} src

plan:
    terraform plan ${VARIABLES} -out="plan.out" src

apply:
    terraform apply plan.out

destroy:
    terraform destroy ${VARIABLES} src

.PHONY = all init plan apply destroy up down import az_up az_down

我现在要做的是在我发出推送请求时运行Makefile up。我在 Github secrets 中添加了我所有的秘密并创建了一个 Github 操作。

terraform.yml

on:
  push:
    branches:
    - dev
  pull_request:

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    environment: production
    defaults:
      run:
        shell: bash
    steps:
    - uses: actions/checkout@v2
    - name: build application
      run: make up
      working-directory: ./infra_as_code

Makefile(新)

BACKEND_CONFIG =    -backend-config=resource_group_name=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
                    -backend-config=storage_account_name=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
                    -backend-config=container_name=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
                    -backend-config=key=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate \

VARIABLES = -var=path=${PWD}/config/resource-groups \

all:

up: init plan apply

down: init destroy

init:
    terraform init -reconfigure ${BACKEND_CONFIG} src

plan:
    terraform plan ${VARIABLES} -out="plan.out" src

apply:
    terraform apply plan.out

destroy:
    terraform destroy ${VARIABLES} src

.PHONY = all init plan apply destroy up down import az_up az_down

我在 Github Actions 中遇到的错误:

Run make up
  make up
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
terraform init -reconfigure -backend-config=resource_group_name=} -backend-config=storage_account_name=} -backend-config=container_name=} -backend-config=key=}.tfstate  src
Too many command line arguments. Did you mean to use -chdir?
make: *** [Makefile:15: init] Error 1
Error: Process completed with exit code 2.

【问题讨论】:

    标签: makefile terraform github-actions


    【解决方案1】:

    这绝对是错误的:

    BACKEND_CONFIG =    -backend-config=resource_group_name=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
                        -backend-config=storage_account_name=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
                        -backend-config=container_name=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
                        -backend-config=key=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate \
    

    首先,如果您想将明确的$ 字符放入makefile 配方中,您需要使用$$ 对它们进行转义。这就是您收到此错误的原因:make 正在尝试将这些扩展为 make 变量。

    其次,如果你想通过 shell 传递这些,你必须为 shell 引用它们。我假设您希望出现文字字符串${{ ... }},在这种情况下您需要单引号:

    BACKEND_CONFIG =    -backend-config=resource_group_name='$${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}' \
                        -backend-config=storage_account_name='$${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }}' \
                        -backend-config=container_name='$${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }}' \
                        -backend-config=key='$${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate'
    

    (您确定可以在{{}} 之前添加此空格吗?)

    我对 terraform 或 github 操作一无所知,所以我不知道这种语法是否是它想要的,但它会正确地通过 make 和 shell。

    【讨论】:

      【解决方案2】:

      ${{ }} 在实际执行之前被 github 操作替换。因此,这在 Makefile 中不起作用。 最好的选择是在 makefile 中使用 Make 变量并在调用 Make 时设置它们:

      BACKEND_CONFIG =    -backend-config=resource_group_name=$(AZURE_TERRAFORM_RESOURCE_GROUP_NAME) \
                      -backend-config=storage_account_name=$(AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME) \
                      -backend-config=container_name=$(AZURE_TERRAFORM_STORAGE_CONTAINER_NAME) \
                      -backend-config=key=$(AZURE_TERRAFORM_RESOURCE_GROUP_NAME).tfstate \
      

      然后在 github 中操作:

       - name: build application
            run: make AZURE_TERRAFORM_RESOURCE_GROUP_NAME=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
                 AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
                 AZURE_TERRAFORM_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
                 AZURE_TERRAFORM_RESOURCE_GROUP_NAME=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
                 up
            working-directory: ./infra_as_code
      

      我不是真正的 Makefile 专家,但据我所知,变量与 $(VAR) 一起使用,而不是与 make 中的 '{' 一起使用。但也许 ${} 也在起作用。

      【讨论】:

      • makefile 可以同时使用$(foo)${foo}
      • 感谢您的回答!我正在使用您的建议,但我得到了 ` *** No rule to make target ' up'。停止。`
      • 当目录中没有 Makefile 时,通常会出现此错误消息。现在我猜:你能不能像这样使用带有 -C 选项的工作目录调用 make up:make -C ./infra_as_code up
      猜你喜欢
      • 2020-12-21
      • 2021-11-08
      • 2020-08-10
      • 2022-01-13
      • 2021-09-25
      • 2021-06-23
      • 2021-07-14
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多