/// <summary> /// Configures the global environment variables that describe the configuration /// of the server within the cluster. /// </summary> /// <param name="node">The server to be updated.</param> /// <param name="clusterDefinition">The cluster definition.</param> public static void ConfigureEnvironmentVariables(SshProxy <NodeDefinition> node, ClusterDefinition clusterDefinition) { node.Status = "environment variables"; // We're going to append the new variables to the existing Linux [/etc/environment] file. var sb = new StringBuilder(); // Append all of the existing environment variables except for those // whose names start with "NEON_" to make the operation idempotent. // // Note that we're going to special case PATH to add any Neon // related directories. using (var currentEnvironmentStream = new MemoryStream()) { node.Download("/etc/environment", currentEnvironmentStream); currentEnvironmentStream.Position = 0; using (var reader = new StreamReader(currentEnvironmentStream)) { foreach (var line in reader.Lines()) { if (line.StartsWith("PATH=")) { if (!line.Contains(KubeHostFolders.Bin)) { sb.AppendLine(line + $":/snap/bin:{KubeHostFolders.Bin}"); } else { sb.AppendLine(line); } } else if (!line.StartsWith("NEON_")) { sb.AppendLine(line); } } } } // Add the global cluster related environment variables. sb.AppendLine($"NEON_CLUSTER_PROVISIONER={clusterDefinition.Provisioner}"); sb.AppendLine($"NEON_CLUSTER={clusterDefinition.Name}"); sb.AppendLine($"NEON_DATACENTER={clusterDefinition.Datacenter.ToLowerInvariant()}"); sb.AppendLine($"NEON_ENVIRONMENT={clusterDefinition.Environment.ToString().ToLowerInvariant()}"); var sbPackageProxies = new StringBuilder(); foreach (var proxyEndpoint in clusterDefinition.PackageProxy.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { sbPackageProxies.AppendWithSeparator(proxyEndpoint); } sb.AppendLine($"NEON_PACKAGE_PROXY={sbPackageProxies}"); if (clusterDefinition.Hosting != null) { sb.AppendLine($"NEON_HOSTING={clusterDefinition.Hosting.Environment.ToMemberString().ToLowerInvariant()}"); } sb.AppendLine($"NEON_NODE_NAME={node.Name}"); if (node.Metadata != null) { sb.AppendLine($"NEON_NODE_ROLE={node.Metadata.Role}"); sb.AppendLine($"NEON_NODE_IP={node.Metadata.PrivateAddress}"); sb.AppendLine($"NEON_NODE_HDD={node.Metadata.Labels.StorageHDD.ToString().ToLowerInvariant()}"); } sb.AppendLine($"NEON_ARCHIVE_FOLDER={KubeHostFolders.Archive(KubeConst.SysAdminUser)}"); sb.AppendLine($"NEON_BIN_FOLDER={KubeHostFolders.Bin}"); sb.AppendLine($"NEON_CONFIG_FOLDER={KubeHostFolders.Config}"); sb.AppendLine($"NEON_EXEC_FOLDER={KubeHostFolders.Exec(KubeConst.SysAdminUser)}"); sb.AppendLine($"NEON_SETUP_FOLDER={KubeHostFolders.Setup}"); sb.AppendLine($"NEON_STATE_FOLDER={KubeHostFolders.State}"); sb.AppendLine($"NEON_TMPFS_FOLDER={KubeHostFolders.Tmpfs}"); // Kubernetes related variables for masters. if (node.Metadata.IsMaster) { sb.AppendLine($"KUBECONFIG=/etc/kubernetes/admin.conf"); } // Upload the new environment to the server. node.UploadText("/etc/environment", sb, tabStop: 4); }
/// <summary> /// Configures the global environment variables that describe the configuration /// of the server within the hive. /// </summary> /// <param name="node">The server to be updated.</param> /// <param name="hiveDefinition">The hive definition.</param> public static void ConfigureEnvironmentVariables(SshProxy <NodeDefinition> node, HiveDefinition hiveDefinition) { node.Status = "environment variables"; // We're going to append the new variables to the existing Linux [/etc/environment] file. var sb = new StringBuilder(); // Append all of the existing environment variables except for those // whose names start with "NEON_" to make the operation idempotent. // // Note that we're going to special case PATH to add any Neon // related directories. using (var currentEnvironmentStream = new MemoryStream()) { node.Download("/etc/environment", currentEnvironmentStream); currentEnvironmentStream.Position = 0; using (var reader = new StreamReader(currentEnvironmentStream)) { foreach (var line in reader.Lines()) { if (line.StartsWith("PATH=")) { if (!line.Contains(HiveHostFolders.Tools)) { sb.AppendLine(line + $":{HiveHostFolders.Tools}"); } else { sb.AppendLine(line); } } else if (!line.StartsWith("NEON_")) { sb.AppendLine(line); } } } } // Add the global neonHIVE related environment variables. sb.AppendLine($"NEON_HIVE_PROVISIONER={hiveDefinition.Provisioner}"); sb.AppendLine($"NEON_HIVE={hiveDefinition.Name}"); sb.AppendLine($"NEON_DATACENTER={hiveDefinition.Datacenter.ToLowerInvariant()}"); sb.AppendLine($"NEON_ENVIRONMENT={hiveDefinition.Environment.ToString().ToLowerInvariant()}"); if (hiveDefinition.Hosting != null) { sb.AppendLine($"NEON_HOSTING={hiveDefinition.Hosting.Environment.ToMemberString().ToLowerInvariant()}"); } sb.AppendLine($"NEON_NODE_NAME={node.Name}"); sb.AppendLine($"NEON_NODE_FS={hiveDefinition.HiveFS.Enabled.ToString().ToLowerInvariant()}"); if (node.Metadata != null) { sb.AppendLine($"NEON_NODE_ROLE={node.Metadata.Role}"); sb.AppendLine($"NEON_NODE_IP={node.Metadata.PrivateAddress}"); sb.AppendLine($"NEON_NODE_SSD={node.Metadata.Labels.StorageSSD.ToString().ToLowerInvariant()}"); sb.AppendLine($"NEON_NODE_SWAP={node.Metadata.Labels.ComputeSwap.ToString().ToLowerInvariant()}"); } var sbNameservers = new StringBuilder(); foreach (var nameServer in hiveDefinition.Network.Nameservers) { sbNameservers.AppendWithSeparator(nameServer, ","); } sb.AppendLine($"NEON_UPSTREAM_DNS=\"{sbNameservers}\""); sb.AppendLine($"NEON_APT_PROXY={HiveHelper.GetPackageProxyReferences(hiveDefinition)}"); sb.AppendLine($"NEON_ARCHIVE_FOLDER={HiveHostFolders.Archive}"); sb.AppendLine($"NEON_BIN_FOLDER={HiveHostFolders.Bin}"); sb.AppendLine($"NEON_CONFIG_FOLDER={HiveHostFolders.Config}"); sb.AppendLine($"NEON_EXEC_FOLDER={HiveHostFolders.Exec}"); sb.AppendLine($"NEON_SCRIPTS_FOLDER={HiveHostFolders.Scripts}"); sb.AppendLine($"NEON_SECRETS_FOLDER={HiveHostFolders.Secrets}"); sb.AppendLine($"NEON_SETUP_FOLDER={HiveHostFolders.Setup}"); sb.AppendLine($"NEON_SOURCE_FOLDER={HiveHostFolders.Source}"); sb.AppendLine($"NEON_STATE_FOLDER={HiveHostFolders.State}"); sb.AppendLine($"NEON_TMPFS_FOLDER={HiveHostFolders.Tmpfs}"); sb.AppendLine($"NEON_TOOLS_FOLDER={HiveHostFolders.Tools}"); // Append Consul and Vault addresses. // All nodes will be configured such that host processes using the HashiCorp Consul // CLI will access the Consul cluster via local Consul instance. This will be a // server for manager nodes and a proxy for workers and pets. if (hiveDefinition.Consul.Tls) { sb.AppendLine($"CONSUL_HTTP_SSL=true"); sb.AppendLine($"CONSUL_HTTP_ADDR=" + $"{hiveDefinition.Hostnames.Consul}:{hiveDefinition.Consul.Port}"); sb.AppendLine($"CONSUL_HTTP_FULLADDR=" + $"https://{hiveDefinition.Hostnames.Consul}:{hiveDefinition.Consul.Port}"); } else { sb.AppendLine($"CONSUL_HTTP_SSL=false"); sb.AppendLine($"CONSUL_HTTP_ADDR=" + $"{hiveDefinition.Hostnames.Consul}:{hiveDefinition.Consul.Port}"); sb.AppendLine($"CONSUL_HTTP_FULLADDR=" + $"http://{hiveDefinition.Hostnames.Consul}:{hiveDefinition.Consul.Port}"); } // All nodes will be configured such that host processes using the HashiCorp Vault // CLI will access the Vault cluster via the [neon-proxy-vault] proxy service // by default. sb.AppendLine($"VAULT_ADDR={hiveDefinition.VaultProxyUri}"); if (node.Metadata != null) { if (node.Metadata.IsManager) { // Manager hosts may use the [VAULT_DIRECT_ADDR] environment variable to // access Vault without going through the [neon-proxy-vault] proxy. This // points to the Vault instance running locally. // // This is useful when configuring Vault. sb.AppendLine($"VAULT_DIRECT_ADDR={hiveDefinition.GetVaultDirectUri(node.Name)}"); } else { sb.AppendLine($"VAULT_DIRECT_ADDR="); } } // Upload the new environment to the server. node.UploadText("/etc/environment", sb.ToString(), tabStop: 4); }