diff --git a/vm-ansible/Pulumi.yaml b/vm-ansible/Pulumi.yaml index f5f7dc9..a73633e 100644 --- a/vm-ansible/Pulumi.yaml +++ b/vm-ansible/Pulumi.yaml @@ -7,8 +7,8 @@ template: config: libvirt:uri: type: String - default: "qemu:///system" - description: "QEMU service path" + default: qemu:///system + description: QEMU service path hostname: type: String default: ${PROJECT} @@ -16,19 +16,19 @@ template: image: type: String default: bookworm - description: Image name (see additional_configs.py) + description: Image name vcpu: type: Integer default: 1 - description: Number of vCPU of the VM + description: Virtual Machine vCPU number ram: type: Integer default: 2048 - description: MBs of RAM of the VM + description: RAM (MB) disksize: type: Integer default: 20 - description: GBs of disk space of the VM + description: Disk space (GB) poolpath: type: String default: /var/tmp/libvirt/pulumi @@ -36,12 +36,12 @@ template: username: type: String default: syntaxerrormmm - description: Username to create in the cloud-init phase + description: Virtual machine username password: type: String default: cicciopasticcio - description: Password of the username in the cloud-init phase + description: Virtual Machine password playbooks: type: String default: '' - description: "Additional playbooks to implement, separate by commas." + description: Other playbooks (multi with commas) diff --git a/vm-ansible/__main__.py b/vm-ansible/__main__.py index ea7ccb7..c4ca2bd 100644 --- a/vm-ansible/__main__.py +++ b/vm-ansible/__main__.py @@ -6,7 +6,7 @@ import pulumi_command as command import pulumiverse_time as time import additional_configs as add from jinja2 import Template -from passlib.hash import sha512_crypt +import ansible config = pulumi.Config() @@ -66,27 +66,8 @@ wait_time = time.Sleep("wait_time", create_duration="30s", opts = pulumi.ResourceOptions(depends_on = [ vm ]) ) -# Creating the inventory file -inventory = command.local.Command("a-inventory", - create = vm.network_interfaces[0]['addresses'][0].apply( - lambda ipaddr: f"echo '{env['name']} ansible_host={ipaddr} ansible_user={env['username']}' >./inventory" - ), - delete = "rm -f ./inventory", - opts = pulumi.ResourceOptions(depends_on = [ wait_time ]) -) - -deploy = command.local.Command('ap deploy', - create = 'ansible-playbook deploy.yml', - delete = 'rm -f ./ansible.log', - opts = pulumi.ResourceOptions(depends_on = [ inventory ]) -) - -# Running additional playbooks -for playbook in sorted(config.get('playbooks').split(',')): - execute_ansible = command.local.Command(f"ap {playbook.split('.')[0]}", - create = f"ansible-playbook {playbook}", - delete = "rm -f ./ansible.log", - opts = pulumi.ResourceOptions(depends_on = [ deploy ]) - ) +adeploy = ansible.AnsibleDeployment(vm, env, config.get('playbooks')) +adeploy.create_inventory([ wait_time ]) +adeploy.run_playbooks() pulumi.export("ip", vm.network_interfaces[0]['addresses'][0]) diff --git a/vm-ansible/ansible.py b/vm-ansible/ansible.py new file mode 100644 index 0000000..1af8c92 --- /dev/null +++ b/vm-ansible/ansible.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +# encoding: utf-8 + +import pulumi +from pulumi_command.local import Command + +class AnsibleDeployment(): + + def __init__(self, virtual_machine, environment, additionals = None, deploy = None): + """Creates an ansible deployment and attaches resources.""" + + self.inventory = 'inventory' + self.virtual_machine = virtual_machine + self.environment = environment + self.deploy = str(deploy) or 'deploy.yml' + self.additionals = str(additionals) or '' + + def create_inventory(self, dependencies = []): + """Returns a basic inventory from a virtual_machine object.""" + deps = [] + if len(dependencies) == 0: + deps.append(self.virtual_machine) + else: + deps.extend(dependencies) + + self.inventory = Command("a inventory", + create = self.virtual_machine.network_interfaces[0]['addresses'][0].apply( + lambda ipaddr: f"echo '{self.environment['name']} ansible_host={ipaddr} ansible_user={self.environment['username']}' >./inventory" + ), + delete = "rm -f ./inventory", + opts = pulumi.ResourceOptions(depends_on = dependencies) + ) + + def run_playbooks(self): + """Execute the rest of the playbooks.""" + + self.deploy_resource = Command("ap deploy", + create = "ansible-playbook deploy.yml", + delete = "rm -f ansible.log", + opts = pulumi.ResourceOptions(depends_on = [ self.inventory ]) + ) + + # Running additionals if present + if len(self.additionals) != 0: + + for playbook in sorted(self.additionals.split(',')): + name = playbook.split('.')[0] + Command(f"ap {name}", + create = f"ansible-playbook {playbook}", + delete = "rm -f ansible.log", + opts = pulumi.ResourceOptions(depends_on = [ self.inventory, self.deploy_resource ]) + ) + + + + + + +