我尝试使用以下语法在shell脚本中声明一个布尔变量:
variable=$false
variable=$true
Run Code Online (Sandbox Code Playgroud)
它是否正确?另外,如果我想更新该变量,我会使用相同的语法吗?最后,使用布尔变量作为正确的表达式是以下语法:
if [ $variable ]
if [ !$variable ]
Run Code Online (Sandbox Code Playgroud) 我正在阅读bash示例,if
但有些示例是用单个方括号编写的:
if [ -f $param ]
then
#...
fi
Run Code Online (Sandbox Code Playgroud)
其他双方括号:
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
Run Code Online (Sandbox Code Playgroud)
有什么不同?
关于是否将.tfstate
文件提交到Git 的问题,我有点疑惑.该Terraform文档状态:
Terraform
terraform.tfstate
默认情况下也会将一些状态放入文件中.这个状态文件非常重要; 它将各种资源元数据映射到实际资源ID,以便Terraform知道它正在管理什么.必须保存此文件并将其分发给可能运行Terraform的任何人.我们建议简单地将其置于版本控制中,因为它通常不会太大.
另一方面,现在,使用Terraform时对最佳实践的接受和赞成回答如下:
Terraform配置可用于在不同的基础架构上配置多个盒子,每个盒子可以具有不同的状态.由于它也可以由多个人运行,因此该状态应该位于集中位置(如S3),而不是 git.
(原作者的重点,而不是我)
谁是对的,如果是的话,为什么?
我一直在尝试有条件地使用根模块中的模块,以便在某些环境下不会创建该模块。许多人声称,通过count
使用条件将模块中的 设为 0 或 1 即可达到目的。
module "conditionally_used_module" {
source = "./modules/my_module"
count = (var.create == true) ? 1 : 0
}
Run Code Online (Sandbox Code Playgroud)
然而,这改变了 的类型conditionally_used_module
:我们将拥有一个包含单个对象的列表(或元组),而不是对象(或映射)。是否有另一种方法可以实现此目的,而不意味着更改模块的类型?
使用terraform在AWS中部署相当大的基础架构时,我们的遥控器tfstate
已损坏并被删除.
从文档中,我收集到terraform refresh
应该查询AWS以获取基础结构的真实状态并按顺序更新tfstate,但这不会发生:我的tfstate未受影响而plan + apply会产生很多Already existing
错误.
什么是terraform refresh
真的?
假设我已经使用 terraform 来构建我的基础设施,但由于某种原因我的 tfstate 被删除了。这意味着我已经在 tf 文件中定义了我的资源,我只需要重新导入所有内容。
这是否必须是手动过程?
例如,这是我导入 EC2 实例的方式:
terraform import aws_instance.web i-123456
Run Code Online (Sandbox Code Playgroud)
如果我必须为每个资源都这样做,那就太痛苦了(不妨删除所有内容并重新开始)。
如果我已经有了我的 tf 文件,有没有办法只导入其中定义的所有资源?例如,我需要实例 ID 才能导入该实例。terraform import 命令可以读取我的 tf 文件并找到映射到“aws_instance.web”的资源吗?
为了做到这一点,terraform 需要将该 aws 实例映射到 tf 文件中的资源——这当然是 tfstate 的目的。但是 terraform 是否也可以使用资源映射来标记资源?所以我可以对 tf 文件进行导入,terraform 只是动态读取 tf 文件并通过唯一标签找到与 tf 资源对应的物理资源?
我希望运行一个 terraform 计划来验证用户上传的 terraform 计划文件并检测资源。
但是,目前运行 terraform 计划需要 AWS 凭证。
有没有办法在不使用凭据的情况下运行计划或以另一种方式从 .tf 文件中提取资源列表?