jako aktualny użytkownik CLI Terraform jesteś odpowiedzialny za utrzymywanie pliku stanu jako źródła prawdy dla swojej infrastruktury chmury. Możesz przenieść lokalny plik stanu do chmury Terraform bez przerywania lub odtwarzania istniejącej infrastruktury.
Ostrzeżenie: podczas przesyłania pliku stanu do chmury Terraform, wykonując kroki opisane w tym samouczku, Zawsze używaj tej samej wersji CLI Terraform, której użyłeś do utworzenia zasobów. Użycie nowszej wersji Terraform może zaktualizować plik stanu i spowodować uszkodzenie pliku stanu.
„wymagania wstępne
ten poradnik zakłada, że masz następujące:
- CLI Terraform zainstalowany lokalnie
- konto w chmurze Terraform
Uwaga: Ponieważ backend remote
nie był obsługiwany w starszej wersji Terraform, musisz użyć wersji 0.11.13 lub wyższej, aby przenieść swój stan do chmury Terraform. Fragmenty w tym samouczku używają składni 0.12.
jeśli nie masz zainstalowanego Terraform lokalnie, możesz ukończyć ten samouczek w interaktywnym laboratorium za pomocą przeglądarki internetowej. Uruchom go tutaj.
„Utwórz stan
zacznij od klonowania tego repozytorium GitHub.
$ git clone https://github.com/hashicorp/learn-state-migration
skopiuj
następnie przejdź do katalogu.
$ cd learn-state-migration
skopiuj
przejrzyj plik main.tf
w katalogu roboczym, aby uzyskać przegląd zasobów, które zamierzasz utworzyć. Ta konfiguracja używa zasobu random_pet
do generowania i generowania losowej nazwy pet z określoną liczbą słów. Długość nazwy jest określona przez wartość zmiennej name_length
, która domyślnie ma wartość 3.
w rzeczywistej konfiguracji możesz mieć dodatkowe zmienne, takie jak poświadczenia platformy w chmurze zdefiniowane w pliku .tfvars
. Omówimy, jak ustawić te wartości w przestrzeni roboczej chmury Terraform w dalszej części tego samouczka, po migracji pliku stanu.
## Terraform configurationterraform { required_providers { random = { source = "hashicorp/random" version = "3.0.1" } } required_version = "~> 0.14"}variable "name_length" { description = "The number of words in the pet name" default = "3"}resource "random_pet" "pet_name" { length = var.name_length separator = "-"}output "pet_name" { value = random_pet.pet_name.id}
skopiuj
Zainicjuj katalog.
$ terraform init
skopiuj
po zainicjowaniu Terraform, zastosuj konfigurację i zatwierdź uruchomienie, wpisując „tak” w wierszu polecenia.
$ terraform apply
Kopiuj
Terraform wyświetli trzy słowa losowo wygenerowanej nazwy zwierzaka.
„Skonfiguruj zdalny backend
teraz, gdy masz lokalny plik stanu, musisz utworzyć blok kodu zaplecza w konfiguracji. Backend informuje Terraform, gdzie ma się załadować i zapisać plik stanu.
Terraform domyślnie używa lokalnego zaplecza, jeśli w konfiguracji nie zdefiniowano jawnie bloku kodu zaplecza. Lokalny backend zapisuje twój stan jako plik terraform.tfstate
w katalogu, w którym uruchamiasz terraform apply
. Aby przenieść pliki stanu do chmury Terraform, zdefiniuj backend remote
w konfiguracji, dodając nowy blok kodu na początku pliku main.tf
.
terraform { required_providers { random = { source = "hashicorp/random" version = "3.0.1" } } required_version = "~> 0.14" backend "remote" { hostname = "app.terraform.io" organization = "<YOUR-ORG-NAME>" workspaces { name = "state-migration" } }}
skopiuj
Zastąp wartości atrybutów organizacja i przestrzenie robocze nazwą organizacji w chmurze Terraform i żądaną nazwą obszaru roboczego. Chociaż organizacja zdefiniowana w zwrotce zaplecza musi już istnieć, obszar roboczy nie musi; w razie potrzeby Chmura Terraform utworzy ją. Jeśli zdecydujesz się użyć obszaru roboczego, który już istnieje, obszar roboczy nie może mieć żadnych istniejących stanów.
Uwaga: Jeśli znasz uruchamianie Terraform za pomocą CLI, być może korzystałeś z obszarów roboczych Terraform. Przestrzenie robocze w chmurze Terraform zachowują się inaczej niż przestrzenie robocze CLI Terraform. Przestrzenie robocze Terraform CLI umożliwiają istnienie wielu plików stanu w jednym katalogu, umożliwiając korzystanie z jednej konfiguracji dla wielu środowisk. Przestrzenie robocze w chmurze Terraform zawierają wszystko, co jest potrzebne do zarządzania danym zestawem infrastruktury i działają jak oddzielne katalogi robocze.
„uwierzytelnianie za pomocą chmury Terraform
po zdefiniowaniu zaplecza należy uwierzytelnić za pomocą chmury Terraform, aby kontynuować inicjalizację. Aby uwierzytelnić się za pomocą chmury Terraform, uruchom polecenie terraform login
i postępuj zgodnie z monitami, aby się zalogować.
Uwaga: Jeśli używasz wersji Terraform przed 0.12.21, polecenie terraform login
nie jest dostępne. Zamiast tego skonfiguruj plik konfiguracyjny CLI do uwierzytelniania.
$ terraform loginTerraform will request an API token for app.terraform.io using your browser.If login is successful, Terraform will store the token in plain text inthe following file for use by subsequent commands: /Users/username/.terraform.d/credentials.tfrc.jsonDo you want to proceed? Only 'yes' will be accepted to confirm. Enter a value:
skopiuj
Odpowiedz na monit z potwierdzeniem za pomocą yes
.
aby uzyskać bardziej szczegółowe instrukcje dotyczące logowania, zobacz samouczek logowania.
„Przenieś plik stanu
po uwierzytelnieniu zaplecza remote
możesz przeprowadzić migrację lokalnego pliku stanu do chmury Terraform. Aby rozpocząć migrację, uruchom ponownie. Powoduje to, że Terraform rozpoznaje zmienioną konfigurację backendu.
$ terraform initInitializing the backend...Do you want to copy existing state to the new backend? Pre-existing state was found while migrating the previous "local" backend to the newly configured "remote" backend. No existing state was found in the newly configured "remote" backend. Do you want to copy this state to the new "remote" backend? Enter "yes" to copy and "no" to start with an empty state. Enter a value:
Kopiuj
podczas reinstalacji, Terraform wyświetla komunikat informujący, że skopiuje plik stanu do nowego zaplecza. Wpisz yes
, a Terraform przeniesie stan z twojej maszyny lokalnej do chmury Terraform.
„Skonfiguruj obszar roboczy w chmurze Terraform
po migracji stanu do chmury Terraform Zaloguj się do interfejsu sieci Web Terraform Cloud, znajdź nazwę obszaru roboczego zdefiniowaną w konfiguracji zaplecza i kliknij ją. Przejdź do zakładki „Stany” obszaru roboczego i zobacz pierwszą akcję w obszarze roboczym.
pamiętaj, że Twoja konfiguracja ma zmienną, którą musisz dodać do newworkspace. Kliknij kartę ” zmienne „w obszarze roboczym, a następnie”dodaj zmienną”.Wprowadź nazwę zmiennej, name_length
, jako klucz. Następnie wprowadź nową wartość, 5
i zapisz zmienną.
w przypadku rzeczywistych konfiguracji dodaj poświadczenia platformy w chmurze i inne zmienne konfiguracyjne do obszaru roboczego.
„Zainicjuj uruchomienie w nowym obszarze roboczym
po sprawdzeniu, czy stan został przeniesiony do obszaru roboczego chmury Terraform, Usuń lokalny plik stanu.
$ rm terraform.tfstate
Kopiuj
zastosuj nowe uruchomienie.
$ terraform apply
Kopiuj
Terraform będzie przesyłać logi z chmury Terraform i zapewni łącze do uruchomienia w interfejsie chmury Terraform. Ustawiasz nową wartość dla zmiennej name_length
, więc zasób zostanie zastąpiony przez jeden pasujący do nowych parametrów.
„Następne kroki
Zniszcz zasoby utworzone dla tego samouczka, klikając najpierw opcję” Ustawienia „w obszarze roboczym chmury Terraform, wybierając” Destruction andDeletion”, upewniając się, że pole wyboru” Zezwól na zniszczenie planów „jest zaznaczone, a następnie zaznaczając”Kolejkuj plan zniszczenia”.
po zniszczeniu zasobów wróć do strony „Destruction andDeletion” i kliknij „Usuń z chmury Terraform”, aby usunąć obszar roboczy.
w tym samouczku dokonano migracji pliku stanu z komputera lokalnego do obszaru roboczego chmury Terraform. Aby dowiedzieć się, jak migrować pliki stanu wielu lokalnych obszarów roboczych lub ograniczyć dostęp do obszaru roboczego do określonego zespołu, zapoznaj się z poniższą dokumentacją.
- migracja stanu z wielu lokalnych obszarów roboczych
- Zarządzanie dostępem do przestrzeni roboczej
jeśli masz dużą liczbę plików stanu, które chcesz przenieść do chmury Terraform, rozważ użycie w tym celu interfejsu API chmury Terraform. Aby uzyskać informacje na temat przesyłania wersji stanu za pomocą interfejsu API, zapoznaj się z dokumentacją interfejsu API wersji stanu.