1.7.12.1. init
terraform init
命令被用来初始化一个包含 Terraform 代码的工作目录。在编写了一些 Terraform 代码或是克隆了一个 Terraform 项目后应首先执行该命令。反复执行该命令是安全的(考点)。
1.7.12.1.1. 用法
terraform init [options]
该命令为初始化工作目录执行了多个不同的步骤。详细说明可以见下文,总体来说用户不需要担心这些步骤。即使某些步骤可能会遭遇错误,但是该命令绝对不会删除你的基础设施资源或是状态文件。
1.7.12.1.2. 常用参数
-input=true
:是否在取不到输入变量值时提示用户输入-lock=false
:是否在运行时锁定状态文件-lock-timeout=<duration>
:尝试获取状态文件锁时的超时时间,默认为0s
(0 秒),意为一旦发现锁已被其他进程获取立即报错-no-color
:禁止输出中包含颜色-upgrade
:是否升级模块代码以及插件
1.7.12.1.3. 从模块源拷贝模块
默认情况下,terraform init
会假设工作目录下已经包含了 Terraform 代码文件。
我们也可以在空文件夹内搭配 -from-module=MODULE-SOURCE
参数运行该命令,这样在运行任何其他初始化步骤之前,指定的模块将被复制到目标目录中。
这种特殊的使用方式有两种场景:
- 我们可以用这种方法从模块源对应的版本控制系统当中签出指定版本代码并为它初始化工作目录
- 如果模块源指向的是一个样例项目,那么这种方式可以把样例代码拷贝到本地目录以便我们后续基于样例编写新的代码
如果是常规使用时,建议使用版本控制系统自己的命令单独检查版本控制的配置。这样,可以在必要时将额外的标志传递给版本控制系统,并在运行 terraform init
之前执行其他准备步骤(例如代码生成或激活凭据)。
1.7.12.1.4. Backend 初始化
在执行 init
时,会分析根模块代码以寻找 Backend 配置,然后使用给定的配置设定初始化 Backend 存储。
在已经初始化 Backend 后重复执行 init
命令会更新工作目录以使用新的 Backend 设置。这时我们必须设置 -reconfigure
或是 -migrate-state
来升级 Backend 配置。
-migrate-state
选项会尝试将现有状态复制到新 Backend,并且根据更改的内容,可能会导致交互式提示以确认工作区状态的迁移。 设置 -force-copy
选项可以阻止这些提示并对迁移问题回答 yes
。启用 -force-copy
还会自动启用 -migrate-state
选项。
-reconfigure
选项会忽略任何现有配置,从而防止迁移任何现有状态。
要跳过后端配置,请使用 -backend=false。请注意,其他一些初始化步骤需要初始化后端,因此建议仅当先前已为特定后端初始化工作目录时才使用此标志。
要跳过 Backend 配置,可以设置 -backend=false
。注意某些其他 init
步骤需要已经被初始化的 Backend,所以推荐只在已经初始化过 Backend 后使用该参数。
-backend-config=...
参数可以用来动态指定 Backend 配置,我们在状态管理章节中介绍“部分配置”时已经提过,在此不再赘述。
1.7.12.1.5. 初始化子模块
init
会搜索代码中的 module
块,然后通过 source
参数取回引用的模块代码。
模块安装之后重新运行 init
命令会继续安装那些自从上次 init
之后新增的模块,但不会修改已被安装的模块。设置 -upgrade
可以改变这种行为,将所有模块升级到最新版本的代码。
要跳过子模块安装步骤,可以设置 -get=false
参数。要注意其他一些init步骤需要模块树完整,所以建议只在成功安装过模块以后使用该参数。
1.7.12.1.6. 插件安装
我们在 Provider 章节中介绍了插件安装,所以在此不再赘述,我们值介绍一下参数:
-upgrade
:将之前所有已安装的插件升级到符合version
约束的最新版本。-plugin-dir=PATH
:跳过插件安装,只从命令行配置文件的filesystem_mirror
指定的目录加载插件。该参数会跳过用户插件目录以及所有当前工作目录下的插件。我们推荐使用命令行参数文件来全局设置 Terraform 安装方法,-plugin-dir
可以作为一次性的临时方法,例如测试当前本地正在开发的 Provider 插件。-lockfile=MODE
设置依赖锁文件的模式 该参数的可选值有:readonly
:禁用锁定文件更改,但根据已记录的信息验证校验和。该参数与-upgrade
参数冲突。如果我们使用第三方依赖项管理工具更新锁定文件,那么控制它何时显式更改将很有用。
1.7.12.1.7. 在自动化环境下运行 terraform init 命令
如果在团队的变更管理和部署流水线中 Terraform 扮演了关键角色,那么我们可能需要以某种自动化方式编排 Terraform 运行,以确保运行之间的一致性,并提供其他有趣的功能,例如与版本控制系统的钩子进行集成。
在此类环境中运行 init
时需要注意一些特殊问题,包括可选择在本地提供插件以避免重复重新安装。有关更多信息,请参阅 Terraform 与自动化。
1.7.12.1.8. 设置其他代码文件夹
Terraform v0.13 及更早版本还可以设置目录路径来代替 terraform apply
的计划文件参数,在这种情况下,Terraform 将使用该目录作为根模块而不是当前工作目录。
Terraform v0.14 中仍支持该用法,但现已在 Terraform v0.15 中弃用并删除。如果我们的工作流程依赖于覆盖根模块目录,请改用 -chdir
全局选项,该选项适用于所有命令,并使 Terraform 始终在给定目录中查找它通常在当前工作目录中读取或写入的所有文件。
如果您之前的工作流同时要求 Terraform 即使根模块目录已被修改也要将 .terraform
子目录写入当前工作目录,请使用 TF_DATA_DIR
环境变量命令 Terraform 将 .terraform
目录写入当前工作目录之外的其他位置。