#!/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 ]) )