add vault integration
parent
dda094f168
commit
2dc35d8c0b
@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#FFD814" d="M0 0l7.971 15.516L16 0H0zm6.732 6.16h-1.27V4.89h1.27v1.27zm0-1.906h-1.27V2.985h1.27v1.269zm1.904 3.81h-1.27v-1.27h1.27v1.27zm0-1.905h-1.27V4.89h1.27v1.27zm0-1.905h-1.27V2.985h1.27v1.269zm1.894 1.905H9.26V4.89h1.27v1.27zM9.26 4.254V2.985h1.27v1.269H9.26z"/></svg>
|
After Width: | Height: | Size: 506 B |
Binary file not shown.
After Width: | Height: | Size: 202 KiB |
@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
display_name: vault
|
||||||
|
description: Authenticates with Vault and injects secrets into the environment.
|
||||||
|
icon: ../.icons/vault.svg
|
||||||
|
maintainer_github: coder
|
||||||
|
verified: true
|
||||||
|
tags: [helper, integration, vault]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Hashicorp Vault
|
||||||
|
|
||||||
|
This module authenticates with Vault and injects secrets into the environment.
|
||||||
|
> **Note:** This module does not cover setting up and configuring Vault. For that, see the [Vault documentation](https://www.vaultproject.io/docs).
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "vault" {
|
||||||
|
source = "https://registry.coder.com/modules/vault"
|
||||||
|
vault_addr = "https://vault.example.com"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Configure Vault integration with a custom Vault auth id
|
||||||
|
|
||||||
|
See [docs](https://coder.com/docs/v2/latest/admin/external-auth) for more information what are external auth ids.
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "vault" {
|
||||||
|
source = "https://registry.coder.com/modules/vault"
|
||||||
|
vault_addr = "https://vault.example.com"
|
||||||
|
vault_auth_id = "my-auth-id"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Vault integration and automatically fetch secrets from Vault
|
||||||
|
|
||||||
|
Configure Vault integration and automatically fetch secrets from Vault and inject them into the workspace environment. This works by specifying the `secrets` variable with a list of secrets paths and keys to fetch from Vault. Multiple secrets can be specified by using a map of secret paths to a list of keys to fetch from each secret. For more information, see the [Vault documentation](https://www.vaultproject.io/api-docs/secret/kv/kv-v2#read-secret-version).
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
For more information, see the [Vault documentation](https://www.vaultproject.io/docs/secrets/kv/kv-v2).
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "vault" {
|
||||||
|
source = "https://registry.coder.com/modules/vault"
|
||||||
|
vault_addr = "https://vault.example.com"
|
||||||
|
secrets = {
|
||||||
|
"secret/data/foo" = ["FOO", "BAR"]
|
||||||
|
"secret/data/bar" = ["BAZ"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Vault integration and install a specific version of the Vault CLI
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "vault" {
|
||||||
|
source = "https://registry.coder.com/modules/vault"
|
||||||
|
vault_addr = "https://vault.example.com"
|
||||||
|
vault_cli_version = "1.15.0"
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,61 @@
|
|||||||
|
terraform {
|
||||||
|
required_version = ">= 1.0"
|
||||||
|
|
||||||
|
required_providers {
|
||||||
|
coder = {
|
||||||
|
source = "coder/coder"
|
||||||
|
version = ">= 0.12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add required variables for your modules and remove any unneeded variables
|
||||||
|
variable "agent_id" {
|
||||||
|
type = string
|
||||||
|
description = "The ID of a Coder agent."
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vault_addr" {
|
||||||
|
type = string
|
||||||
|
description = "The address of the Vault server."
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vault_auth_id" {
|
||||||
|
type = string
|
||||||
|
description = "The ID of the Vault auth method to use."
|
||||||
|
default = "vault"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "secrets" {
|
||||||
|
type = map(string)
|
||||||
|
description = "A map of secrets to set as environment variables."
|
||||||
|
default = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vault_cli_version" {
|
||||||
|
type = string
|
||||||
|
description = "The version of Vault to install."
|
||||||
|
default = "latest"
|
||||||
|
# validate the version is in the format 0.0.0 or latest
|
||||||
|
validation {
|
||||||
|
condition = can(regex("^(latest|[0-9]+\\.[0-9]+\\.[0-9]+)$", var.vault_version))
|
||||||
|
error_message = "Vault version must be in the format 0.0.0 or latest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "coder_script" "vault" {
|
||||||
|
agent_id = var.agent_id
|
||||||
|
display_name = "vault"
|
||||||
|
icon = "/icon/vault.svg"
|
||||||
|
script = templatefile("${path.module}/run.sh", {
|
||||||
|
VAULT_ADDR : var.vault_addr,
|
||||||
|
VAULT_TOKEN : data.coder_external_auth.vault.access_token,
|
||||||
|
VERSION : var.vault_cli_version,
|
||||||
|
SECRETS : jsonencode(var.secrets),
|
||||||
|
})
|
||||||
|
run_on_start = true
|
||||||
|
}
|
||||||
|
|
||||||
|
data "coder_external_auth" "vault" {
|
||||||
|
id = var.vault_auth_id
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
BOLD='\033[0;1m'
|
||||||
|
|
||||||
|
# Check if vault is installed
|
||||||
|
if ! command -v vault &> /dev/null; then
|
||||||
|
printf "$${BOLD}Installing vault CLI ...\n\n"
|
||||||
|
# check if wget is installed
|
||||||
|
if ! command -v wget &> /dev/null; then
|
||||||
|
printf "wget is not installed. Please install wget in your image.\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# check if unzip is installed
|
||||||
|
if ! command -v unzip &> /dev/null; then
|
||||||
|
printf "unzip is not installed. Please install unzip in your image.\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# check if VERSION is latest
|
||||||
|
if [ "${VERSION}" = "latest" ]; then
|
||||||
|
INSTALL_VERSION=$(curl -s https://releases.hashicorp.com/vault/ | grep -oP '[0-9]+\.[0-9]+\.[0-9]' | tr -d '<>' | head -1)
|
||||||
|
else
|
||||||
|
INSTALL_VERSION=${VERSION}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# download vault
|
||||||
|
wget -O vault.zip https://releases.hashicorp.com/vault/$${INSTALL_VERSION}/vault_$${INSTALL_VERSION}_linux_amd64.zip
|
||||||
|
unzip vault.zip
|
||||||
|
sudo mv vault /usr/local/bin
|
||||||
|
rm vault.zip
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "🥳 Installation comlete!\n\n"
|
||||||
|
|
||||||
|
# Set up Vault address and token
|
||||||
|
export VAULT_ADDR=${VAULT_ADDR}
|
||||||
|
export VAULT_TOKEN=${VAULT_TOKEN}
|
||||||
|
|
||||||
|
# Verify Vault address and token
|
||||||
|
printf "🔎 Verifying Vault address and token ...\n\n"
|
||||||
|
vault status
|
||||||
|
|
||||||
|
# Set secrets if $SECRETS is set
|
||||||
|
if [ -z "${SECRETS}" ]; then
|
||||||
|
printf "\n🔑 No secrets to set ...\n\n"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "\n🔑 Fetching secrets ...\n\n"
|
||||||
|
|
||||||
|
# Check if jq is installed
|
||||||
|
if ! command -v jq >/dev/null; then
|
||||||
|
echo "jq is not installed. Please install jq to automatically set the secrets."
|
||||||
|
exit 0 # exit with 0 to prevent failure (this is not a hard requirement, a user can still set the secrets manually)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Decode the JSON string to a temporary file
|
||||||
|
echo "$SECRETS" | jq '.' > temp.json
|
||||||
|
|
||||||
|
# Iterate through the keys and values in the JSON file
|
||||||
|
for key in $(jq -r 'keys[]' temp.json); do
|
||||||
|
path=$(echo $key | tr -d \")
|
||||||
|
# Fetch the secrets from Vault
|
||||||
|
secrets=$(vault kv get -format=json $path)
|
||||||
|
# Get the array of secret names from the JSON file
|
||||||
|
sceret_names=$(jq -r ".$key[]" temp.json)
|
||||||
|
# Convert the list of environment variables to an array
|
||||||
|
IFS=', ' read -r -a sceret_array <<< "$sceret_names"
|
||||||
|
# Set the environment variables with the secret values
|
||||||
|
for secret_name in "${sceret_array[@]}"; do
|
||||||
|
# Remove quotes from the variable name
|
||||||
|
secret_name=$(echo $secret_name | tr -d \")
|
||||||
|
# Assuming the secrets are stored in a key named 'data' in Vault
|
||||||
|
secret_value=$(echo $secrets | jq -r ".data.data.$secret_name")
|
||||||
|
export $secret_name=$secret_value
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
# Remove the temporary file
|
||||||
|
rm temp.json
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue