#bash #terraform #terraform-provider-aws #terraform-provider-azure
#bash #terraform #terraform-provider-aws #terraform-provider-azure
Вопрос:
У меня есть большой файл переменных в файле .tf, и я хочу изменить значения с помощью скрипта bash.
например, в моем файле много таких фрагментов, и я хочу изменить каждый шаг за шагом.как лучше всего изменить значения переменных файла terraform?
variable "azure_spoke_gateways" {
default = {
spoke1 = {
name = "name"
size = "size"
vpc = ""
},
spoke2 = {
name = "dummy"
size = "size2"
}
}
}
Ответ №1:
Если у вас есть файл и вы можете создать его с нуля, а не редактировать существующий, вы можете использовать следующий подход.
cat << EOF > main.tf.sh
variable "azure_spoke_gateways" {
default = {
spoke1 = {
name = "AZ-${region}-Spoke1-GW"
size = "Standard_B1ms"
..
}
}
}
EOF
chmod x main.tf.sh
export region=EU
. ./main.tf.sh > main.tf
Хотя это ограничено определенными сценариями, но очень просто и понятно.
Комментарии:
1. Спасибо за ответ, но я могу редактировать его только с помощью
bash script
Ответ №2:
Использование GNU awk:
Установите переменные, прежде чем продолжить
spke="spoke1" # The spoke we are concerned with
var="size" # The variable within the spoke section we are concerned with
val="size1" # The value we want to change to.
clp="azure" # Either azure or aws
Передайте эти переменные в GNU awk с помощью -v
awk -v spke="$spke" -v var="$var" -v val="$val" -v clp="$clp"'
/variable/ {
cloudp=gensub(/(^variable[[:space:]]")(.*)(".*$)/,"\2",$0) # Pull out the cloud provider
}
/spoke[[:digit:]][[:space:]]=/ {
spoke=$1 # Track the spoke section
}
spoke==spke amp;amp; $1==var amp;amp; cloudp ~ clp { # If spoke is equal to the passed spoke and the first space separated field is equal to the variable and clp is equal to the passed cloud provider (clp) we want to change (var)
$0=gensub(/(^.*=[[:space:]]")(.*)(".*$)/,"\1"val"\3",$0) # Substitute the value for the value passed (val)
}1' file
Один вкладыш
awk -v spke="$spke" -v var="$var" -v val="$val" -v clp="$clp" '/variable/ { cloudp=gensub(/(^variable[[:space:]]")(.*)(".*$)/,"\2",$0) } /spoke[[:digit:]][[:space:]]=/ { spoke=$1 } spoke==spke amp;amp; $1==var amp;amp; cloudp ~ clp { $0=gensub(/(^.*=[[:space:]]")(.*)(".*$)/,"\1"val"\3",$0) }1' file
Если у вас установлена последняя версия GNU awk, вы можете зафиксировать изменения в файле, просто добавив флаг -i и так:
awk -i -v spke="$spke" -v var="$var" -v val="$val" -v clp="$clp" '/variable/ { cloudp=gensub(/(^variable[[:space:]]")(.*)(".*$)/,"\2",$0) } /spoke[[:digit:]][[:space:]]=/ { spoke=$1 } spoke==spke amp;amp; $1==var amp;amp; cloudp ~ clp { $0=gensub(/(^.*=[[:space:]]")(.*)(".*$)/,"\1"val"\3",$0) }1' file
В противном случае:
awk -v spke="$spke" -v var="$var" -v val="$val" -v clp="$clp" '/variable/ { cloudp=gensub(/(^variable[[:space:]]")(.*)(".*$)/,"\2",$0) } /spoke[[:digit:]][[:space:]]=/ { spoke=$1 } spoke==spke amp;amp; $1==var amp;amp; cloudp ~ clp { $0=gensub(/(^.*=[[:space:]]")(.*)(".*$)/,"\1"val"\3",$0) }1' file > file.tmp amp;amp; mv -f file.tmp file
Комментарии:
1. awk создает проблему, если я запускаю команду awk 2 раза, применяется только последнее изменение. например, я сначала запускаю изменение имени, а затем размера. и работало только изменение имени
2. Я использую один вкладыш
3. Вы должны убедиться, что изменения зафиксированы с помощью awk -i или с перемещением временного файла, как в последнем примере предпоследнего примера.
4. Я использую
otherwise
опцию, поскольку -i не является допустимой командой для меня5. сэр, почти готово, есть только небольшие проблемы. если есть две переменные с одинаковыми именами, awk изменяет обе . Я обновил свой вопрос. пожалуйста, посмотрите.
Ответ №3:
Если вы храните свои переменные в формате Terraform JSON, я бы рекомендовал использовать что-то, поддерживающее JSON, например JQ, а не наивно изменять JSON с помощью sed
/ awk
etc . Таким образом, вы сможете надежно поддерживать свой формат JSON.
Если вам нужно сохранить исходный формат, который, как я понимаю, является HCL, возможно, напишите скрипт с использованием анализатора HCL, такого как этот
Комментарии:
1. К сожалению, это не json, и прошло 6 дней, я провожу исследование: (его форматирование
.ts
. Есть идеи, хочу ли я изменить.tf
значения файлов переменных?2. Если исходный формат — HCL, я думаю, вы найдете синтаксические анализаторы для разных языков сценариев. В противном случае вам может сойти с рук sed / awk для простых случаев.
3. пожалуйста, не могли бы вы привести небольшой пример
pyhcl
?4. Я не использовал его, признаюсь