【问题标题】:GitHub Actions Terraform State file cant be parsedGitHub Actions Terraform 状态文件无法解析
【发布时间】:2021-09-09 14:03:06
【问题描述】:

我目前正在使用 terraform 在云中配置基础架构。在 Terraform 之上,我运行 GitHub Actions 来自动化更多步骤。

在这种情况下,在配置基础架构后,我使用生成的 cluster.tfstate 使用 bash 脚本生成清单文件(用于 ansible)来解析名称和 ips。

但是脚本无法运行,因为它会引发以下错误

Run bash ./generate-inventory.sh cluster.tfstate > ../hosts.ini
parse error: Invalid numeric literal at line 1, column 9
Error: Process completed with exit code 4.

但是在本地运行它可以工作。当我在工作流中的 cluster.tfstate 上做猫时,情况如下

Run cat cluster.tfstate
***
  "version": 4,
  "terraform_version": "1.0.1",
  "serial": 386,
  "lineage": "3d16a659-b093-551c-b3ab-a1cf8aa5031c",
  "outputs": ***
    "master_ip_addresses": ***
      "value": ***

GitHub Actions 是否会因为我创建的秘密而修改由我的脚本评估的 json?或者星星只在shell的输出中?

工作流代码可以看这里https://github.com/eco-bench/eco-bench/blob/main/.github/workflows/terraform.yml

谢谢!

【问题讨论】:

  • 你能检查是你的脚本还是输入导致了错误?尝试仅运行带有虚拟 JSON 硬编码输入的脚本,尝试验证来自脚本的 JSON 输入或先验证它,以查看它是否是有效的 JSON。这会提供有关该问题的更多信息吗?
  • 使用 local_file 提供程序来生成 Ansible 清单。这会容易得多,并且可能也可以在这里解决问题。
  • 感谢@Matt,使用local_file成功解决了这个问题

标签: json bash terraform github-actions


【解决方案1】:

以下就成功了

source "local_file" "AnsibleInventory" {

  content = templatefile("inventory.tmpl",
    {
      worker = {
      for key, instance in google_compute_instance.worker :
      instance.name => instance.network_interface.0.access_config.0.nat_ip
      }
      master = {
      for key, instance in google_compute_instance.master :
      instance.name => instance.network_interface.0.access_config.0.nat_ip
      }
    }
  )
  filename = "./inventory.ini"
}

模板如下所示

[all:vars]
ansible_connection=ssh
ansible_user=lucas

[cloud]
%{ for ip in master ~}
${name} ${ip}
%{ endfor ~}

[edge]
%{ for ip in worker ~}
${ip}
%{ endfor ~}

[cloud:vars]
kubernetes_role=master

[edge:vars]
kubernetes_role=edge

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2022-08-22
    相关资源
    最近更新 更多