如何用sed替代echo将Terraform中aws_instance私有IP写入指定文件?
使用Sed替代Echo将Terraform中的IP列表写入文件
没问题,用sed来实现这个需求有几种简洁的方式,我给你拆解一下:
方案1:直接用sed原地追加内容(推荐)
这种方式不需要额外的echo管道,直接让sed把IP列表追加到文件末尾,和你原来的echo >>效果完全一致:
command = "sed -i '$a ${join(" ", aws_instance.masters.*.private_ip)}' ../ansible-provision/test"
关键参数解释:
-i:sed的原地编辑参数,直接修改目标文件,不需要生成临时文件。$a:sed的地址操作符,$匹配文件的最后一行,a表示在匹配行的后面追加内容。${join(" ", aws_instance.masters.*.private_ip)}:Terraform的插值逻辑,把所有master节点的private_ip用空格拼接成字符串——如果你需要逗号分隔,把join里的" "换成","就行。
方案2:结合echo管道+sed写入
如果你更习惯用管道的方式,也可以把echo输出的IP字符串传给sed,让sed写入文件:
command = "echo \"${join(" ", aws_instance.masters.*.private_ip)}\" | sed -e 'w ../ansible-provision/test'"
注意事项:
这个写法会覆盖目标文件的原有内容。如果要实现追加效果,需要把sed的输出重定向到文件:
command = "echo \"${join(" ", aws_instance.masters.*.private_ip)}\" | sed -e 'w /dev/stdout' >> ../ansible-provision/test"
这里w /dev/stdout让sed把内容输出到标准输出,再通过>>追加到目标文件。
扩展:覆盖整个文件的写法
如果你的需求是清空原有内容后写入新IP列表,可以用sed先清空文件再写入:
command = "sed -i '1,$d' ../ansible-provision/test && sed -i '1i ${join(" ", aws_instance.masters.*.private_ip)}' ../ansible-provision/test"
'1,$d':删除从第1行到最后一行的所有内容,彻底清空文件。'1i ...':在第1行的前面插入IP字符串,也就是写入新内容。
内容的提问来源于stack exchange,提问作者Asier Gomez
相关产品推荐
相关产品推荐

