"""ProxmoxVE provider, Ansible powered with Python""" import pulumi import pulumi_proxmoxve as proxmox import pulumi_command as command from pvewrapper import PveWrapper import additional_config # Check pulumi configuration config = pulumi.Config() username = config.require("pveTokenName").split("!")[0] tokenname = config.require("pveTokenName").split("!")[1] pvehostname = config.require("pveHostname") pvenodename = config.require("pveNodeName") pveURL=f"https://{pvehostname}:8006/" verify = True if config.get_int("pveVerifySSL") == 1 else False pvedefaultstorage = config.require("pveDefaultStorage") vm_name: str = config.require("hostname") vm_username: str = config.require("cloudUsername") provider = proxmox.Provider(pvehostname, endpoint=pveURL, insecure=not verify, api_token=config.require_secret("pveTokenValue").apply(lambda x: f"{username}!{tokenname}={x}") ) pve = PveWrapper(pvehostname, username=username, token_name=tokenname, token_value=config.require_secret("pveTokenValue").apply(lambda v: f"{v}"), nodename=pvenodename, verify_ssl=verify ) vm = proxmox.vm.VirtualMachine(vm_name, name = vm_name, node_name = pvenodename, agent = proxmox.vm.VirtualMachineAgentArgs( enabled = True, trim = True, type = "virtio" ), cpu = proxmox.vm.VirtualMachineCpuArgs( cores = config.get_int("vmSockets"), sockets = config.get_int("vmCores") ), memory = proxmox.vm.VirtualMachineMemoryArgs(dedicated = config.get_int("vmRAM")), clone = proxmox.vm.VirtualMachineCloneArgs( node_name = pvenodename, vm_id = additional_config.os_to_template[config.require("vmTemplate")], full = False ), disks = [ proxmox.vm.VirtualMachineDiskArgs( interface = "virtio0", datastore_id = pvedefaultstorage, size = config.get_int("vmDiskSize"), file_format = "raw" ) ], network_devices = [ proxmox.vm.VirtualMachineNetworkDeviceArgs( bridge = "vmbr0", model = "virtio" ) ], operating_system = proxmox.vm.VirtualMachineOperatingSystemArgs( type = "l26" ), initialization = proxmox.vm.VirtualMachineInitializationArgs( type = "nocloud", datastore_id = pvedefaultstorage, user_account = proxmox.vm.VirtualMachineInitializationUserAccountArgs( username = vm_username, password = config.require_secret("cloudPassword"), keys = additional_config.sshkeys ) ), opts = pulumi.ResourceOptions( provider = provider, custom_timeouts=pulumi.CustomTimeouts(create="3m") ) ) ipv4_addresses = vm.vm_id.apply(lambda vm_id: pve.ipv4_addresses(f"{vm_id}")) # Creating the inventory file inventory = command.local.Command("a-inventory", create = vm.ipv4_addresses.apply(lambda ipaddr: f"echo '{vm_name} ansible_host={ipaddr[0]['ipv4_address']} ansible_user={vm_username}' >./inventory" ), delete = "rm -f ./inventory", opts = pulumi.ResourceOptions(depends_on = [ ipv4_addresses ]) ) # Applying the command for playbook in additional_config.playbooks: shortname: str = playbook.split(".")[0] command.local.Command(f"ap-{shortname}", create = vm.ipv4_addresses.apply( lambda run: f"ansible-playbook {run[0]['ipv4_address']}" ), delete = "rm -f ./ansible.log", opts = pulumi.ResourceOptions(depends_on = [ inventory ]) ) # Outputs pulumi.export("ipv4_addresses", vm.ipv4_addresses)