## title: My Terraform NeuVector provider
## date: "2023-06-04"
This project is used to manage NeuVector's configuration and
its most revelant resources. I was asked to automate the
configuration of the solution in a fairly specific context.
Initially, I had made a rather well-organized bash script
that could apply these resources, but not destroy them.
I then asked around and very quickly found Terraform. So I
learned how to use it and made a module that could manage
any NeuVector resource, including creation and destruction
only.
A huge problem was the token that NeuVector provides tends
to timeout quite quickly (300 seconds by default).
So I decided to create a Terraform provider to handle all
this cleanly. The language best suited for this is Go, so I
learned it. Hashicorp explains that it's best to separate
the client library from the provider.
/terraform_provider.png
(IMG) /terraform_provider.png
So I created a Go SDK for NeuVector before using it in the
provider.
Now the provider is able to fully manage the implemented
resources (create, delete, update and import).
## Use cases
The provider Terraform block looks like below.
terraform {
required_providers {
neuvector = {
source = "theobori/neuvector"
version = "0.4.1"
}
}
}
provider "neuvector" {
base_url = "https://127.0.0.1:10443/v1/"
username = "admin"
password = "admin"
}
Once it is declared in the configuration, you can start
using it as you want. Here's a Terraform example that could
be applied after installing NeuVector.
resource "neuvector_eula" "eula" {
accepted = true
}
resource "neuvector_registry" "registry_test" {
name = "docker.io"
registry_type = "Docker Registry"
filters = ["*"]
registry =
"https://registry.hub.docker.com/"
rescan_after_db_update = true
auth_with_token = false
scan_layers = true
}
resource "neuvector_group" "group_test" {
name = "mytestgroup"
criteria {
key = "pattern"
value = "[a-z]"
op = "regex"
}
criteria {
key = "namespace"
value = "example"
op = "="
}
}
data "neuvector_group_metadata" "group_metadata" {
name = neuvector_group.group_test.id
}
resource "neuvector_service_config" "service_config_test" {
services =
data.neuvector_group_services.group_metadata.services
not_scored = true
}
## Links
https://github.com/theobori/terraform-provider-neuvector
https://registry.terraform.io/providers/theobori/neuvector
(HTM) https://github.com/theobori/terraform-provider-neuvector
(HTM) https://registry.terraform.io/providers/theobori/neuvector