From 58de96ad47cc3fca79cfa2a082821c6de9530aeb Mon Sep 17 00:00:00 2001 From: Philipp Fedorov Date: Tue, 25 Jun 2024 20:02:13 +0300 Subject: [PATCH] Added OpenTofu & Updated README for it (#10) Co-authored-by: Filipp Fedorov --- .github/workflows/modules.yml | 2 +- .github/workflows/opentofu.yml | 16 +-- README.md | 123 +++++++++++++++--- modules/flavor/versions.tf | 1 - modules/floatingip/versions.tf | 1 - modules/image_datasource/versions.tf | 1 - modules/keypair/versions.tf | 1 - .../mks/k8s-cluster-standalone/versions.tf | 1 - modules/mks/k8s-cluster/versions.tf | 1 - modules/mks/k8s-nodegroup-gpu/versions.tf | 1 - modules/mks/k8s-nodegroup/versions.tf | 1 - modules/nat/versions.tf | 1 - modules/network/versions.tf | 1 - modules/os_project_with_user/versions.tf | 1 - modules/s3/s3-bucket/versions.tf | 1 - modules/s3/s3-credentials/versions.tf | 1 - modules/selectel-token/versions.tf | 1 - modules/sfs/versions.tf | 1 - modules/vm/versions.tf | 1 - modules/volume/versions.tf | 1 - versions.tf | 2 +- 21 files changed, 116 insertions(+), 44 deletions(-) diff --git a/.github/workflows/modules.yml b/.github/workflows/modules.yml index 23f9e38..c4196b3 100644 --- a/.github/workflows/modules.yml +++ b/.github/workflows/modules.yml @@ -27,7 +27,7 @@ jobs: - name: Setup Terraform uses: hashicorp/setup-terraform@v3.0.0 with: - terraform_version: "1.5.7" + terraform_version: "1.5.5" # - name: Run Checkov action # suppressed for now because it fails to copy a file inside a self-hosted runner # uses: bridgecrewio/checkov-action@v12 diff --git a/.github/workflows/opentofu.yml b/.github/workflows/opentofu.yml index 9d04428..f28d4bd 100644 --- a/.github/workflows/opentofu.yml +++ b/.github/workflows/opentofu.yml @@ -1,9 +1,8 @@ name: 'Test Opentofu Selectel Terraform modules' on: - push: - branches: - - opentofu-add + schedule: + - cron: '0 8 * * *' # run every day at 11:00 MSK workflow_dispatch: jobs: @@ -40,11 +39,8 @@ jobs: -backend-config="access_key=${{ secrets.S3_ACCESS_KEY }}" -backend-config="secret_key=${{ secrets.S3_SECRET_KEY }}" - - name: OpenTofu plan - run: tofu plan + - name: OpenTofu apply + run: tofu apply -auto-approve - # - name: OpenTofu apply - # run: tofu apply -auto-approve - - # - name: OpenTofu destroy - # run: tofu destroy -auto-approve \ No newline at end of file + - name: OpenTofu destroy + run: tofu destroy -auto-approve \ No newline at end of file diff --git a/README.md b/README.md index 9f82db5..b683f25 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,108 @@ # Selectel Terraform Modules Example -[![Test Selectel Terraform modules](https://github.com/selectel/selectel-infra-examples/actions/workflows/modules.yml/badge.svg)](https://github.com/selectel/selectel-infra-examples/actions/workflows/modules.yml) +| Pipeline Status | Version | +|-------|---------| +| [![Terraform - Selectel Terraform modules](https://github.com/selectel/selectel-infra-examples/actions/workflows/modules.yml/badge.svg)](https://github.com/selectel/selectel-infra-examples/actions/workflows/modules.yml) | [![version](https://img.shields.io/badge/terraform-1.5.5-green.svg)](https://github.com/hashicorp/terraform/releases/tag/v1.5.5) - Версия до BSL лицензии | +| [![OpenTofu - Selectel Terraform modules](https://github.com/selectel/selectel-infra-examples/actions/workflows/opentofu.yml/badge.svg)](https://github.com/selectel/selectel-infra-examples/actions/workflows/opentofu.yml) | [![version](https://img.shields.io/badge/opentofu-1.6.2-yellow.svg)](https://github.com/opentofu/opentofu/releases/tag/v1.6.2) | -Перед началом работы с облачными ресурсами Selectel через Terraform рекомендуем ознакомиться с [документацией по провайдеру Selectel/OpenStack](https://docs.selectel.ru/terraform/). +- [Selectel Terraform Modules Example](#selectel-terraform-modules-example) + - [Использование](#использование) + - [1. Terraformrc](#1-terraformrc) + - [2. State File](#2-state-file) + - [3. Init](#3-init) + - [Пример использования](#пример-использования) + - [Структура репозитория](#структура-репозитория) + - [Modules](#modules) -В [данном репозитории](https://github.com/selectel/selectel-infra-examples) находятся примеры Terraform модулей, используемых для создания инфраструктуры в облаке Selectel. +В [данном репозитории](https://github.com/selectel/selectel-infra-examples) находятся примеры Terraform модулей, используемых для создания инфраструктуры в облаке Selectel. С учетом нынешних реалий в репозитории Вы можете найти ежедневные пайплайны проверки создания ресурсов через **Terraform** и **OpenTofu**. -## Usage +**P.S.** Если Вы не нашли пример для создания определенного ресурса - Вы можете оставить issue и мы примем во внимание необходимость его добавления. -1. Перед использованием проверьте версию Terraform, данный репозиторий имеет ограничение на использование, по-причине хранения стейта в S3. +Перед началом работы с облачными ресурсами Selectel через Terraform/OpenTofu рекомендуем ознакомиться с [документацией по провайдеру Selectel/OpenStack](https://docs.selectel.ru/terraform/). + +> **ВАЖНО!** +> С версии репозитория >= 2.0.1 было добавлено тестирование запуска terraform кода через [OpenTofu](https://opentofu.org/). В связи с блокировкой terraform registry из РФ. Необходимость в terraform-proxy или terraform-mirror усложняет использование terraform. OpenTofu позволяет без проксей, зеркал и изменений в коде использовать все теже провайдеры, что лежат в registry.terraform.io. Все провайдеры OpenTofu лежат в репозитории - [ссылка](https://github.com/opentofu/registry/tree/main/providers). Так же документация по провайдерам от OpenTofu - [ссылка](https://opentofu.org/docs/language/providers/). + +## Использование + +> Далее все команды terraform-cli могут быть заменены на tofu. Будут работать оба варианта. +> +> Перед использованием **проверьте версию Terraform/OpenTofu**, данный репозиторий гарантирует запуск Terraform кода только на определенной версии Terraform/OpenTofu - [смотри в шапке README](#selectel-terraform-modules-example). +> +> Так же убедитесь, что в вашем env нет других переменных вида "OS_*" их наличие повлияет на провайдер Openstack! + +### 1. Terraformrc + +Для того чтобы у Вас не было проблем при использовании репозитория - были перенесены все используемые провайдеры в папку [providers](https://github.com/selectel/selectel-infra-examples/tree/main/providers). Чтобы заставить terraform cмотреть в эту папку потребуется создать файл `terraformrc`: ```bash -terraform { - backend "s3" {} - required_version = ">= 1.0.0, <= 1.5.7" +cat <> $HOME/.terraformrc +provider_installation { + filesystem_mirror { + path = "$GITHUB_WORKSPACE/providers" + include = ["registry.terraform.io/*/*"] + } } +EOS ``` -подробнее о проблеме можно ознакомиться на офф. странице [тут](https://developer.hashicorp.com/terraform/language/upgrade-guides). +### 2. State File -2. Инициализировать Terraform Backend +По-умолчанию в репозитории стейт хранится в `s3`. +**Для локального запуска** потребуется изменить на `local` в файле [versions.tf](https://github.com/selectel/selectel-infra-examples/blob/main/versions.tf#L12): -```bash +```tf +terraform { + backend "local" {} +} +``` + +
+Пример передачи `backend` для хранения стейта в S3 через CLI: + +```tf terraform init + -backend-config="bucket=< имя бакета s3 >" + -backend-config="endpoint=s3.ru-1.storage.selcloud.ru" + -backend-config="key=< имя стейт-файла >.tfstate" + -backend-config="region=ru-1" + -backend-config="skip_region_validation=true" + -backend-config="skip_credentials_validation=true" + -backend-config="access_key=< S3_ACCESS_KEY >" + -backend-config="secret_key=< secrets.S3_SECRET_KEY >" ``` +
-3. Создать файл `main.tf`, где описана необходимая инфраструктура (пример ниже - создание `Simple File Storage`) +
+Через tf файл: + +```tf +terraform { + backend "s3" { + bucket = "< имя бакета s3 >" + endpoint = "s3.ru-1.storage.selcloud.ru" + key = "< имя стейт-файла >.tfstate" + region = "ru-1" + access_key = "< S3_ACCESS_KEY >" + secret_key = "< secrets.S3_SECRET_KEY >" + + skip_region_validation = true + skip_credentials_validation = true + } +} +``` +
+ +### 3. Init + +Вы можете использовать все модули, которые есть в репозитории или закомментировать лишние, но учтите, что **в первую очередь создается проект с сервисным пользователем**, которые необходимы для провайдера `Openstack`. + +>Все, что будет создано ресурсами из провайдера `Openstack` должно идти после создания проекта и пользователя! Для этого потребуется добавить `depends_on` к ресурсу: +> ```tf +> depends_on = [ module.project-with-user ] +> ``` + +**Опционально:** Создаем файл `main.tf`, где описана необходимая инфраструктура (пример ниже - создание `Simple File Storage`, остальные примеры смотри в папке [modules](https://github.com/selectel/selectel-infra-examples/tree/main/modules)): ```yaml module "sfs" { @@ -38,15 +115,29 @@ module "sfs" { } ``` -4. Для проверки и применения настроек необходимо запустить команды `terraform plan/apply` +1. Инициализируем Terraform Backend командой: +> обрати внимание на настройку стейт-файла [выше](#1-state-file) + +```bash +terraform init +``` + +2. Для проверки вносимых изменений выполняем команду: ```bash terraform plan +``` + +3. Для применения изменений выполняем команду: + +```bash terraform apply ``` -## Example of usage +> `terraform apply -auto-approve` - для применения без подтверждения + +## Пример использования В репозитории можно найти пример использования модулей. В корне репозитория созданы `*.tf` файлы, которые можно использовать как пример вызова модулей. @@ -87,7 +178,9 @@ terraform plan/apply \ После успешного выполнения команды `terraform apply` вы должны увидеть в своём аккаунте новый проект, в котором будут запущены все модули (MKS, SFS, vm, CRaaS и др.) -## Repository structure +## Структура репозитория + +Репозиторий включает в себя минимально необходимую структура для запуска terraform. Самое интересное это папка [moduels](https://github.com/selectel/selectel-infra-examples/tree/main/modules) в которой собраны примеры запуска компонентов в облаке Selectel. ### Modules diff --git a/modules/flavor/versions.tf b/modules/flavor/versions.tf index 7c68433..16977d6 100644 --- a/modules/flavor/versions.tf +++ b/modules/flavor/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/floatingip/versions.tf b/modules/floatingip/versions.tf index 7c68433..16977d6 100644 --- a/modules/floatingip/versions.tf +++ b/modules/floatingip/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/image_datasource/versions.tf b/modules/image_datasource/versions.tf index 7c68433..16977d6 100644 --- a/modules/image_datasource/versions.tf +++ b/modules/image_datasource/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/keypair/versions.tf b/modules/keypair/versions.tf index 7c68433..16977d6 100644 --- a/modules/keypair/versions.tf +++ b/modules/keypair/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/mks/k8s-cluster-standalone/versions.tf b/modules/mks/k8s-cluster-standalone/versions.tf index c2c9c9b..7833b9a 100644 --- a/modules/mks/k8s-cluster-standalone/versions.tf +++ b/modules/mks/k8s-cluster-standalone/versions.tf @@ -9,5 +9,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/mks/k8s-cluster/versions.tf b/modules/mks/k8s-cluster/versions.tf index e1a9cb8..b77e5a3 100644 --- a/modules/mks/k8s-cluster/versions.tf +++ b/modules/mks/k8s-cluster/versions.tf @@ -5,5 +5,4 @@ terraform { version = ">=5.0.2" } } - required_version = ">= 1.5.0" } diff --git a/modules/mks/k8s-nodegroup-gpu/versions.tf b/modules/mks/k8s-nodegroup-gpu/versions.tf index e1a9cb8..b77e5a3 100644 --- a/modules/mks/k8s-nodegroup-gpu/versions.tf +++ b/modules/mks/k8s-nodegroup-gpu/versions.tf @@ -5,5 +5,4 @@ terraform { version = ">=5.0.2" } } - required_version = ">= 1.5.0" } diff --git a/modules/mks/k8s-nodegroup/versions.tf b/modules/mks/k8s-nodegroup/versions.tf index e1a9cb8..b77e5a3 100644 --- a/modules/mks/k8s-nodegroup/versions.tf +++ b/modules/mks/k8s-nodegroup/versions.tf @@ -5,5 +5,4 @@ terraform { version = ">=5.0.2" } } - required_version = ">= 1.5.0" } diff --git a/modules/nat/versions.tf b/modules/nat/versions.tf index 7c68433..16977d6 100644 --- a/modules/nat/versions.tf +++ b/modules/nat/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/network/versions.tf b/modules/network/versions.tf index 7c68433..16977d6 100644 --- a/modules/network/versions.tf +++ b/modules/network/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/os_project_with_user/versions.tf b/modules/os_project_with_user/versions.tf index 830e8e6..b264d11 100644 --- a/modules/os_project_with_user/versions.tf +++ b/modules/os_project_with_user/versions.tf @@ -9,5 +9,4 @@ terraform { version = ">= 3.3.2" } } - required_version = ">= 1.5.0" } diff --git a/modules/s3/s3-bucket/versions.tf b/modules/s3/s3-bucket/versions.tf index 982223b..8edc748 100644 --- a/modules/s3/s3-bucket/versions.tf +++ b/modules/s3/s3-bucket/versions.tf @@ -14,5 +14,4 @@ terraform { version = ">= 1.0.1" } } - required_version = ">= 1.5.0" } diff --git a/modules/s3/s3-credentials/versions.tf b/modules/s3/s3-credentials/versions.tf index 9d04c4d..b77e5a3 100644 --- a/modules/s3/s3-credentials/versions.tf +++ b/modules/s3/s3-credentials/versions.tf @@ -5,5 +5,4 @@ terraform { version = ">=5.0.2" } } - required_version = ">= 1.0.0" } diff --git a/modules/selectel-token/versions.tf b/modules/selectel-token/versions.tf index 68b5b88..584a78d 100644 --- a/modules/selectel-token/versions.tf +++ b/modules/selectel-token/versions.tf @@ -5,5 +5,4 @@ terraform { version = ">= 1.3.1" } } - required_version = ">= 1.0.0" } diff --git a/modules/sfs/versions.tf b/modules/sfs/versions.tf index 7c68433..16977d6 100644 --- a/modules/sfs/versions.tf +++ b/modules/sfs/versions.tf @@ -5,5 +5,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/vm/versions.tf b/modules/vm/versions.tf index c2c9c9b..7833b9a 100644 --- a/modules/vm/versions.tf +++ b/modules/vm/versions.tf @@ -9,5 +9,4 @@ terraform { version = "1.53.0" } } - required_version = ">= 1.5.0" } diff --git a/modules/volume/versions.tf b/modules/volume/versions.tf index 7d9ab32..bc9bd4f 100644 --- a/modules/volume/versions.tf +++ b/modules/volume/versions.tf @@ -9,5 +9,4 @@ terraform { version = ">= 3.3.2" } } - required_version = ">= 1.5.0" } diff --git a/versions.tf b/versions.tf index 164418a..995d05d 100644 --- a/versions.tf +++ b/versions.tf @@ -10,5 +10,5 @@ terraform { } } backend "s3" {} - required_version = ">= 1.0.0, <= 1.8.3" + required_version = ">= 1.0.0, <= 1.6.2" }