56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
"""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)
|