【Terraform】Быстрая практика "Hello World"

CI/CD облачные вычисления
【Terraform】Быстрая практика "Hello World"

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Эта статья также участвует"Проект "Звезда раскопок"", чтобы выиграть творческие подарочные пакеты и бросить вызов творческим поощрениям.

Столбец был кратко представлен вышеTerraformКак и его установка, эта статья основана на учебных пособиях сообщества, написанииDockerзапускатьnginxпример.

1. Подготовка окружающей среды

Терраформ и Докер

Перед официальным запуском примера мы должны убедиться, что среда установлена.Terraform,docker, первое относится к предыдущей статье внутри столбца,dockerДля установки обратитесь к этой статье "Статья TODO".

ProviderКонфигурация кеша плагина

существуетTerraformВо всем процессе выполнения мы используемTerraform initкоманда, инструмент проанализирует код, используемый в нашем кодеProviderи попробуй скачатьProviderПлагин локальный, если не делать особых настроек, каждое выполнениеinitПопытаюсь загрузить плагины, и каждый проект сохранит свой собственный независимый плагин, что является пустой тратой места. Что с этим делать?

В этот момент мы можем использоватькеш плагина, Основной принцип заключается в том, что до тех пор, пока плагин успешно загружен один раз, он будет сохранен в указанном каталоге кеша плагинов, а другие проекты будут загружены снова, а кэшированное содержимое будет скопировано в каталог проекта, даже в системе. служба поддержки,TerraformЭтот путь кеша также имеет символическую ссылку, и содержимое плагина не копируется напрямую.

Есть два способа, первый способ - настроитьTF_PLUGIN_CACHE_DIRПеременные среды:

#务必确保这个目录下已经创建好plugin-cache这个文件夹
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

Второй способ заключается в использованииCLIконфигурационный файл, основанный наLinuxсреде, в среде пользователя/homeСоздайте каталог с именем".terraformrc"документ:

plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"

Следует отметить, что необходимо обращать внимание на увеличение пространства пути кэша, и выборочно вручную очищать ненужныеProviderплагин.

2. Настоящий бой

Цель этой практики состоит в том, чтобыTerraformРазвертывание на основе DockerNginxсреде и может успешно получить доступ кNginxприветственная домашняя страница.

2.1 Определение ресурсов

Здесь мы используемGithubпредметы на

[терраформ-провайдер-докер]  GitHub.com/KR EU в качестве гостя…

который предоставилProviderПлагины, запись файлов ресурсовmain.tf.

terraform {
#定义所需的Provider
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}
​
# 配置docker provider
provider "docker" {}
​
#创建一个docker镜像资源
 resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}
#创建一个docker容器资源
#这部分的资源定义,类似"docker run --name nginx -p8080:80 -d nginx:latest"
resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}
#接下来还可以继续定义服务资源

2.2 Выполнение создания

Ресурсы об инфраструктуре определены, и следующим шагом является установкаTerraformиdockerРазвернуть на сервере.

Во-первых, чтобы различать проекты и достичь цели изоляции ресурсов, мы сначала создаем новую папку в каталоге проекта:

#创建目录
$mkdir learn-terraform-docker-container
#进入目录
$cd learn-terraform-docker-container

затем загрузитеmain.tfв текущую папку. Затем выполните в текущем каталогеTerraform initИнициализировать среду.

$Terraform init

Советы: время, затраченное на начальный процесс среды, будет тесно связано с сетевой средой вашего сервера, терпеливо подождите, если это не удается, попробуйте еще несколько раз!

图片.png

Как показано на рисунке, среда успешно инициализирована.Обратите внимание на локальный каталог, и есть еще несколько файлов и папок.

图片.png .terraformСкрытые папки хранят наши загрузкиProviderсодержимое плагина,.terraform.lock.hclзаписаноproviderНекоторая информация о зависимости для плагина. Если вы войдете в каталог плагинов кеша, который мы установили ранее, будет больше содержимого этого плагина.

Далее мы предварительно просматриваем развертывание ресурсов.terraform plan.

$terraform plan

Результат выполнения выглядит следующим образом:

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
​
Terraform will perform the following actions:
​
  # docker_container.nginx will be created
  + resource "docker_container" "nginx" {
      + attach           = false
      + bridge           = (known after apply)
      + command          = (known after apply)
      + container_logs   = (known after apply)
      + entrypoint       = (known after apply)
      + env              = (known after apply)
      + exit_code        = (known after apply)
      + gateway          = (known after apply)
      + hostname         = (known after apply)
      + id               = (known after apply)
      + image            = (known after apply)
      + init             = (known after apply)
      + ip_address       = (known after apply)
      + ip_prefix_length = (known after apply)
      + ipc_mode         = (known after apply)
      + log_driver       = "json-file"
      + logs             = false
      + must_run         = true
      + name             = "tutorial"
      + network_data     = (known after apply)
      + read_only        = false
      + remove_volumes   = true
      + restart          = "no"
      + rm               = false
      + security_opts    = (known after apply)
      + shm_size         = (known after apply)
      + start            = true
      + stdin_open       = false
      + tty              = false
​
      + healthcheck {
          + interval     = (known after apply)
          + retries      = (known after apply)
          + start_period = (known after apply)
          + test         = (known after apply)
          + timeout      = (known after apply)
        }
​
      + labels {
          + label = (known after apply)
          + value = (known after apply)
        }
​
      + ports {
          + external = 8000
          + internal = 80
          + ip       = "0.0.0.0"
          + protocol = "tcp"
        }
    }
​
  # docker_image.nginx will be created
  + resource "docker_image" "nginx" {
      + id           = (known after apply)
      + keep_locally = false
      + latest       = (known after apply)
      + name         = "nginx:latest"
      + output       = (known after apply)
      + repo_digest  = (known after apply)
    }
​
Plan: 2 to add, 0 to change, 0 to destroy.

Согласно выходному содержимому, вы можете видеть, что были добавлены два ресурса, включая изображения и контейнеры. Без изменений и уничтожения предметов.

Затем выполните ресурс развертыванияterraform apply.

$terraform apply

Результат выполнения выглядит следующим образом:

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
​
Terraform will perform the following actions:
​
  # docker_container.nginx will be created
  + resource "docker_container" "nginx" {
      + attach           = false
      + bridge           = (known after apply)
      + command          = (known after apply)
      + container_logs   = (known after apply)
      + entrypoint       = (known after apply)
      + env              = (known after apply)
      + exit_code        = (known after apply)
      + gateway          = (known after apply)
      + hostname         = (known after apply)
      + id               = (known after apply)
      + image            = (known after apply)
      + init             = (known after apply)
      + ip_address       = (known after apply)
      + ip_prefix_length = (known after apply)
      + ipc_mode         = (known after apply)
      + log_driver       = "json-file"
      + logs             = false
      + must_run         = true
      + name             = "tutorial"
      + network_data     = (known after apply)
      + read_only        = false
      + remove_volumes   = true
      + restart          = "no"
      + rm               = false
      + security_opts    = (known after apply)
      + shm_size         = (known after apply)
      + start            = true
      + stdin_open       = false
      + tty              = false
​
      + healthcheck {
          + interval     = (known after apply)
          + retries      = (known after apply)
          + start_period = (known after apply)
          + test         = (known after apply)
          + timeout      = (known after apply)
        }
​
      + labels {
          + label = (known after apply)
          + value = (known after apply)
        }
​
      + ports {
          + external = 8000
          + internal = 80
          + ip       = "0.0.0.0"
          + protocol = "tcp"
        }
    }
​
  # docker_image.nginx will be created
  + resource "docker_image" "nginx" {
      + id           = (known after apply)
      + keep_locally = false
      + latest       = (known after apply)
      + name         = "nginx:latest"
      + output       = (known after apply)
      + repo_digest  = (known after apply)
    }
​
Plan: 2 to add, 0 to change, 0 to destroy.
​
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.
​
  Enter a value:yes
​

входитьyesЯвно для выполнения развертывания.

图片.png

Развертывание завершено! Ошибок не возникло.

Затем проверьте, был ли создан контейнер докеров.nginx.

$docker ps

图片.png

Да, создание успешно, и тогдаcurlПосетите, чтобы получить приветственную домашнюю страницу тоже!

图片.png

Пока что деплоймент создан успешно, наблюдаем каталог проекта, там есть еще одинterraform.tfstateфайл, это файл состояния, это очень важно, не пытайтесь изменить его вручную!

2.3 Выполнить уничтожение

Выполнить уничтожение довольно просто, выполните его в каталоге проектаterraform destroyкоманда сделает.

$terraform destroy