首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并多个tfstate文件的Terraformer

合并多个tfstate文件的Terraformer
EN

Stack Overflow用户
提问于 2021-05-18 11:45:44
回答 2查看 2.3K关注 0票数 3

我正在使用terraform(不是terraform,请查看此https://github.com/GoogleCloudPlatform/terraformer)导入Google上的一些基础设施,请参见下面的命令。

即:terraformer import google --resources=networks,subnetworks,firewall,routes,forwardingRules,vpnTunnels --regions=europe-blabla1 --projects=my_project

它工作正常,命令的输出是一个单独的文件夹,每个导入的资源都有tfstate和tf文件。

代码语言:javascript
复制
2021/05/18 11:03:20 google Connecting....
2021/05/18 11:03:20 google save firewall
2021/05/18 11:03:20 google save tfstate for firewall
2021/05/18 11:03:20 google save routes
2021/05/18 11:03:20 google save tfstate for routes
2021/05/18 11:03:20 google save forwardingRules
2021/05/18 11:03:20 google save tfstate for forwardingRules
2021/05/18 11:03:20 google save vpnTunnels
2021/05/18 11:03:20 google save tfstate for vpnTunnels
2021/05/18 11:03:20 google save networks
2021/05/18 11:03:20 google save tfstate for networks
2021/05/18 11:03:20 google save subnetworks
2021/05/18 11:03:20 google save tfstate for subnetworks

现在,我想要完成的是将这些多个tfstate文件合并到一个单独的文件中,以便有用于网络的堆栈:一个用于网络,另一个用于iam、实例等等。

我想知道是否有人能够做到这一点,或是否有更好的方法来做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2021-11-07 06:32:18

我在那里使用了Terraformer然后合并了状态文件,下面是我编写的用于状态文件迁移(合并)的脚本:

代码语言:javascript
复制
#!/usr/bin/env bash

state_pull() {
    echo ">> state pull"
    cd "$1" || return 1
    terraform init
    terraform state pull >terraform.tfstate
    cd ..
    return 0
}

state_mv() {
    echo ">> state mv"
    cd "$2" || return 1
    terraform init
    for i in $(terraform state list); do
        terraform state mv -state-out="../$1/terraform.tfstate" "$i" "$i"
    done
    cd ..
    return 0
}

state_push() {
    echo ">> state push"
    cd "$1" || return 1
    terraform state push terraform.tfstate
    cd ..
    return 0
}

cleanup() {
    echo ">> cleanup"
    cd "$1" || return 1
    rm terraform.tfstate
    rm terraform.tfstate.*
    cd ..
    return 0
}

# Print help text and exit.
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    echo "Usage: tfmv.sh [options]"
    echo
    echo "Examples:"
    echo
    echo "  - ./tfmv.sh stack1-migrate-to stack2-migrate-from"
    echo "  - ./tfmv.sh app data"
    exit 1
fi

echo "> START"
echo ">> TF =  $(terraform version)..."
state_pull "$1"
state_mv "$1" "$2"
state_push "$1"
# cleanup "$1"
echo "> FINISHED"

如果这看起来很花哨,那么您可以使用使用Go做得更好的https://github.com/minamijoyo/tfmigrate

票数 4
EN

Stack Overflow用户

发布于 2021-11-06 05:05:46

我对terraformer一无所知。但我不认为有一种土生土长的方式可以很容易地做到这一点。

当我面临类似的情况(即将两个terraform.tfstate文件合并到1中,合并相应的terraform源代码以匹配它)时,我必须手动对每个资源执行terraform import ...。这是乏味的,但幸运的是,我只有少数几个资源可以合并。

作为一个旁白(只是为了抢先一些问题),命令terraform state mv ...无法执行。它只用于在同一状态文件中重命名资源的地址,而不是在两个状态文件之间移动。我希望该命令能更好地命名为类似于terraform state rename-resource-address ...的命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67585515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档