"""A Linode Python Pulumi program""" import pulumi import pulumi_linode import pulumi_command as command import pulumi_cloudflare as cloudflare import yaml from dotmap import DotMap config = DotMap(yaml.safe_load(open("input.yaml").read())) hostname = pulumi.Config().require("hostname") domainname = pulumi.Config().require("domainname") # Create a Linode resource (Linode Instance) instance = pulumi_linode.Instance(hostname, type=pulumi.Config().require("linodeType"), region=pulumi.Config().require("linodeRegion"), image=pulumi.Config().require("linodeImage"), label=hostname, root_pass=config.rootpassword, authorized_keys=config.sshkeys, opts=pulumi.ResourceOptions( custom_timeouts=pulumi.CustomTimeouts(create="2m") ) ) zone = cloudflare.get_zone(name=domainname) dnsrecord = cloudflare.Record(hostname, name=hostname, zone_id=zone.id, type="A", content=instance.ip_address, comment=f"Pulumi-generated linode" ) # Creating the inventory file inventory = command.local.Command("a-inventory", create = instance.ip_address.apply( lambda ipaddr: f"echo '{hostname} ansible_host={ipaddr} ansible_user=root hostname={hostname}.{domainname}' >./inventory" ), delete = "rm -f ./inventory", opts = pulumi.ResourceOptions(depends_on = [ instance ]) ) for playbook in config.playbooks: shortname = playbook.split('.')[0] # Applying the command command.local.Command(f"a-deploy-{shortname}", create = f"ansible-playbook {playbook}", delete = "rm -f ./ansible.log", opts = pulumi.ResourceOptions(depends_on = [ inventory ]) ) # Export the Instance label of the instance pulumi.export('ip_address', instance.ip_address)