diff --git a/terraform/main.tf b/terraform/main.tf index bc6723f..3c54a14 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -1,97 +1,101 @@ -terraform { - required_providers { - vsphere = { - source = "hashicorp/vsphere" - version = "~> 2.4" - } - } -} +--- +# 1. Валидация и добавление хоста +- name: Validate input and add host dynamically + hosts: localhost + gather_facts: no + tasks: + - name: Check if vm_ip is provided + fail: + msg: "ERROR: VM IP address is required!" + when: vm_ip is not defined or vm_ip == "" -# --- Креды vCenter (передаются скрыто через Environment) --- -variable "vsphere_user" {} -variable "vsphere_password" {} -variable "vsphere_server" {} + - name: Check if ansible_user is provided + fail: + msg: "ERROR: ansible_user is required!" + when: ansible_user is not defined or ansible_user == "" -# --- Переменные, которые будут запрашиваться через Survey --- -variable "vm_ip" {} -variable "vm_gateway" {} -variable "vm_cpu" {} -variable "vm_ram" {} -variable "vm_disk_size" {} -variable "vsphere_datacenter" {} -variable "vsphere_datastore" {} -variable "vsphere_pool" {} -variable "vsphere_network" {} -variable "vsphere_template" { default = "debian13-template" } + - name: Display target information + debug: + msg: | + ======================================== + Target Configuration: + - IP Address: {{ vm_ip }} + - SSH User: {{ ansible_user }} + ======================================== -# --- Настройка провайдера --- -provider "vsphere" { - user = var.vsphere_user - password = var.vsphere_password - vsphere_server = var.vsphere_server - allow_unverified_ssl = true -} + - name: Add new VM to inventory with authentication + add_host: + name: "{{ vm_ip }}" + groups: npm_servers + ansible_user: "{{ ansible_user }}" + ansible_ssh_common_args: '-o StrictHostKeyChecking=no' + # Добавляем аутентификацию - выберите ОДИН из вариантов ниже: -# --- Поиск ресурсов в vCenter --- -data "vsphere_datacenter" "dc" { - name = var.vsphere_datacenter -} + # Вариант 1: Использовать пароль + ansible_ssh_pass: "{{ ansible_password | default('') }}" + ansible_become_pass: "{{ ansible_password | default('') }}" + + # Вариант 2: Использовать SSH ключ (раскомментируйте и закомментируйте вариант 1) + # ansible_ssh_private_key_file: "{{ ssh_key_path | default('~/.ssh/id_rsa') }}" -data "vsphere_datastore" "datastore" { - name = var.vsphere_datastore - datacenter_id = data.vsphere_datacenter.dc.id -} +# 2. Основная настройка NPM +- name: Setup Minimal Linux with Docker and Nginx Proxy Manager + hosts: npm_servers + become: yes + gather_facts: yes + tasks: + - name: Update apt cache and install prerequisites + apt: + name: ['apt-transport-https', 'ca-certificates', 'curl', 'gnupg', 'lsb-release'] + state: present + update_cache: yes -data "vsphere_resource_pool" "pool" { - name = var.vsphere_pool - datacenter_id = data.vsphere_datacenter.dc.id -} + - name: Add Docker GPG apt Key + apt_key: + url: https://download.docker.com/linux/debian/gpg + state: present -data "vsphere_network" "network" { - name = var.vsphere_network - datacenter_id = data.vsphere_datacenter.dc.id -} + - name: Add Docker Repository + apt_repository: + repo: "deb [arch=amd64] https://download.docker.com/linux/debian {{ ansible_distribution_release }} stable" + state: present -data "vsphere_virtual_machine" "template" { - name = var.vsphere_template - datacenter_id = data.vsphere_datacenter.dc.id -} + - name: Install Docker and Docker Compose Plugin + apt: + name: ['docker-ce', 'docker-ce-cli', 'containerd.io', 'docker-compose-plugin'] + state: present + update_cache: yes -# --- Создание ВМ --- -resource "vsphere_virtual_machine" "npm_vm" { - name = "npm-${replace(var.vm_ip, ".", "-")}" # Имя в vCenter будет, например: npm-192-168-1-50 - resource_pool_id = data.vsphere_resource_pool.pool.id - datastore_id = data.vsphere_datastore.datastore.id + - name: Ensure Docker service is running and enabled + systemd: + name: docker + state: started + enabled: yes - num_cpus = var.vm_cpu - memory = var.vm_ram - guest_id = data.vsphere_virtual_machine.template.guest_id + - name: Create directory for Nginx Proxy Manager + file: + path: /opt/npm + state: directory + mode: '0755' - network_interface { - network_id = data.vsphere_network.network.id - adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0] - } + - name: Create docker-compose.yml for NPM + copy: + dest: /opt/npm/docker-compose.yml + content: | + version: '3.8' + services: + app: + image: 'jc21/nginx-proxy-manager:latest' + restart: unless-stopped + ports: + - '80:80' + - '81:81' + - '443:443' + volumes: + - ./data:/data + - ./letsencrypt:/etc/letsencrypt - disk { - label = "disk0" - size = var.vm_disk_size - thin_provisioned = true - } - - clone { - template_uuid = data.vsphere_virtual_machine.template.id - - customize { - linux_options { - host_name = "npm-server" - domain = "local" - } - network_interface { - ipv4_address = var.vm_ip - ipv4_netmask = 23 # При необходимости маску тоже можно вынести в Survey - } - ipv4_gateway = var.vm_gateway - dns_server_list = ["192.168.1.1", "1.1.1.1"] - } - } -} \ No newline at end of file + - name: Run Nginx Proxy Manager via Docker Compose + community.docker.docker_compose_v2: + project_src: /opt/npm + state: present \ No newline at end of file