added pfsense provider for automating static ip setup
This commit is contained in:
+54
-13
@@ -1,18 +1,29 @@
|
||||
import * as pulumi from "@pulumi/pulumi";
|
||||
import * as proxmox from "@muhlba91/pulumi-proxmoxve";
|
||||
import * as tls from "@pulumi/tls";
|
||||
import * as pfsense from "@pulumi/pfsense";
|
||||
|
||||
const config = new pulumi.Config();
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Providers — one per standalone Proxmox machine
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const pve1Endpoint = config.requireSecret("pve1Endpoint");
|
||||
const pve1ApiToken = config.requireSecret("pve1ApiToken");
|
||||
const pve2Endpoint = config.requireSecret("pve2Endpoint");
|
||||
const pve2ApiToken = config.requireSecret("pve2ApiToken");
|
||||
|
||||
const pfSenseUrl = config.requireSecret("pfSenseUrl");
|
||||
const pfSenseUser = config.requireSecret("pfSenseUser");
|
||||
const pfSensePassword = config.requireSecret("pfSensePassword");
|
||||
|
||||
const master1Ip = config.requireSecret("master1Ip");
|
||||
const master2Ip = config.requireSecret("master2Ip");
|
||||
const worker1Ip = config.requireSecret("worker1Ip");
|
||||
const master3Ip = config.requireSecret("master3Ip");
|
||||
const worker2Ip = config.requireSecret("worker2Ip");
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Providers — one per standalone Proxmox machine
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const pveProvider = new proxmox.Provider("pve", {
|
||||
endpoint: pve1Endpoint,
|
||||
apiToken: pve1ApiToken,
|
||||
@@ -25,6 +36,17 @@ const pveBckpProvider = new proxmox.Provider("pve-bckp", {
|
||||
insecure: true,
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Providers — PfSense
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const pfSenseProvider = new pfsense.Provider("pfsense", {
|
||||
url: pfSenseUrl,
|
||||
username: pfSenseUser,
|
||||
password: pfSensePassword,
|
||||
tlsSkipVerify: true,
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// CI runner SSH keypair — generated once, stored in Pulumi state backend.
|
||||
// Public key goes into every VM; private key is exported for k8s-bootstrap.
|
||||
@@ -150,6 +172,7 @@ interface NodeConfig {
|
||||
provider: proxmox.Provider;
|
||||
template: proxmox.VmLegacy;
|
||||
diskDatastore: string;
|
||||
ip: pulumi.Output<string>;
|
||||
}
|
||||
|
||||
const nodeConfigs: NodeConfig[] = [
|
||||
@@ -160,6 +183,7 @@ const nodeConfigs: NodeConfig[] = [
|
||||
provider: pveProvider,
|
||||
template: pveTemplate,
|
||||
diskDatastore: "local-lvm",
|
||||
ip: master1Ip,
|
||||
},
|
||||
{
|
||||
name: "k3s-master-2",
|
||||
@@ -168,6 +192,7 @@ const nodeConfigs: NodeConfig[] = [
|
||||
provider: pveProvider,
|
||||
template: pveTemplate,
|
||||
diskDatastore: "local-lvm",
|
||||
ip: master2Ip,
|
||||
},
|
||||
{
|
||||
name: "k3s-worker-1",
|
||||
@@ -176,6 +201,7 @@ const nodeConfigs: NodeConfig[] = [
|
||||
provider: pveProvider,
|
||||
template: pveTemplate,
|
||||
diskDatastore: "local-lvm",
|
||||
ip: worker1Ip,
|
||||
},
|
||||
{
|
||||
name: "k3s-master-3",
|
||||
@@ -184,6 +210,7 @@ const nodeConfigs: NodeConfig[] = [
|
||||
provider: pveBckpProvider,
|
||||
template: pveBckpTemplate,
|
||||
diskDatastore: "local",
|
||||
ip: master3Ip,
|
||||
},
|
||||
{
|
||||
name: "k3s-worker-2",
|
||||
@@ -192,6 +219,7 @@ const nodeConfigs: NodeConfig[] = [
|
||||
provider: pveBckpProvider,
|
||||
template: pveBckpTemplate,
|
||||
diskDatastore: "local",
|
||||
ip: worker2Ip,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -235,9 +263,9 @@ const k3sVms = nodeConfigs.map(
|
||||
username: "ubuntu",
|
||||
password: k3sVmPassword,
|
||||
keys: [
|
||||
sshPvePublicKey.apply((k) => k.trim()),
|
||||
ciRunnerKey.publicKeyOpenssh.apply((k) => k.trim()),
|
||||
],
|
||||
sshPvePublicKey.apply((k) => k.trim()),
|
||||
ciRunnerKey.publicKeyOpenssh.apply((k) => k.trim()),
|
||||
],
|
||||
},
|
||||
},
|
||||
networkDevices: [{ bridge: "vmbr0", model: "virtio" }],
|
||||
@@ -256,12 +284,22 @@ const k3sVms = nodeConfigs.map(
|
||||
),
|
||||
);
|
||||
|
||||
export const clusterInfo = k3sVms.map((vm, index) => ({
|
||||
nodeName: vm.nodeName,
|
||||
vmId: vm.vmId,
|
||||
name: nodeConfigs[index].name,
|
||||
role: nodeConfigs[index].role,
|
||||
}));
|
||||
k3sVms.forEach((vmResource, i) => {
|
||||
const assignedMac = vmResource.networkDevices.apply(
|
||||
(nic) => nic[0].macAddress,
|
||||
);
|
||||
|
||||
return new pfsense.Dhcpv4Staticmapping(
|
||||
`${nodeConfigs[i].name}-dhcp`,
|
||||
{
|
||||
interface: "lan",
|
||||
macAddress: assignedMac,
|
||||
ipAddress: nodeConfigs[i].ip,
|
||||
hostname: nodeConfigs[i].name,
|
||||
},
|
||||
{ dependsOn: vmResource, provider: pfSenseProvider },
|
||||
);
|
||||
});
|
||||
|
||||
// Individual vmId exports — used by k8s-bootstrap to start VMs.
|
||||
// Order matches nodeConfigs: master-1, master-2, worker-1, master-3, worker-2.
|
||||
@@ -278,3 +316,6 @@ export const ciRunnerPrivateKey = pulumi.secret(ciRunnerKey.privateKeyOpenssh);
|
||||
|
||||
// Proxmox API credentials — consumed by k8s-bootstrap via StackReference.
|
||||
export { pve1Endpoint, pve1ApiToken, pve2Endpoint, pve2ApiToken };
|
||||
|
||||
//k3s instance ips consumed by k8s-bootstrap.
|
||||
export { master1Ip, master2Ip, worker1Ip, master3Ip, worker2Ip };
|
||||
|
||||
Reference in New Issue
Block a user