commit 0da0cfd3f9b50f8afd0a201c4b91cbe9c8382a42 Author: B4D_US3R Date: Wed Dec 24 10:19:12 2025 +0500 Первая версия diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb2b5f7 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Factorio Terraform Beget + +Terraform-сценарий, создающий VPS-сервер в инфраструктуре Beget. Для запуска необходимо для начала создать файл `.auto.tfvars` с переменной `beget_token`, +в которой указан JWT-токен: +``` +beget_token = "eyJhbG...gQg" +``` +Создать его можно на странице https://developer.beget.com/#post-/v1/auth + +После этого запустить создание VPS-сервера с помощью команды: +``` +terraform apply +``` +Если используется [OpenTofu](https://opentofu.org/docs/intro/install/) (HashiCorp блокирует российские IP-адреса), то для запуска используется следующая команда: +``` +tofu apply +``` +Для удаления сервера используется команда `terraform destroy` или `tofu destroy` + +--- + +## Зависимости + +- [Terraform](https://developer.hashicorp.com/terraform/install) или [OpenTofu](https://opentofu.org/docs/intro/install/) +- [Ansible](https://docs.ansible.com/projects/ansible/latest/installation_guide/intro_installation.html#pipx-install) \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg new file mode 100755 index 0000000..d5a453f --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,7 @@ +[defaults] +remote_user=root +roles_path=./roles +host_key_checking = False + +[privilege_escalation] +become=True diff --git a/inventory/factorio.ini b/inventory/factorio.ini new file mode 100755 index 0000000..24c288a --- /dev/null +++ b/inventory/factorio.ini @@ -0,0 +1,2 @@ +[factorio] +your.server \ No newline at end of file diff --git a/main.tf b/main.tf new file mode 100755 index 0000000..fe02191 --- /dev/null +++ b/main.tf @@ -0,0 +1,52 @@ +terraform { + required_providers { + beget = { + source = "tf.beget.com/beget/beget" + } + } +} + +variable "beget_token" { + sensitive = true + type = string + description = "JWT токен для облачной инфраструктуры Beget" +} + +provider "beget" { + token = var.beget_token +} + +resource "beget_ssh_key" "devops" { + name = "Terraform key" + public_key = file("~/.ssh/id_rsa.pub") +} + +data "beget_software" "ubuntu" { + slug = "ubuntu-24-04" +} + +resource "beget_compute_instance" "test-server" { + name = "Test Server" + description = "Тестовый TF сервер" + hostname = "debian-test" + region = "ru1" + configuration = { + cpu = 1 + ram_mb = 1*1024 + disk_mb = 10 * 1024 + cpu_class = "normal_cpu" + } + image = { + software = { + id = data.beget_software.ubuntu.id + } + } + access = { + ssh_keys = [beget_ssh_key.devops.id] + } + + + provisioner "local-exec" { + command = "sleep 15; ansible-playbook -i '${self.ip_address},' --private-key ~/.ssh/id_rsa playbook.yml" + } +} diff --git a/playbook.yml b/playbook.yml new file mode 100755 index 0000000..0793b53 --- /dev/null +++ b/playbook.yml @@ -0,0 +1,8 @@ +--- +- name: Install Factorio + hosts: all + + roles: + - base + - docker + - factorio diff --git a/roles/base/tasks/main.yml b/roles/base/tasks/main.yml new file mode 100755 index 0000000..d0d9105 --- /dev/null +++ b/roles/base/tasks/main.yml @@ -0,0 +1,7 @@ +- name: Update cache + ansible.builtin.apt: + update_cache: true + +- name: Upgrade ubuntu + ansible.builtin.apt: + upgrade: "full" diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml new file mode 100755 index 0000000..57e9b2e --- /dev/null +++ b/roles/docker/tasks/main.yml @@ -0,0 +1,33 @@ +- name: Install ca-certificates and curl + ansible.builtin.apt: + package: + - ca-certificates + - curl + - python3-requests + +- name: Get keys + ansible.builtin.get_url: + dest: /etc/apt/keyrings/docker.asc + url: https://download.docker.com/linux/ubuntu/gpg + mode: 644 + +- name: Add docker repository + ansible.builtin.apt_repository: + repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable" + +- name: Install docker + ansible.builtin.apt: + package: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + +- name: SystemD enable docker + ansible.builtin.systemd_service: + name: docker + enabled: true + state: "started" + + diff --git a/roles/factorio/tasks/main.yml b/roles/factorio/tasks/main.yml new file mode 100755 index 0000000..c1168eb --- /dev/null +++ b/roles/factorio/tasks/main.yml @@ -0,0 +1,17 @@ +- name: Create /opt/beget/factorio + ansible.builtin.file: + path: /opt/beget/factorio/factorio_data + state: directory + mode: "700" + recurse: true + +- name: Copy template to server + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: /opt/beget/factorio/docker-compose.yml + mode: "600" + +- name: Start factorio server + community.docker.docker_compose_v2: + project_src: /opt/beget/factorio + state: present diff --git a/roles/factorio/templates/docker-compose.yml.j2 b/roles/factorio/templates/docker-compose.yml.j2 new file mode 100755 index 0000000..d422057 --- /dev/null +++ b/roles/factorio/templates/docker-compose.yml.j2 @@ -0,0 +1,13 @@ +version: "3.8" + +services: + factorio: + image: factoriotools/factorio:latest + restart: always + environment: + DLC_SPACE_AGE: "false" + ports: + - "34197:34197/udp" + - "27015:27015/tcp" + volumes: + - ./factorio_data:/factorio