Terraform – dieselbe TF-Datei für mehrere Bereitstellungen verwenden?

Terraform – dieselbe TF-Datei für mehrere Bereitstellungen verwenden?
resource "aws_instance" "win-example" {
  ami = "${lookup(var.WIN_AMIS, var.AWS_REGION)}"
  instance_type = "t2.medium"
 count="${var.count}"
  vpc_security_group_ids = ["${var.security_group_id}"]
  key_name = "${aws_key_pair.mykey.key_name}"
  user_data = <<EOF
<powershell>
net user ${var.username} '${var.password}' /add /y
net localgroup administrators ${var.username} /add

winrm quickconfig -q
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="300"}'
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'

netsh advfirewall firewall add rule name="WinRM 5985" protocol=TCP dir=in localport=5985 action=allow
netsh advfirewall firewall add rule name="WinRM 5986" protocol=TCP dir=in localport=5986 action=allow

net stop winrm
sc.exe config winrm start=auto
net start winrm
</powershell>
EOF

  provisioner "file" {
    source = "test.txt"
    destination = "C:/test.txt"
  }
  connection {
    type = "winrm"
    timeout = "10m"
    user = "${var.username}"
    password = "${var.password}"
  }

tags {
Name="${format("${var.username}-%01d",count.index+1)}"
}

}

Wenn ich den obigen Code mehr als einmal ausführe und dabei einen anderen Wert für var.username angebe, wird die Instanz neu erstellt. Ist es möglich, dieselbe TF-Datei mehrmals zu verwenden, um neue Maschinen mit unterschiedlichen Benutzernamen zu erstellen?

Antwort1

Zählen

Mit einem Array mit verschiedenen Benutzernamen und den dazu passenden Passwörtern.

Legen Sie diese secrets.tfvars jedoch nicht in scm,

Wir empfehlen, Benutzernamen und Passwörter nicht in der Versionskontrolle zu speichern. Sie können jedoch eine lokale Datei mit geheimen Variablen erstellen und diese mit -var-file laden.

Sie können mehrere -var-file-Argumente in einem einzigen Befehl verwenden, wobei einige in die Versionskontrolle eingecheckt und andere nicht eingecheckt werden. Beispiel:

$ terraform apply \
  -var-file="secret.tfvars" \

in secrets.tfvars

instance_count = 3
usernames = ["jeff","jason","jake"]
passwords = ["jeff_password","jason_password","jake_password"]

Dann in der Ressource

resource "aws_instance" "win-example" {
  ami = "${lookup(var.WIN_AMIS, var.AWS_REGION)}"
  instance_type = "t2.medium"
 count="${var.count}"
  vpc_security_group_ids = ["${var.security_group_id}"]
  key_name = "${aws_key_pair.mykey.key_name}"
  user_data = <<EOF
<powershell>
net user ${var.usernames[count.index]} '${var.passwords[count.index]}' /add /y
net localgroup administrators ${var.usernames[count.index]} /add

winrm quickconfig -q
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="300"}'
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'

netsh advfirewall firewall add rule name="WinRM 5985" protocol=TCP dir=in localport=5985 action=allow
netsh advfirewall firewall add rule name="WinRM 5986" protocol=TCP dir=in localport=5986 action=allow

net stop winrm
sc.exe config winrm start=auto
net start winrm
</powershell>
EOF

  provisioner "file" {
    source = "test.txt"
    destination = "C:/test.txt"
  }
  connection {
    type = "winrm"
    timeout = "10m"
    user = "${var.usernames[count.index]}"
    password = "${var.passwords[count.index]}"
  }

tags {
Name="${format("${var.username}-%01d",count.index+1)}"
}

}

Antwort2

Es stellte sich heraus, dass ich für jeden Benutzer einen Unterordner erstellen musste (./terraform/user1, ./terraform/user2...), alle TF-Dateien in diese Ordner kopieren, für jeden Benutzer eine neue Sicherheitsgruppe erstellen und nur die Maschinen nicht mehr neu erstellen musste, da für jeden Benutzer eine neue Maschine erstellt wurde, ohne die vorherige zu zerstören.

#!/bin/python
import json
import os.path
import shutil
from os import mkdir
from pprint import pprint
from python_terraform import *


json_data=open('./my.json')
data = json.load(json_data)

json_data.close()



def myfunc():

  tf = Terraform(working_dir=final_path, variables={'count':count,'INSTANCE_USERNAME':user})
  tf.plan(no_color=IsFlagged, refresh=True, capture_output=False)
  approve = {"auto-approve": True}
  print(tf.init(reconfigure=True))
  print(tf.plan())
  print(tf.apply(**approve))
  return







for i in range (0, len (data['customers'])):
    #print data['customers'][i]['email']
    k=data['customers'][i]['email']
    #print(k.split('@')[0])
    user=k.split('@')[0]
    #print(user)
    count=data['customers'][i]['instances']
    #print(count)
    #enter = int(input('Enter number of instances: '))
    start_path="/home/ja/terraform-course/demo-2b/"
    final_path=os.path.join(start_path,user)
    if not os.path.exists(final_path):
       os.makedirs(final_path)
    shutil.copy2('./vars.tf', final_path)
    shutil.copy2('./sg.tf', final_path)
    shutil.copy2('./windows.tf', final_path)
    shutil.copy2('./provider.tf', final_path)
    shutil.copy2('./test.txt', final_path)
    final=os.path.join(final_path,'sg.tf')
    final1=os.path.join(final_path,'windows.tf')
    with open(final, 'r') as file :
      filedata = file.read()
    filedata = filedata.replace('allow-all', user)
    with open(final, 'w') as file:
      file.write(filedata)
    with open(final1, 'r') as file :
      filedata = file.read()
    filedata = filedata.replace('allow-all', user)
    with open(final1, 'w') as file:
      file.write(filedata)
    myfunc()

verwandte Informationen